On Mon, 2025-12-01 at 10:39 -0800, Matthew Brost wrote: > Stop abusing DRM scheduler job list lock for messages, add dedicated > message lock. > > Signed-off-by: Matthew Brost <[email protected]> > Reviewed-by: Niranjana Vishwanathapura <[email protected]>
Nice! Me gusta. Acked-by: Philipp Stanner <[email protected]> > --- > drivers/gpu/drm/xe/xe_gpu_scheduler.c | 5 +++-- > drivers/gpu/drm/xe/xe_gpu_scheduler.h | 4 ++-- > drivers/gpu/drm/xe/xe_gpu_scheduler_types.h | 2 ++ > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_gpu_scheduler.c > b/drivers/gpu/drm/xe/xe_gpu_scheduler.c > index f91e06d03511..f4f23317191f 100644 > --- a/drivers/gpu/drm/xe/xe_gpu_scheduler.c > +++ b/drivers/gpu/drm/xe/xe_gpu_scheduler.c > @@ -77,6 +77,7 @@ int xe_sched_init(struct xe_gpu_scheduler *sched, > }; > > sched->ops = xe_ops; > + spin_lock_init(&sched->msg_lock); > INIT_LIST_HEAD(&sched->msgs); > INIT_WORK(&sched->work_process_msg, xe_sched_process_msg_work); > > @@ -117,7 +118,7 @@ void xe_sched_add_msg(struct xe_gpu_scheduler *sched, > void xe_sched_add_msg_locked(struct xe_gpu_scheduler *sched, > struct xe_sched_msg *msg) > { > - lockdep_assert_held(&sched->base.job_list_lock); > + lockdep_assert_held(&sched->msg_lock); > > list_add_tail(&msg->link, &sched->msgs); > xe_sched_process_msg_queue(sched); > @@ -131,7 +132,7 @@ void xe_sched_add_msg_locked(struct xe_gpu_scheduler > *sched, > void xe_sched_add_msg_head(struct xe_gpu_scheduler *sched, > struct xe_sched_msg *msg) > { > - lockdep_assert_held(&sched->base.job_list_lock); > + lockdep_assert_held(&sched->msg_lock); > > list_add(&msg->link, &sched->msgs); > xe_sched_process_msg_queue(sched); > diff --git a/drivers/gpu/drm/xe/xe_gpu_scheduler.h > b/drivers/gpu/drm/xe/xe_gpu_scheduler.h > index c7a77a3a9681..dceb2cd0ee5b 100644 > --- a/drivers/gpu/drm/xe/xe_gpu_scheduler.h > +++ b/drivers/gpu/drm/xe/xe_gpu_scheduler.h > @@ -33,12 +33,12 @@ void xe_sched_add_msg_head(struct xe_gpu_scheduler *sched, > > static inline void xe_sched_msg_lock(struct xe_gpu_scheduler *sched) > { > - spin_lock(&sched->base.job_list_lock); > + spin_lock(&sched->msg_lock); > } > > static inline void xe_sched_msg_unlock(struct xe_gpu_scheduler *sched) > { > - spin_unlock(&sched->base.job_list_lock); > + spin_unlock(&sched->msg_lock); > } > > static inline void xe_sched_stop(struct xe_gpu_scheduler *sched) > diff --git a/drivers/gpu/drm/xe/xe_gpu_scheduler_types.h > b/drivers/gpu/drm/xe/xe_gpu_scheduler_types.h > index 6731b13da8bb..63d9bf92583c 100644 > --- a/drivers/gpu/drm/xe/xe_gpu_scheduler_types.h > +++ b/drivers/gpu/drm/xe/xe_gpu_scheduler_types.h > @@ -47,6 +47,8 @@ struct xe_gpu_scheduler { > const struct xe_sched_backend_ops *ops; > /** @msgs: list of messages to be processed in @work_process_msg */ > struct list_head msgs; > + /** @msg_lock: Message lock */ > + spinlock_t msg_lock; > /** @work_process_msg: processes messages */ > struct work_struct work_process_msg; > };
