drm/amdgpu: have bos for PDs/PTS cpu accessible when kfd uses cpu to update vm
authorXiaogang Chen <xiaogang.chen@amd.com>
Fri, 30 Jun 2023 16:38:35 +0000 (11:38 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 7 Jul 2023 17:51:48 +0000 (13:51 -0400)
When kfd uses cpu to update vm iterates all current PDs/PTs bos, adds
AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED flag and kmap them to kernel virtual
address space before kfd updates the vm that was created by gfx.

Signed-off-by: Xiaogang Chen <Xiaogang.Chen@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c

index 8eda8f7..92a84e7 100644 (file)
@@ -2279,16 +2279,13 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
                        goto unreserve_bo;
 
                vm->update_funcs = &amdgpu_vm_cpu_funcs;
+               r = amdgpu_vm_pt_map_tables(adev, vm);
+               if (r)
+                       goto unreserve_bo;
+
        } else {
                vm->update_funcs = &amdgpu_vm_sdma_funcs;
        }
-       /*
-        * Make sure root PD gets mapped. As vm_update_mode could be changed
-        * when turning a GFX VM into a compute VM.
-        */
-       r = vm->update_funcs->map_table(to_amdgpu_bo_vm(vm->root.bo));
-       if (r)
-               goto unreserve_bo;
 
        dma_fence_put(vm->last_update);
        vm->last_update = dma_fence_get_stub();
index b81fcb9..88ee450 100644 (file)
@@ -497,6 +497,8 @@ void amdgpu_vm_pt_free_work(struct work_struct *work);
 void amdgpu_debugfs_vm_bo_info(struct amdgpu_vm *vm, struct seq_file *m);
 #endif
 
+int amdgpu_vm_pt_map_tables(struct amdgpu_device *adev, struct amdgpu_vm *vm);
+
 /**
  * amdgpu_vm_tlb_seq - return tlb flush sequence number
  * @vm: the amdgpu_vm structure to query
index 31913ae..6e31621 100644 (file)
@@ -31,6 +31,7 @@
  */
 static int amdgpu_vm_cpu_map_table(struct amdgpu_bo_vm *table)
 {
+       table->bo.flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
        return amdgpu_bo_kmap(&table->bo, NULL);
 }
 
index 24ddf6a..70fc585 100644 (file)
@@ -1075,3 +1075,31 @@ int amdgpu_vm_ptes_update(struct amdgpu_vm_update_params *params,
 
        return 0;
 }
+
+/**
+ * amdgpu_vm_pt_map_tables - have bo of root PD cpu accessible
+ * @adev: amdgpu device structure
+ * @vm: amdgpu vm structure
+ *
+ * make root page directory and everything below it cpu accessible.
+ */
+int amdgpu_vm_pt_map_tables(struct amdgpu_device *adev, struct amdgpu_vm *vm)
+{
+       struct amdgpu_vm_pt_cursor cursor;
+       struct amdgpu_vm_bo_base *entry;
+
+       for_each_amdgpu_vm_pt_dfs_safe(adev, vm, NULL, cursor, entry) {
+
+               struct amdgpu_bo_vm *bo;
+               int r;
+
+               if (entry->bo) {
+                       bo = to_amdgpu_bo_vm(entry->bo);
+                       r = vm->update_funcs->map_table(bo);
+                       if (r)
+                               return r;
+               }
+       }
+
+       return 0;
+}