drm/amdgpu: fix locking in vega10_ih_prescreen_iv
authorChristian König <christian.koenig@amd.com>
Wed, 24 Jan 2018 12:37:48 +0000 (13:37 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 30 Jan 2018 04:16:20 +0000 (23:16 -0500)
The vm pointer can become invalid as soon as the lock is released.

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/vega10_ih.c

index b69ceafb78883e648609dab5927ed7049c720690..746748e6b731569a5f501964c36ea1945950367c 100644 (file)
@@ -278,9 +278,9 @@ static bool vega10_ih_prescreen_iv(struct amdgpu_device *adev)
        /* Track retry faults in per-VM fault FIFO. */
        spin_lock(&adev->vm_manager.pasid_lock);
        vm = idr_find(&adev->vm_manager.pasid_idr, pasid);
-       spin_unlock(&adev->vm_manager.pasid_lock);
        if (WARN_ON_ONCE(!vm)) {
                /* VM not found, process it normally */
+               spin_unlock(&adev->vm_manager.pasid_lock);
                amdgpu_ih_clear_fault(adev, key);
                return true;
        }
@@ -288,9 +288,11 @@ static bool vega10_ih_prescreen_iv(struct amdgpu_device *adev)
        r = kfifo_put(&vm->faults, key);
        if (!r) {
                /* FIFO is full. Ignore it until there is space */
+               spin_unlock(&adev->vm_manager.pasid_lock);
                amdgpu_ih_clear_fault(adev, key);
                goto ignore_iv;
        }
+       spin_unlock(&adev->vm_manager.pasid_lock);
 
        /* It's the first fault for this address, process it normally */
        return true;