[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
