diff options
| author | Alex Sierra <alex.sierra@amd.com> | 2020-05-11 22:01:24 -0500 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2021-04-20 21:49:15 -0400 | 
| commit | ea53af8a59c89b1bb6743d0956da53eee4cb4cd2 (patch) | |
| tree | eb1aa54c163ed8c2682aa41690c9f4969986bf97 /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
| parent | 2383f56bbe4ae1460d11ae77b93c1730c4a20c26 (diff) | |
drm/amdkfd: SVM API call to restore page tables
Use SVM API to restore page tables when retry fault and
compute context are enabled.
Signed-off-by: Alex Sierra <alex.sierra@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 20 | 
1 files 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 2dd5b0e4baf9..c00094acfced 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 @@ -3298,6 +3299,7 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)  bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,  			    uint64_t addr)  { +	bool is_compute_context = false;  	struct amdgpu_bo *root;  	uint64_t value, flags;  	struct amdgpu_vm *vm; @@ -3305,15 +3307,25 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,  	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; | 
