[Intel-gfx] [PATCH] drm/i915: Don't disable interrupts independently of the lock

Chris Wilson chris at chris-wilson.co.uk
Thu Oct 10 18:11:27 UTC 2019


Quoting Sebastian Andrzej Siewior (2019-10-10 17:06:40)
> The locks (active.lock and rq->lock) need to be taken with disabled
> interrupts. This is done in i915_request_retire() by disabling the
> interrupts independently of the locks itself.
> While local_irq_disable()+spin_lock() equals spin_lock_irq() on vanilla
> it does not on PREEMPT_RT. Also, it is not obvious if there is a special reason
> to why the interrupts are disabled independently of the lock.
> 
> Enable/disable interrupts as part of the locking instruction.
> 
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
> ---
>  drivers/gpu/drm/i915/i915_request.c |    8 ++------
>  1 file changed, 2 insertions(+), 6 deletions(-)
> 
> --- a/drivers/gpu/drm/i915/i915_request.c
> +++ b/drivers/gpu/drm/i915/i915_request.c
> @@ -251,15 +251,13 @@ static bool i915_request_retire(struct i
>                 active->retire(active, rq);
>         }
>  
> -       local_irq_disable();
> -
>         /*
>          * We only loosely track inflight requests across preemption,
>          * and so we may find ourselves attempting to retire a _completed_
>          * request that we have removed from the HW and put back on a run
>          * queue.
>          */
> -       spin_lock(&rq->engine->active.lock);
> +       spin_lock_irq(&rq->engine->active.lock);
>         list_del(&rq->sched.link);
>         spin_unlock(&rq->engine->active.lock);
>  
> @@ -278,9 +276,7 @@ static bool i915_request_retire(struct i
>                 __notify_execute_cb(rq);
>         }
>         GEM_BUG_ON(!list_empty(&rq->execute_cb));
> -       spin_unlock(&rq->lock);
> -
> -       local_irq_enable();
> +       spin_unlock_irq(&rq->lock);

Nothing screams about the imbalance? irq off from one lock to the other?
-Chris


More information about the dri-devel mailing list