diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index ed92dc1a29e7..0b8a8f82ecab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -617,9 +617,8 @@ int amdgpu_vm_validate(struct amdgpu_device *adev, struct amdgpu_vm *vm, * As soon as all page tables are in place we can start updating them * again. */ - amdgpu_vm_eviction_lock(vm); - vm->evicting = false; - amdgpu_vm_eviction_unlock(vm); + scoped_guard(mutex, &vm->eviction_lock) + vm->evicting = false; list_for_each_entry_safe(bo_base, tmp, &vm->always_valid.evicted, vm_status) { @@ -679,9 +678,8 @@ bool amdgpu_vm_ready(struct amdgpu_vm *vm) amdgpu_vm_assert_locked(vm); - amdgpu_vm_eviction_lock(vm); - ret = !vm->evicting; - amdgpu_vm_eviction_unlock(vm); + scoped_guard(mutex, &vm->eviction_lock) + ret = !vm->evicting; ret &= list_empty(&vm->kernel.evicted); @@ -2275,6 +2273,7 @@ void amdgpu_vm_bo_del(struct amdgpu_device *adev, bool amdgpu_vm_evictable(struct amdgpu_bo *bo) { struct amdgpu_vm_bo_base *bo_base = bo->vm_bo; + struct amdgpu_vm *vm; /* Page tables of a destroyed VM can go away immediately */ if (!bo_base || !bo_base->vm) @@ -2285,17 +2284,15 @@ bool amdgpu_vm_evictable(struct amdgpu_bo *bo) return false; /* Try to block ongoing updates */ - if (!amdgpu_vm_eviction_trylock(bo_base->vm)) - return false; + vm = bo_base->vm; + scoped_cond_guard(mutex_try, return false, &vm->eviction_lock) { - /* Don't evict VM page tables while they are updated */ - if (!dma_fence_is_signaled(bo_base->vm->last_unlocked)) { - amdgpu_vm_eviction_unlock(bo_base->vm); - return false; + /* Don't evict VM page tables while they are updated */ + if (!dma_fence_is_signaled(vm->last_unlocked)) + return false; + + vm->evicting = true; } - - bo_base->vm->evicting = true; - amdgpu_vm_eviction_unlock(bo_base->vm); return true; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_internal.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_internal.h index 447195cc4593..ca86eaac7523 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_internal.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_internal.h @@ -137,15 +137,6 @@ static inline void amdgpu_vm_eviction_lock(struct amdgpu_vm *vm) 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);