1, Move root BO kmapping to amdgpu_vm_make_compute.
2, Don't validate and kmap root BO intentional, it would be
validated and mapped by amdgpu_vm_validate_pt_bos if necessary.
3, Rename and expose vm_validate_pt_pd_bos, so that it
could be used by SVM.

Signed-off-by: Lang Yu <lang...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h    |  1 +
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 26 +++++--------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c        |  5 ++++
 3 files changed, 12 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index f8b9f27adcf5..463c1a3fa587 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -288,6 +288,7 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void 
*process_info,
                                            struct dma_fence **ef);
 int amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct amdgpu_device *adev,
                                              struct kfd_vm_fault_info *info);
+int amdgpu_amdkfd_gpuvm_validate_pt_pd_bos(struct amdgpu_vm *vm);
 int amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,
                                      struct dma_buf *dmabuf,
                                      uint64_t va, void *drm_priv,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 81bcffb510f4..9f6531597d1f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -370,14 +370,14 @@ static int amdgpu_amdkfd_validate_vm_bo(void *_unused, 
struct amdgpu_bo *bo)
        return amdgpu_amdkfd_bo_validate(bo, bo->allowed_domains, false);
 }
 
-/* vm_validate_pt_pd_bos - Validate page table and directory BOs
+/* amdgpu_amdkfd_gpuvm_validate_pt_pd_bos - Validate page table and directory 
BOs
  *
  * Page directories are not updated here because huge page handling
  * during page table updates can invalidate page directory entries
  * again. Page directories are only updated after updating page
  * tables.
  */
-static int vm_validate_pt_pd_bos(struct amdgpu_vm *vm)
+int amdgpu_amdkfd_gpuvm_validate_pt_pd_bos(struct amdgpu_vm *vm)
 {
        struct amdgpu_bo *pd = vm->root.bo;
        struct amdgpu_device *adev = amdgpu_ttm_adev(pd->tbo.bdev);
@@ -389,22 +389,8 @@ static int vm_validate_pt_pd_bos(struct amdgpu_vm *vm)
                return ret;
        }
 
-       ret = amdgpu_amdkfd_validate_vm_bo(NULL, pd);
-       if (ret) {
-               pr_err("failed to validate PD\n");
-               return ret;
-       }
-
        vm->pd_phys_addr = amdgpu_gmc_pd_addr(vm->root.bo);
 
-       if (vm->use_cpu_for_update) {
-               ret = amdgpu_bo_kmap(pd, NULL);
-               if (ret) {
-                       pr_err("failed to kmap PD, ret=%d\n", ret);
-                       return ret;
-               }
-       }
-
        return 0;
 }
 
@@ -1175,7 +1161,7 @@ static int process_validate_vms(struct 
amdkfd_process_info *process_info)
 
        list_for_each_entry(peer_vm, &process_info->vm_list_head,
                            vm_list_node) {
-               ret = vm_validate_pt_pd_bos(peer_vm);
+               ret = amdgpu_amdkfd_gpuvm_validate_pt_pd_bos(peer_vm);
                if (ret)
                        return ret;
        }
@@ -1261,7 +1247,7 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void 
**process_info,
        ret = amdgpu_bo_reserve(vm->root.bo, true);
        if (ret)
                goto reserve_pd_fail;
-       ret = vm_validate_pt_pd_bos(vm);
+       ret = amdgpu_amdkfd_gpuvm_validate_pt_pd_bos(vm);
        if (ret) {
                pr_err("validate_pt_pd_bos() failed\n");
                goto validate_pd_fail;
@@ -1809,7 +1795,7 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
            bo->tbo.resource->mem_type == TTM_PL_SYSTEM)
                is_invalid_userptr = true;
 
-       ret = vm_validate_pt_pd_bos(avm);
+       ret = amdgpu_amdkfd_gpuvm_validate_pt_pd_bos(avm);
        if (unlikely(ret))
                goto out_unreserve;
 
@@ -1889,7 +1875,7 @@ int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
                goto unreserve_out;
        }
 
-       ret = vm_validate_pt_pd_bos(avm);
+       ret = amdgpu_amdkfd_gpuvm_validate_pt_pd_bos(avm);
        if (unlikely(ret))
                goto unreserve_out;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 1ea204218903..697ce6825c18 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2217,6 +2217,11 @@ 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_bo_kmap(vm->root.bo, NULL);
+               if (r) {
+                       dev_err(adev->dev, "failed to kmap PD, r = %d\n", r);
+                       return r;
+               }
        } else {
                vm->update_funcs = &amdgpu_vm_sdma_funcs;
        }
-- 
2.25.1

Reply via email to