Otherwise it is possible that between dropping the status lock and
locking the BO that the BO is freed up.

Signed-off-by: Christian König <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index db66b4232de0..c3dfb949a9b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -484,15 +484,19 @@ int amdgpu_vm_lock_done_list(struct amdgpu_vm *vm, struct 
drm_exec *exec,
        spin_lock(&vm->status_lock);
        while (!list_is_head(prev->next, &vm->done)) {
                bo_va = list_entry(prev->next, typeof(*bo_va), base.vm_status);
-               spin_unlock(&vm->status_lock);
 
                bo = bo_va->base.bo;
                if (bo) {
+                       amdgpu_bo_ref(bo);
+                       spin_unlock(&vm->status_lock);
+
                        ret = drm_exec_prepare_obj(exec, &bo->tbo.base, 1);
+                       amdgpu_bo_unref(&bo);
                        if (unlikely(ret))
                                return ret;
+
+                       spin_lock(&vm->status_lock);
                }
-               spin_lock(&vm->status_lock);
                prev = prev->next;
        }
        spin_unlock(&vm->status_lock);
-- 
2.43.0

Reply via email to