OSDN Git Service

drm/amdgpu: fix amdgpu_vm_pasid_fault_credit
authorChristian König <christian.koenig@amd.com>
Tue, 9 Jan 2018 18:18:59 +0000 (19:18 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 16 Jan 2018 20:35:26 +0000 (15:35 -0500)
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>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index cd1752b..9e26630 100644 (file)
@@ -2478,17 +2478,21 @@ bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev,
 
        spin_lock(&adev->vm_manager.pasid_lock);
        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 */
+               spin_unlock(&adev->vm_manager.pasid_lock);
                return true;
+       }
 
        /* No lock needed. only accessed by IRQ handler */
-       if (!vm->fault_credit)
+       if (!vm->fault_credit) {
                /* Too many faults in this VM */
+               spin_unlock(&adev->vm_manager.pasid_lock);
                return false;
+       }
 
        vm->fault_credit--;
+       spin_unlock(&adev->vm_manager.pasid_lock);
        return true;
 }