drm/amdgpu: Drop eviction lock when allocating PT BO
authorPhilip Yang <Philip.Yang@amd.com>
Wed, 2 Nov 2022 20:55:31 +0000 (16:55 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 9 Nov 2022 23:06:04 +0000 (18:06 -0500)
Re-take the eviction lock immediately again after the allocation is
completed, to fix circular locking warning with drm_buddy allocator.

Move amdgpu_vm_eviction_lock/unlock/trylock to amdgpu_vm.h as they are
called from multiple files.

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c

index 2291aa1..003aa9e 100644 (file)
@@ -143,32 +143,6 @@ int amdgpu_vm_set_pasid(struct amdgpu_device *adev, struct amdgpu_vm *vm,
        return 0;
 }
 
-/*
- * vm eviction_lock can be taken in MMU notifiers. Make sure no reclaim-FS
- * happens while holding this lock anywhere to prevent deadlocks when
- * an MMU notifier runs in reclaim-FS context.
- */
-static inline void amdgpu_vm_eviction_lock(struct amdgpu_vm *vm)
-{
-       mutex_lock(&vm->eviction_lock);
-       vm->saved_flags = memalloc_noreclaim_save();
-}
-
-static inline int amdgpu_vm_eviction_trylock(struct amdgpu_vm *vm)
-{
-       if (mutex_trylock(&vm->eviction_lock)) {
-               vm->saved_flags = memalloc_noreclaim_save();
-               return 1;
-       }
-       return 0;
-}
-
-static inline void amdgpu_vm_eviction_unlock(struct amdgpu_vm *vm)
-{
-       memalloc_noreclaim_restore(vm->saved_flags);
-       mutex_unlock(&vm->eviction_lock);
-}
-
 /**
  * amdgpu_vm_bo_evicted - vm_bo is evicted
  *
index 1d31771..6546e78 100644 (file)
@@ -510,4 +510,30 @@ static inline uint64_t amdgpu_vm_tlb_seq(struct amdgpu_vm *vm)
        return atomic64_read(&vm->tlb_seq);
 }
 
+/*
+ * vm eviction_lock can be taken in MMU notifiers. Make sure no reclaim-FS
+ * happens while holding this lock anywhere to prevent deadlocks when
+ * an MMU notifier runs in reclaim-FS context.
+ */
+static inline void amdgpu_vm_eviction_lock(struct amdgpu_vm *vm)
+{
+       mutex_lock(&vm->eviction_lock);
+       vm->saved_flags = memalloc_noreclaim_save();
+}
+
+static inline bool amdgpu_vm_eviction_trylock(struct amdgpu_vm *vm)
+{
+       if (mutex_trylock(&vm->eviction_lock)) {
+               vm->saved_flags = memalloc_noreclaim_save();
+               return true;
+       }
+       return false;
+}
+
+static inline void amdgpu_vm_eviction_unlock(struct amdgpu_vm *vm)
+{
+       memalloc_noreclaim_restore(vm->saved_flags);
+       mutex_unlock(&vm->eviction_lock);
+}
+
 #endif
index 358b912..b5f3bba 100644 (file)
@@ -597,7 +597,9 @@ static int amdgpu_vm_pt_alloc(struct amdgpu_device *adev,
        if (entry->bo)
                return 0;
 
+       amdgpu_vm_eviction_unlock(vm);
        r = amdgpu_vm_pt_create(adev, vm, cursor->level, immediate, &pt);
+       amdgpu_vm_eviction_lock(vm);
        if (r)
                return r;