[PATCH 1/1] drm/amdgpu: Use spinlock_irqsave for pasid_lock
Christian König
ckoenig.leichtzumerken at gmail.com
Tue Jun 15 06:48:14 UTC 2021
Am 15.06.21 um 00:07 schrieb Felix Kuehling:
> This should fix a kernel LOCKDEP warning on Vega10:
> [ 149.416604] ================================
> [ 149.420877] WARNING: inconsistent lock state
> [ 149.425152] 5.11.0-kfd-fkuehlin #517 Not tainted
> [ 149.429770] --------------------------------
> [ 149.434053] inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage.
> [ 149.440059] swapper/3/0 [HC1[1]:SC0[0]:HE0:SE1] takes:
> [ 149.445198] ffff9ac80e005d68 (&adev->vm_manager.pasid_lock){?.+.}-{2:2}, at: amdgpu_vm_get_task_info+0x25/0x90 [amdgpu]
> [ 149.456252] {HARDIRQ-ON-W} state was registered at:
> [ 149.461136] lock_acquire+0x242/0x390
> [ 149.464895] _raw_spin_lock+0x2c/0x40
> [ 149.468647] amdgpu_vm_handle_fault+0x44/0x380 [amdgpu]
> [ 149.474187] gmc_v9_0_process_interrupt+0xa8/0x410 [amdgpu]
This is actually a false postive, but the patch is ok since it's the
easiest way to fix this :)
> ...
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 3b6c0b48d0b1..0b63686fc31a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -3394,11 +3394,12 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
> {
> bool is_compute_context = false;
> struct amdgpu_bo *root;
> + unsigned long irqflags;
> uint64_t value, flags;
> struct amdgpu_vm *vm;
> int r;
>
> - spin_lock(&adev->vm_manager.pasid_lock);
> + spin_lock_irqsave(&adev->vm_manager.pasid_lock, irqflags);
> vm = idr_find(&adev->vm_manager.pasid_idr, pasid);
> if (vm) {
> root = amdgpu_bo_ref(vm->root.base.bo);
> @@ -3406,7 +3407,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
> } else {
> root = NULL;
> }
> - spin_unlock(&adev->vm_manager.pasid_lock);
> + spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, irqflags);
>
> if (!root)
> return false;
> @@ -3424,11 +3425,11 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
> goto error_unref;
>
> /* Double check that the VM still exists */
> - spin_lock(&adev->vm_manager.pasid_lock);
> + spin_lock_irqsave(&adev->vm_manager.pasid_lock, irqflags);
> vm = idr_find(&adev->vm_manager.pasid_idr, pasid);
> if (vm && vm->root.base.bo != root)
> vm = NULL;
> - spin_unlock(&adev->vm_manager.pasid_lock);
> + spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, irqflags);
> if (!vm)
> goto error_unlock;
>
More information about the amd-gfx
mailing list