drm/panfrost: Fix scheduler workqueue bug
Subsystems (4)
PATCH 1/1 drm/panfrost: Fix scheduler workqueue bug
When the GPU scheduler was ported to using a struct for its initialization parameters, it was overlooked that panfrost creates a distinct workqueue for timeout handling.
The pointer to this new workqueue is not initialized to the struct, resulting in NULL being passed to the scheduler, which then uses the system_wq for timeout handling.
Set the correct workqueue to the init args struct.
--- drivers/gpu/drm/panfrost/panfrost_job.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/panfrost/panfrost_job.c +1 -1
@@ -841,7 +841,6 @@ int panfrost_job_init(struct panfrost_device *pfdev) .num_rqs = DRM_SCHED_PRIORITY_COUNT, .credit_limit = 2, .timeout = msecs_to_jiffies(JOB_TIMEOUT_MS), - .timeout_wq = pfdev->reset.wq, .name = "pan_js", .dev = pfdev->dev, };
@@ -879,6 +878,7 @@ int panfrost_job_init(struct panfrost_device *pfdev) pfdev->reset.wq =alloc_ordered_workqueue ("panfrost-reset" ,0 );if (!pfdev->reset.wq)return -ENOMEM ; + args.timeout_wq = pfdev->reset.wq;for (j =0 ; j <NUM_JOB_SLOTS ; j++) { js->queue[j].fence_context =dma_fence_context_alloc (1 );
Signature · 1 line
2.49.0
Quoted 32 lines · Philipp Stanner
When the GPU scheduler was ported to using a struct for its initialization parameters, it was overlooked that panfrost creates a distinct workqueue for timeout handling.
The pointer to this new workqueue is not initialized to the struct, resulting in NULL being passed to the scheduler, which then uses the
system_wqfor timeout handling.Set the correct workqueue to the init args struct.
Cc [email protected] # 6.15+Fixes 796a9f55a8d1 ("drm/sched: Use struct for drm_sched_init() params")Reported-by Tvrtko Ursulin <[email protected]>Signed-off-by Philipp Stanner <[email protected]>--- drivers/gpu/drm/panfrost/panfrost_job.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/gpu/drm/panfrost/panfrost_job.c +0
-1@@ -841,7 +841,6 @@ int panfrost_job_init(struct panfrost_device *pfdev) .num_rqs = DRM_SCHED_PRIORITY_COUNT, .credit_limit = 2, .timeout = msecs_to_jiffies(JOB_TIMEOUT_MS), - .timeout_wq = pfdev->reset.wq, .name = "pan_js", .dev = pfdev->dev, };
drivers/gpu/drm/panfrost/panfrost_job.c int panfrost_job_init(struct panfrost_device *pfdev) · line 884
Quoted 7 lines
drivers/gpu/drm/panfrost/panfrost_job.c +1
-0@@ -879,6 +878,7 @@ int panfrost_job_init(struct panfrost_device *pfdev) pfdev->reset.wq =alloc_ordered_workqueue ("panfrost-reset" ,0 );if (!pfdev->reset.wq)return -ENOMEM ; + args.timeout_wq = pfdev->reset.wq;for (j =0 ; j <NUM_JOB_SLOTS ; j++) { js->queue[j].fence_context =dma_fence_context_alloc (1 );
Regards,
Tvrtko
Quoted 8 lines · Philipp Stanner
When the GPU scheduler was ported to using a struct for its initialization parameters, it was overlooked that panfrost creates a distinct workqueue for timeout handling.
The pointer to this new workqueue is not initialized to the struct, resulting in NULL being passed to the scheduler, which then uses the
system_wqfor timeout handling.
Quoted 7 lines
Set the correct workqueue to the init args struct.
Cc [email protected] # 6.15+Fixes 796a9f55a8d1 ("drm/sched: Use struct for drm_sched_init() params")Reported-by Tvrtko Ursulin <[email protected]>Signed-off-by Philipp Stanner <[email protected]>
Quoted 24 lines
--- drivers/gpu/drm/panfrost/panfrost_job.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/gpu/drm/panfrost/panfrost_job.c +1
-1@@ -841,7 +841,6 @@ int panfrost_job_init(struct panfrost_device *pfdev) .num_rqs = DRM_SCHED_PRIORITY_COUNT, .credit_limit = 2, .timeout = msecs_to_jiffies(JOB_TIMEOUT_MS), - .timeout_wq = pfdev->reset.wq, .name = "pan_js", .dev = pfdev->dev, };@@ -879,6 +878,7 @@ int panfrost_job_init(struct panfrost_device *pfdev) pfdev->reset.wq =alloc_ordered_workqueue ("panfrost-reset" ,0 );if (!pfdev->reset.wq)return -ENOMEM ; + args.timeout_wq = pfdev->reset.wq;for (j =0 ; j <NUM_JOB_SLOTS ; j++) { js->queue[j].fence_context =dma_fence_context_alloc (1 );