On 9/17/26 17:32, [email protected] wrote:
> From: Vitaly Prosyak <[email protected]>
> 
> A user queue restore can rearm an eviction fence after the BO reservation has 
> been unlocked.
> Since dma_resv_unlock() discards unused pre-reserved capacity, a BO with no 
> remaining fences
> can reach rearm with max_fences equal to zero. Reserve one fence slot 
> immediately before
> attaching the replacement BOOKKEEP eviction fence. The BO is already held by 
> the drm_exec
> context at this point, so the reservation remains valid for 
> dma_resv_add_fence(). Keep the
> reservation in the rearm path rather than hiding it in 
> amdgpu_evf_mgr_attach_fence(), so
> the caller-side accounting remains explicit.
> This fixes the dma-resv BUG_ON at dma-resv.c:319 and the resulting crash in
> amdgpu_userq_restore_worker. The earlier root-PD and WPTR-caller reservations 
> are reverted
> by the preceding commits because they do not cover this reservation lifetime. 
> Validated with
> repeated amd_deadlock runs, including the userqueue restore reproducer.
> 
> Cc: Christian König <[email protected]>
> Cc: Alex Deucher <[email protected]>
> Cc: Prike Liang <[email protected]>
> Signed-off-by: Vitaly Prosyak <[email protected]>
> Change-Id: Id156389c1b2193fc3e1354acd5194f756faf39c9
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> index a0802012de49..6c1f994ea78b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> @@ -125,6 +125,7 @@ int amdgpu_evf_mgr_rearm(struct amdgpu_eviction_fence_mgr 
> *evf_mgr,
>       struct amdgpu_eviction_fence *ev_fence;
>       struct drm_gem_object *obj;
>       unsigned long index;
> +     int ret;
>  
>       /* Create and initialize a new eviction fence */
>       ev_fence = kzalloc_obj(*ev_fence);
> @@ -146,6 +147,13 @@ int amdgpu_evf_mgr_rearm(struct 
> amdgpu_eviction_fence_mgr *evf_mgr,
>       drm_exec_for_each_locked_object(exec, index, obj) {
>               struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
>  
> +             ret = dma_resv_reserve_fences(bo->tbo.base.resv, 1);

That doesn't work like this.

The problem is that dma_resv_reserve_fences() allocates memory and that in turn 
can invalidate the eviction fence we just created again.

The patches you want to revert actually look correct to me. The fence slots 
usually needs to be reserved directly after we locked the BOs.

Regards,
Christian.

> +             if (ret) {
> +                    pr_err("userq evf rearm attach failed index=%lu bo=%p 
> ret=%d\n",
> +                           index, bo, ret);
> +                    return ret;
> +                }
> +
>               amdgpu_evf_mgr_attach_fence(evf_mgr, bo);
>       }
>       return 0;

Reply via email to