drm/nouveau: Fix race in nouveau_sched_fini()
Subsystems (4)
PATCH 1/1 drm/nouveau: Fix race in nouveau_sched_fini()
nouveau_sched_fini() uses a memory barrier before wait_event(). wait_event(), however, is a macro which expands to a loop which might check the passed condition several times. The barrier would only take effect for the first check.
Replace the barrier with a function which takes the spinlock.
--- drivers/gpu/drm/nouveau/nouveau_sched.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/gpu/drm/nouveau/nouveau_sched.c +12 -2
@@ -482,6 +482,17 @@ nouveau_sched_create(struct nouveau_sched **psched, struct nouveau_drm *drm,return 0 ; } +static bool +nouveau_sched_job_list_empty (struct nouveau_sched *sched) +{ +bool empty; + +spin_lock (&sched->job.list.lock); + empty =list_empty (&sched->job.list.head); +spin_unlock (&sched->job.list.lock); + +return empty; +}static void nouveau_sched_fini (struct nouveau_sched *sched)
@@ -489,8 +500,7 @@ nouveau_sched_fini(struct nouveau_sched *sched)struct drm_gpu_scheduler *drm_sched = &sched->base;struct drm_sched_entity *entity = &sched->entity; -rmb ();/* for list_empty to work without lock */ -wait_event (sched->job.wq,list_empty (&sched->job.list.head)); +wait_event (sched->job.wq,nouveau_sched_job_list_empty (sched));drm_sched_entity_fini (entity);drm_sched_fini (drm_sched);
Signature · 1 line
2.49.0
Quoted 10 lines · Philipp Stanner
nouveau_sched_fini()uses a memory barrier beforewait_event().wait_event(), however, is a macro which expands to a loop which might check the passed condition several times. The barrier would only take effect for the first check.Replace the barrier with a function which takes the spinlock.
Cc [email protected] # v6.8+Fixes 5f03a507b29e ("drm/nouveau: implement 1:1 scheduler - entity relationship")Signed-off-by Philipp Stanner <[email protected]>
Philipp Stanner
AppliedQuoted 6 lines · Danilo Krummrich
Quoted 5 lines · Philipp Stanner
nouveau_sched_fini()uses a memory barrier beforewait_event().wait_event(), however, is a macro which expands to a loop which might check the passed condition several times. The barrier would only take effect for the first check.
Quoted 7 lines
Quoted 5 lines
Replace the barrier with a function which takes the spinlock.
Cc [email protected] # v6.8+Fixes 5f03a507b29e ("drm/nouveau: implement 1:1 scheduler - entity relationship")Signed-off-by Philipp Stanner <[email protected]>Acked-by Danilo Krummrich <[email protected]>
Applied to drm-misc-fixes
P.