[AMD Official Use Only - AMD Internal Distribution Only]

Ping this series.


> -----Original Message-----
> From: Jesse.Zhang <[email protected]>
> Sent: Friday, October 24, 2025 5:44 PM
> To: [email protected]
> Cc: Deucher, Alexander <[email protected]>; Koenig, Christian
> <[email protected]>; Zhang, Jesse(Jie) <[email protected]>
> Subject: [PATCH 3/3] drm/amdgpu: use irq-safe lock in
> amdgpu_userq_fence_driver_process
>
> The amdgpu_userq_fence_driver_process() function can be called from both
> interrupt context (IRQ handlers like gfx_v11_0_eop_irq) and process context
> (workqueues like eviction suspend worker). Using regular spin_lock() in 
> interrupt
> context triggers lockdep warnings and could lead to potential deadlocks.
>
> Replace the regular spin_lock()/spin_unlock() with their interrupt- safe 
> variants
> spin_lock_irqsave()/spin_unlock_irqrestore() to ensure proper locking 
> semantics in
> all execution contexts.
>
> This ensures:
> - Interrupts are properly disabled when locking in interrupt context
> - No lockdep warnings due to mixed context usage
> - Safe execution across all code paths that process user queue fences
>
> Signed-off-by: Jesse Zhang <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> index 2aeeaa954882..69908b90d255 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> @@ -151,15 +151,16 @@ void amdgpu_userq_fence_driver_process(struct
> amdgpu_userq_fence_driver *fence_d  {
>       struct amdgpu_userq_fence *userq_fence, *tmp;
>       struct dma_fence *fence;
> +     unsigned long flags;
>       u64 rptr;
>       int i;
>
>       if (!fence_drv)
>               return;
>
> +     spin_lock_irqsave(&fence_drv->fence_list_lock, flags);
>       rptr = amdgpu_userq_fence_read(fence_drv);
>
> -     spin_lock(&fence_drv->fence_list_lock);
>       list_for_each_entry_safe(userq_fence, tmp, &fence_drv->fences, link) {
>               fence = &userq_fence->base;
>
> @@ -174,7 +175,7 @@ void amdgpu_userq_fence_driver_process(struct
> amdgpu_userq_fence_driver *fence_d
>               list_del(&userq_fence->link);
>               dma_fence_put(fence);
>       }
> -     spin_unlock(&fence_drv->fence_list_lock);
> +     spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags);
>  }
>
>  void amdgpu_userq_fence_driver_destroy(struct kref *ref)
> --
> 2.49.0

Reply via email to