Reviewed-by: Vitaly Prosyak <[email protected]>

On 2026-09-02 08:49, Prike Liang wrote:
> The eviction fence suspend worker waits for every pending userq fence
> from inside a dma_fence_begin_signalling() critical section. Waiting on
> another DMA fence while responsible for signalling one violates the
> cross-driver fence contract and is reported by lockdep as a
> dma_fence_map dependency.
>
> Move the wait before dma_fence_begin_signalling(). Keep userq_mutex held
> so queue lifetime remains stable while inspecting last_fence.
>
> Fixes: fc61df151617 ("drm/amdgpu: annotate eviction fence signaling path")
> Signed-off-by: Prike Liang <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c | 3 +++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c          | 4 +---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h          | 1 +
>  3 files changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> index 4c5e38dea4c2..a0802012de49 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> @@ -68,6 +68,9 @@ amdgpu_eviction_fence_suspend_worker(struct work_struct 
> *work)
>  
>       mutex_lock(&uq_mgr->userq_mutex);
>  
> +     /* Fence waits are not allowed in a fence signalling critical section. 
> */
> +     amdgpu_userq_wait_for_signal(uq_mgr);
> +
>       /*
>        * This is intentionally after taking the userq_mutex since we do
>        * allocate memory while holding this lock, but only after ensuring that
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> index ed329041a648..a7b68fd2360e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> @@ -1272,7 +1272,7 @@ amdgpu_userq_evict_all(struct amdgpu_userq_mgr *uq_mgr)
>       return ret;
>  }
>  
> -static void
> +void
>  amdgpu_userq_wait_for_signal(struct amdgpu_userq_mgr *uq_mgr)
>  {
>       struct amdgpu_usermode_queue *queue;
> @@ -1291,8 +1291,6 @@ amdgpu_userq_wait_for_signal(struct amdgpu_userq_mgr 
> *uq_mgr)
>  void
>  amdgpu_userq_evict(struct amdgpu_userq_mgr *uq_mgr)
>  {
> -     /* Wait for any pending userqueue fence work to finish */
> -     amdgpu_userq_wait_for_signal(uq_mgr);
>       amdgpu_userq_evict_all(uq_mgr);
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> index 6412a7f7b6ef..488dc21d7c81 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> @@ -162,6 +162,7 @@ void amdgpu_userq_mgr_cancel_reset_work(struct 
> amdgpu_device *adev);
>  void amdgpu_userq_mgr_cancel_resume(struct amdgpu_userq_mgr *userq_mgr);
>  void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr);
>  
> +void amdgpu_userq_wait_for_signal(struct amdgpu_userq_mgr *uq_mgr);
>  void amdgpu_userq_evict(struct amdgpu_userq_mgr *uq_mgr);
>  
>  void amdgpu_userq_ensure_ev_fence(struct amdgpu_userq_mgr *userq_mgr,

Reply via email to