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