瀏覽代碼

drm/amdgpu: fix amdgpu_vm_pasid_fault_credit

As soon as the lock is dropped the VM pointer can be invalid.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Christian König 7 年之前
父節點
當前提交
d958939afc
共有 1 個文件被更改,包括 7 次插入3 次删除
  1. 7 3
      drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

+ 7 - 3
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

@@ -2478,17 +2478,21 @@ bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev,
 
 
 	spin_lock(&adev->vm_manager.pasid_lock);
 	spin_lock(&adev->vm_manager.pasid_lock);
 	vm = idr_find(&adev->vm_manager.pasid_idr, pasid);
 	vm = idr_find(&adev->vm_manager.pasid_idr, pasid);
-	spin_unlock(&adev->vm_manager.pasid_lock);
-	if (!vm)
+	if (!vm) {
 		/* VM not found, can't track fault credit */
 		/* VM not found, can't track fault credit */
+		spin_unlock(&adev->vm_manager.pasid_lock);
 		return true;
 		return true;
+	}
 
 
 	/* No lock needed. only accessed by IRQ handler */
 	/* No lock needed. only accessed by IRQ handler */
-	if (!vm->fault_credit)
+	if (!vm->fault_credit) {
 		/* Too many faults in this VM */
 		/* Too many faults in this VM */
+		spin_unlock(&adev->vm_manager.pasid_lock);
 		return false;
 		return false;
+	}
 
 
 	vm->fault_credit--;
 	vm->fault_credit--;
+	spin_unlock(&adev->vm_manager.pasid_lock);
 	return true;
 	return true;
 }
 }