]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/etnaviv: Protect the scheduler's pending list with its lock
authorMaíra Canal <mcanal@igalia.com>
Mon, 2 Jun 2025 13:22:16 +0000 (10:22 -0300)
committerMaíra Canal <mcanal@igalia.com>
Mon, 16 Jun 2025 23:18:13 +0000 (20:18 -0300)
Commit 704d3d60fec4 ("drm/etnaviv: don't block scheduler when GPU is still
active") ensured that active jobs are returned to the pending list when
extending the timeout. However, it didn't use the pending list's lock to
manipulate the list, which causes a race condition as the scheduler's
workqueues are running.

Hold the lock while manipulating the scheduler's pending list to prevent
a race.

Cc: stable@vger.kernel.org
Fixes: 704d3d60fec4 ("drm/etnaviv: don't block scheduler when GPU is still active")
Reported-by: Philipp Stanner <phasta@kernel.org>
Closes: https://lore.kernel.org/dri-devel/964e59ba1539083ef29b06d3c78f5e2e9b138ab8.camel@mailbox.org/
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Philipp Stanner <phasta@kernel.org>
Link: https://lore.kernel.org/r/20250602132240.93314-1-mcanal@igalia.com
Signed-off-by: Maíra Canal <mcanal@igalia.com>
drivers/gpu/drm/etnaviv/etnaviv_sched.c

index 76a3a3e517d8d9f654fb6b9e98e72910795cfc7a..71e2e6b9d71393d5f81eadd109a50e1b83f85e5f 100644 (file)
@@ -35,6 +35,7 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job
                                                          *sched_job)
 {
        struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job);
+       struct drm_gpu_scheduler *sched = sched_job->sched;
        struct etnaviv_gpu *gpu = submit->gpu;
        u32 dma_addr, primid = 0;
        int change;
@@ -89,7 +90,9 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job
        return DRM_GPU_SCHED_STAT_NOMINAL;
 
 out_no_timeout:
-       list_add(&sched_job->list, &sched_job->sched->pending_list);
+       spin_lock(&sched->job_list_lock);
+       list_add(&sched_job->list, &sched->pending_list);
+       spin_unlock(&sched->job_list_lock);
        return DRM_GPU_SCHED_STAT_NOMINAL;
 }