Signed-off-by: Philip Yang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 27 +++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index d5d170de51ce..9d7f9b3670d7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -183,10 +183,12 @@ static void amdgpu_vm_bo_evicted(struct amdgpu_vm_bo_base 
*vm_bo)
        struct amdgpu_bo *bo = vm_bo->bo;
 
        vm_bo->moved = true;
+       spin_lock(&vm_bo->vm->status_lock);
        if (bo->tbo.type == ttm_bo_type_kernel)
                list_move(&vm_bo->vm_status, &vm->evicted);
        else
                list_move_tail(&vm_bo->vm_status, &vm->evicted);
+       spin_unlock(&vm_bo->vm->status_lock);
 }
 /**
  * amdgpu_vm_bo_moved - vm_bo is moved
@@ -370,12 +372,20 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, 
struct amdgpu_vm *vm,
                              int (*validate)(void *p, struct amdgpu_bo *bo),
                              void *param)
 {
-       struct amdgpu_vm_bo_base *bo_base, *tmp;
+       struct amdgpu_vm_bo_base *bo_base;
+       struct amdgpu_bo *shadow;
+       struct amdgpu_bo *bo;
        int r;
 
-       list_for_each_entry_safe(bo_base, tmp, &vm->evicted, vm_status) {
-               struct amdgpu_bo *bo = bo_base->bo;
-               struct amdgpu_bo *shadow = amdgpu_bo_shadowed(bo);
+       spin_lock(&vm->status_lock);
+       while (!list_empty(&vm->evicted)) {
+               bo_base = list_first_entry(&vm->evicted,
+                                          struct amdgpu_vm_bo_base,
+                                          vm_status);
+               spin_unlock(&vm->status_lock);
+
+               bo = bo_base->bo;
+               shadow = amdgpu_bo_shadowed(bo);
 
                r = validate(param, bo);
                if (r)
@@ -392,7 +402,9 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, 
struct amdgpu_vm *vm,
                        vm->update_funcs->map_table(to_amdgpu_bo_vm(bo));
                        amdgpu_vm_bo_relocated(bo_base);
                }
+               spin_lock(&vm->status_lock);
        }
+       spin_unlock(&vm->status_lock);
 
        amdgpu_vm_eviction_lock(vm);
        vm->evicting = false;
@@ -413,13 +425,18 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, 
struct amdgpu_vm *vm,
  */
 bool amdgpu_vm_ready(struct amdgpu_vm *vm)
 {
+       bool empty;
        bool ret;
 
        amdgpu_vm_eviction_lock(vm);
        ret = !vm->evicting;
        amdgpu_vm_eviction_unlock(vm);
 
-       return ret && list_empty(&vm->evicted);
+       spin_lock(&vm->status_lock);
+       empty = list_empty(&vm->evicted);
+       spin_unlock(&vm->status_lock);
+
+       return ret && empty;
 }
 
 /**
-- 
2.35.1

Reply via email to