RE: [PATCH 1/5] drm/amdgpu: reserve dma_resv slot before adding eviction fence

"Liang, Prike" <[email protected]>
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <DS7PR12MB600522D04E5E2503756BD596FBAF2@DS7PR12MB6005.namprd12.prod.outlook.com>
AMD General

Regards,
      Prike

> -----Original Message-----
> From: amd-gfx <[email protected]> On Behalf Of
> [email protected]
> Sent: Tuesday, August 25, 2026 7:30 AM
> To: [email protected]
> Cc: Koenig, Christian <[email protected]>; Deucher, Alexander
> <[email protected]>; Prosyak, Vitaly <[email protected]>;
> Khatri, Sunil <[email protected]>
> Subject: [PATCH 1/5] drm/amdgpu: reserve dma_resv slot before adding eviction
> fence
>
> From: Vitaly Prosyak <[email protected]>
>
> dma_resv_add_fence() requires the caller to pre-allocate space with
> dma_resv_reserve_fences(). amdgpu_evf_mgr_attach_fence() omits this call, so
> when ttm_bo_validate() consumes all pre-allocated slots the subsequent
> dma_resv_add_fence() triggers:
>
>   kernel BUG at drivers/dma-buf/dma-resv.c:319!
>   BUG_ON(fobj->num_fences >= fobj->max_fences)
>   Workqueue: events amdgpu_userq_restore_worker
>
> Add dma_resv_reserve_fences(resv, 1) after ttm_bo_validate() and before
> dma_resv_add_fence() to guarantee a free slot.
>
> Cc: Christian Koenig <[email protected]>
> Cc: Alex Deucher <[email protected]>
> Cc: Sunil Khatri <[email protected]>
> Signed-off-by: Vitaly Prosyak <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> index 4c5e38dea4c2..26b52378e053 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
> @@ -105,6 +105,8 @@ int amdgpu_evf_mgr_attach_fence(struct
> amdgpu_eviction_fence_mgr *evf_mgr,
>
>               amdgpu_bo_placement_from_domain(bo, bo->allowed_domains);
>               ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
> +             if (!ret)
> +                     ret = dma_resv_reserve_fences(resv, 1);

We may not need to explicitly reserve the dma_resv slot here, the slot should ideally be reserved at the call site (e.g., amdgpu_userq_vm_validate_and_restore_queue()). I observed this issue as well, but we should still audit all callers to identify exactly where the reservation is missing.

If this patch is needed as a workaround in the meantime, the dma_resv_reserve_fences() call can be placed directly before dma_resv_add_fence() as follows.

    amdgpu_bo_placement_from_domain(bo, bo->allowed_domains);
                ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
-               if (!ret)
+               if (!ret) {
+                       dma_resv_reserve_fences(resv, 1);
                        dma_resv_add_fence(resv, ev_fence,
                                           DMA_RESV_USAGE_BOOKKEEP);
+               }


>               if (!ret)
>                       dma_resv_add_fence(resv, ev_fence,
>                                          DMA_RESV_USAGE_BOOKKEEP);
> --
> 2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.