[PATCH v4] drm/amdgpu: bind BOs when the eviction fence is attached

Yifan Zhang <[email protected]>
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <[email protected]>
From: Prerona Ghosh <[email protected]>

DMA-buf imports are created in TTM_PL_SYSTEM and land on the VM idle
list, so neither amdgpu_vm_validate() nor amdgpu_userq_bo_validate()
ever binds them. Only the BO list of a command submission does, and a VM
using user queues never runs amdgpu_cs. AMDGPU_GEM_VA then programs PTEs
from a TTM_PL_SYSTEM resource, i.e. without AMDGPU_PTE_VALID, and the
first GPU access faults.

amdgpu_evf_mgr_attach_fence() is supposed to cover exactly that case
from amdgpu_gem_object_open(), but it validates only when the current
eviction fence is unsignaled. At open time that is normally not true:
amdgpu_evf_mgr_init() installs the stub fence, which is permanently
signaled, and a real fence only appears once amdgpu_evf_mgr_rearm() runs
from the resume worker. So an import opened before the client creates
its first user queue - or between an eviction and the resume - is left
unbound. Natively created BOs hide the problem because amdgpu_bo_create()
already validated them into their domain.

Validate unconditionally and keep the signaled check only for adding the
fence, which is all it was needed for. A BO that cannot be bound now
fails the ioctl rather than handing out a handle that only maps to
faulting PTEs.

v3: validate inside amdgpu_gem_object_open (Christian)
v4: fix amdgpu_evf_mgr_attach_fence itself instead (Christian)

Signed-off-by: Prerona Ghosh <[email protected]>
Signed-off-by: Yifan Zhang <[email protected]>
Assisted-by: Claude:claude-opus-5.0
---
 .../drm/amd/amdgpu/amdgpu_eviction_fence.c    | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 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..69a7f573134f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_eviction_fence.c
@@ -101,16 +101,15 @@ int amdgpu_evf_mgr_attach_fence(struct amdgpu_eviction_fence_mgr *evf_mgr,
 	struct dma_resv *resv = bo->tbo.base.resv;
 	int ret;
 
-	if (!dma_fence_is_signaled(ev_fence)) {
-
-		amdgpu_bo_placement_from_domain(bo, bo->allowed_domains);
-		ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
-		if (!ret)
-			dma_resv_add_fence(resv, ev_fence,
-					   DMA_RESV_USAGE_BOOKKEEP);
-	} else {
-		ret = 0;
-	}
+	/*
+	 * Validate even when the fence is already signaled: DMA-buf imports are
+	 * created in TTM_PL_SYSTEM and this is the only place a VM using user
+	 * queues binds them.
+	 */
+	amdgpu_bo_placement_from_domain(bo, bo->allowed_domains);
+	ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
+	if (!ret && !dma_fence_is_signaled(ev_fence))
+		dma_resv_add_fence(resv, ev_fence, DMA_RESV_USAGE_BOOKKEEP);
 
 	dma_fence_put(ev_fence);
 	return ret;
-- 
2.43.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.