[RFC v3 04/14] drm/sched: Clarify locked section in drm_sched_rq_select_entity_fifo
Tvrtko Ursulin
tvrtko.ursulin at igalia.com
Tue Apr 1 14:59:42 UTC 2025
On 31/03/2025 21:16, Tvrtko Ursulin wrote:
> Rq->lock only protects the tree walk so lets move the rest out.
I retract this one, reinit_completion has to be in the locked section
too. Next posting will be rebased accordingly but I will hold off
sending it out until more comments are received.
Regards,
Tvrtko
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
> Cc: Christian König <christian.koenig at amd.com>
> Cc: Danilo Krummrich <dakr at kernel.org>
> Cc: Matthew Brost <matthew.brost at intel.com>
> Cc: Philipp Stanner <phasta at kernel.org>
> ---
> drivers/gpu/drm/scheduler/sched_main.c | 31 ++++++++++++++------------
> 1 file changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
> index f593b88ab02c..357133e6d4d0 100644
> --- a/drivers/gpu/drm/scheduler/sched_main.c
> +++ b/drivers/gpu/drm/scheduler/sched_main.c
> @@ -326,29 +326,32 @@ static struct drm_sched_entity *
> drm_sched_rq_select_entity_fifo(struct drm_gpu_scheduler *sched,
> struct drm_sched_rq *rq)
> {
> + struct drm_sched_entity *entity = NULL;
> struct rb_node *rb;
>
> spin_lock(&rq->lock);
> for (rb = rb_first_cached(&rq->rb_tree_root); rb; rb = rb_next(rb)) {
> - struct drm_sched_entity *entity;
> -
> entity = rb_entry(rb, struct drm_sched_entity, rb_tree_node);
> - if (drm_sched_entity_is_ready(entity)) {
> - /* If we can't queue yet, preserve the current entity in
> - * terms of fairness.
> - */
> - if (!drm_sched_can_queue(sched, entity)) {
> - spin_unlock(&rq->lock);
> - return ERR_PTR(-ENOSPC);
> - }
> -
> - reinit_completion(&entity->entity_idle);
> + if (drm_sched_entity_is_ready(entity))
> break;
> - }
> + else
> + entity = NULL;
> }
> spin_unlock(&rq->lock);
>
> - return rb ? rb_entry(rb, struct drm_sched_entity, rb_tree_node) : NULL;
> + if (!entity)
> + return NULL;
> +
> + /*
> + * If scheduler cannot take more jobs signal the caller to not consider
> + * lower priority queues.
> + */
> + if (!drm_sched_can_queue(sched, entity))
> + return ERR_PTR(-ENOSPC);
> +
> + reinit_completion(&entity->entity_idle);
> +
> + return entity;
> }
>
> /**
More information about the amd-gfx
mailing list