[PATCH 4/5] drm/sched: Lock drm_sched_entity_is_idle()
From: Philipp Stanner
Date: Wed Jul 01 2026 - 05:00:35 EST
drm_sched_entity_is_idle() contains a badly documented memory barrier
and an invalid lockless access to entity->stopped.
This function is in no way performance critical, so it is safer, more
readable and more maintainable to take the spinlock. This also enables
future cleanup work where the entity can be fully synchronized via its
spinlock.
Add locking to drm_sched_entity_is_idle().
Signed-off-by: Philipp Stanner <phasta@xxxxxxxxxx>
---
drivers/gpu/drm/scheduler/sched_entity.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c
index 0fc1213a0d3f..cb03d6a36578 100644
--- a/drivers/gpu/drm/scheduler/sched_entity.c
+++ b/drivers/gpu/drm/scheduler/sched_entity.c
@@ -178,14 +178,18 @@ EXPORT_SYMBOL(drm_sched_entity_modify_sched);
static bool drm_sched_entity_is_idle(struct drm_sched_entity *entity)
{
- rmb(); /* for list_empty to work without lock */
+ bool idle = false;
+
+ spin_lock(&entity->lock);
if (list_empty(&entity->list) ||
spsc_queue_count(&entity->job_queue) == 0 ||
entity->stopped)
- return true;
+ idle = true;
- return false;
+ spin_unlock(&entity->lock);
+
+ return idle;
}
/**
--
2.54.0