]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: fix root reservation in amdgpu_vm_handle_fault
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Mon, 20 Apr 2026 08:23:39 +0000 (10:23 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 24 Apr 2026 15:10:12 +0000 (11:10 -0400)
svm_range_restore_pages might reserve the root bo so it must
be called after unreserving it.

Fixes: 1b135c6da061 ("drm/amdgpu: extract amdgpu_vm_lock_by_pasid from amdgpu_vm_handle_fault")
Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 5cdc219fe86a1720aa4b5b4f42f11913146e6a93)

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

index 115a7b269af30215954b5a4a5df185b1ecc3432a..9ba9de16a27a2324334763d16afce1653a16a2f1 100644 (file)
@@ -3023,11 +3023,22 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
 
        is_compute_context = vm->is_compute_context;
 
-       if (is_compute_context && !svm_range_restore_pages(adev, pasid, vmid,
-           node_id, addr >> PAGE_SHIFT, ts, write_fault)) {
+       if (is_compute_context) {
+               /* Unreserve root since svm_range_restore_pages might try to reserve it. */
+               /* TODO: rework svm_range_restore_pages so that this isn't necessary. */
                amdgpu_bo_unreserve(root);
+
+               if (!svm_range_restore_pages(adev, pasid, vmid,
+                                            node_id, addr >> PAGE_SHIFT, ts, write_fault)) {
+                       amdgpu_bo_unref(&root);
+                       return true;
+               }
                amdgpu_bo_unref(&root);
-               return true;
+
+               /* Re-acquire the VM lock, could be that the VM was freed in between. */
+               vm = amdgpu_vm_lock_by_pasid(adev, &root, pasid);
+               if (!vm)
+                       return false;
        }
 
        addr /= AMDGPU_GPU_PAGE_SIZE;