On Fri, Oct 24, 2025 at 5:45 AM Jesse.Zhang <[email protected]> wrote:
>
> 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]>

Reviewed-by: Alex Deucher <[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