amdgpu_cwsr_alloc() creates the TMA BO of every opened render node with
the resv of the VM root PD and as ttm_bo_type_kernel. The VM puts kernel
BOs which share its resv on its page table lists, so the TMA BO is
treated as a page table: after a VRAM losing reset its bo_va moves to
the page tables needing an update, and amdgpu_vm_update_pdes() tries to
write its PDE. It has no parent page directory, so that fails, and fails
again on every following submission of the file.

On navi31, submitting on a render node, then amdgpu_gpu_recover and
submitting again, also with a new context:

  amdgpu 0000:03:00.0: VRAM is lost due to GPU reset!
  amdgpu 0000:03:00.0: GPU reset(1) succeeded!
  WARNING: amdgpu_vm_pt.c:664 at amdgpu_vm_pde_update+0x329/0x5d0 [amdgpu], 
CPU#3: vmreinit/2728

and every command submission fails with -EINVAL from then on.

Create the TMA BO as a device BO, a per VM BO like the other ones.
With that the submissions after the reset complete.

Fixes: 8a93aae9896b ("drm/amdgpu: Add CWSR infrastructure for user queues")
Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c
index daca0a1ac990..52ae77a08ca0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cwsr.c
@@ -433,7 +433,11 @@ int amdgpu_cwsr_alloc(struct amdgpu_device *adev, struct 
amdgpu_vm *vm,
        bp.domain = AMDGPU_GEM_DOMAIN_GTT;
        bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC |
                   AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
-       bp.type = ttm_bo_type_kernel;
+       /*
+        * Not ttm_bo_type_kernel: the VM takes kernel BOs sharing its resv
+        * for page tables.
+        */
+       bp.type = ttm_bo_type_device;
        bp.bo_ptr_size = sizeof(struct amdgpu_bo);
        bp.resv = vm->root.bo->tbo.base.resv;
 
-- 
2.50.1

Reply via email to