From: Alex Sierra <alex.sie...@amd.com>

Use SVM API to restore page tables when retry fault and
compute context are enabled.

Signed-off-by: Alex Sierra <alex.sie...@amd.com>
Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 7e306fd20de4..83c020411e52 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -37,6 +37,7 @@
 #include "amdgpu_gmc.h"
 #include "amdgpu_xgmi.h"
 #include "amdgpu_dma_buf.h"
+#include "kfd_svm.h"
 
 /**
  * DOC: GPUVM
@@ -3302,18 +3303,29 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, 
u32 pasid,
        uint64_t value, flags;
        struct amdgpu_vm *vm;
        long r;
+       bool is_compute_context = false;
 
        spin_lock(&adev->vm_manager.pasid_lock);
        vm = idr_find(&adev->vm_manager.pasid_idr, pasid);
-       if (vm)
+       if (vm) {
                root = amdgpu_bo_ref(vm->root.base.bo);
-       else
+               is_compute_context = vm->is_compute_context;
+       } else {
                root = NULL;
+       }
        spin_unlock(&adev->vm_manager.pasid_lock);
 
        if (!root)
                return false;
 
+       addr /= AMDGPU_GPU_PAGE_SIZE;
+
+       if (is_compute_context &&
+           !svm_range_restore_pages(adev, pasid, addr)) {
+               amdgpu_bo_unref(&root);
+               return true;
+       }
+
        r = amdgpu_bo_reserve(root, true);
        if (r)
                goto error_unref;
@@ -3327,18 +3339,16 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, 
u32 pasid,
        if (!vm)
                goto error_unlock;
 
-       addr /= AMDGPU_GPU_PAGE_SIZE;
        flags = AMDGPU_PTE_VALID | AMDGPU_PTE_SNOOPED |
                AMDGPU_PTE_SYSTEM;
 
-       if (vm->is_compute_context) {
+       if (is_compute_context) {
                /* Intentionally setting invalid PTE flag
                 * combination to force a no-retry-fault
                 */
                flags = AMDGPU_PTE_EXECUTABLE | AMDGPU_PDE_PTE |
                        AMDGPU_PTE_TF;
                value = 0;
-
        } else if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_NEVER) {
                /* Redirect the access to the dummy page */
                value = adev->dummy_page_addr;
-- 
2.31.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to