drm/amdgpu: Drop eviction lock when allocating PT BO
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>
This commit is contained in:
parent
c70e216696
commit
0bc71adc8b
|
@ -143,32 +143,6 @@ int amdgpu_vm_set_pasid(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||||
return 0;
|
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
|
* amdgpu_vm_bo_evicted - vm_bo is evicted
|
||||||
*
|
*
|
||||||
|
|
|
@ -510,4 +510,30 @@ static inline uint64_t amdgpu_vm_tlb_seq(struct amdgpu_vm *vm)
|
||||||
return atomic64_read(&vm->tlb_seq);
|
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
|
#endif
|
||||||
|
|
|
@ -597,7 +597,9 @@ static int amdgpu_vm_pt_alloc(struct amdgpu_device *adev,
|
||||||
if (entry->bo)
|
if (entry->bo)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
amdgpu_vm_eviction_unlock(vm);
|
||||||
r = amdgpu_vm_pt_create(adev, vm, cursor->level, immediate, &pt);
|
r = amdgpu_vm_pt_create(adev, vm, cursor->level, immediate, &pt);
|
||||||
|
amdgpu_vm_eviction_lock(vm);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue