Unverified Commit 61ee19de authored by Maíra Canal's avatar Maíra Canal
Browse files

drm/etnaviv: Protect the scheduler's pending list with its lock



Commit 704d3d60 ("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: 704d3d60 ("drm/etnaviv: don't block scheduler when GPU is still active")
Reported-by: default avatarPhilipp Stanner <phasta@kernel.org>
Closes: https://lore.kernel.org/dri-devel/964e59ba1539083ef29b06d3c78f5e2e9b138ab8.camel@mailbox.org/


Reviewed-by: default avatarLucas Stach <l.stach@pengutronix.de>
Reviewed-by: default avatarPhilipp Stanner <phasta@kernel.org>
Link: https://lore.kernel.org/r/20250602132240.93314-1-mcanal@igalia.com


Signed-off-by: default avatarMaíra Canal <mcanal@igalia.com>
parent e1bc3a13
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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;
}