Skip to content

Commit 4e9597f

Browse files
donettom-1alexdeucher
authored andcommitted
drm/amdgpu: Handle GPU page faults correctly on non-4K page systems
During a GPU page fault, the driver restores the SVM range and then maps it into the GPU page tables. The current implementation passes a GPU-page-size (4K-based) PFN to svm_range_restore_pages() to restore the range. SVM ranges are tracked using system-page-size PFNs. On systems where the system page size is larger than 4K, using GPU-page-size PFNs to restore the range causes two problems: Range lookup fails: Because the restore function receives PFNs in GPU (4K) units, the SVM range lookup does not find the existing range. This will result in a duplicate SVM range being created. VMA lookup failure: The restore function also tries to locate the VMA for the faulting address. It converts the GPU-page-size PFN into an address using the system page size, which results in an incorrect address on non-4K page-size systems. As a result, the VMA lookup fails with the message: "address 0xxxx VMA is removed". This patch passes the system-page-size PFN to svm_range_restore_pages() so that the SVM range is restored correctly on non-4K page systems. Acked-by: Christian König <[email protected]> Signed-off-by: Donet Tom <[email protected]> Signed-off-by: Alex Deucher <[email protected]> (cherry picked from commit 074fe39)
1 parent 28922a4 commit 4e9597f

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2974,14 +2974,14 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
29742974
if (!root)
29752975
return false;
29762976

2977-
addr /= AMDGPU_GPU_PAGE_SIZE;
2978-
29792977
if (is_compute_context && !svm_range_restore_pages(adev, pasid, vmid,
2980-
node_id, addr, ts, write_fault)) {
2978+
node_id, addr >> PAGE_SHIFT, ts, write_fault)) {
29812979
amdgpu_bo_unref(&root);
29822980
return true;
29832981
}
29842982

2983+
addr /= AMDGPU_GPU_PAGE_SIZE;
2984+
29852985
r = amdgpu_bo_reserve(root, true);
29862986
if (r)
29872987
goto error_unref;

0 commit comments

Comments
 (0)