From: Prerona Ghosh <[email protected]>

DMA-buf imports are created unbound 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.

Validate imports in amdgpu_gem_object_open() instead, while the BO is
already reserved by the drm_exec context. Graphics and compute VMs now
follow the same rule, and a BO that cannot be bound fails the ioctl
rather than handing out a handle that only maps to faulting PTEs.

v3: validate inside amdgpu_gem_object_open (Christian)

Signed-off-by: Prerona Ghosh <[email protected]>
Signed-off-by: Yifan Zhang <[email protected]>
Assisted-by: Claude:claude-opus-5.0
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index f754a4a3a1c2..261218cb57a6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -271,6 +271,20 @@ static int amdgpu_gem_object_open(struct drm_gem_object 
*obj,
                ++bo_va->ref_count;
        }
 
+       /* Imports are created unbound and land on the VM idle list, so neither
+        * amdgpu_vm_validate() nor an amdgpu_cs BO list ever binds them for a
+        * VM that submits through user queues. AMDGPU_GEM_VA would then program
+        * PTEs from a TTM_PL_SYSTEM resource, i.e. without AMDGPU_PTE_VALID.
+        */
+       if (drm_gem_is_imported(obj)) {
+               struct ttm_operation_ctx ctx = { false, false };
+
+               amdgpu_bo_placement_from_domain(abo, abo->allowed_domains);
+               r = ttm_bo_validate(&abo->tbo, &abo->placement, &ctx);
+               if (r)
+                       goto out_unlock;
+       }
+
        drm_exec_fini(&exec);
 
        /* Validate and add eviction fence to DMABuf imports with dynamic
-- 
2.43.0

Reply via email to