Please ignore this one, it doesn't work correctly. Validating a BO can put it back on the moved list. Christian. Am 19.04.2018 um 11:29 schrieb Christian König: > Put all moved BOs on a temporary list and splice that one to the moved > list when we are done. Saves us taking and releasing the moved lock multiple times. > > Signed-off-by: Christian König <christian.koenig at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 34 ++++++++++++++++------------------ > 1 file changed, 16 insertions(+), 18 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > index dbf24b628835..9da476637574 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > @@ -196,21 +196,18 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, > void *param) > { > struct ttm_bo_global *glob = adev->mman.bdev.glob; > - int r; > + struct amdgpu_vm_bo_base *bo_base, *tmp; > + struct list_head moved; > + int r = 0; > > - while (!list_empty(&vm->evicted)) { > - struct amdgpu_vm_bo_base *bo_base; > - struct amdgpu_bo *bo; > + INIT_LIST_HEAD(&moved); > + list_for_each_entry_safe(bo_base, tmp, &vm->evicted, vm_status) { > + struct amdgpu_bo *bo = bo_base->bo; > > - bo_base = list_first_entry(&vm->evicted, > - struct amdgpu_vm_bo_base, > - vm_status); > - > - bo = bo_base->bo; > if (bo->parent) { > r = validate(param, bo); > if (r) > - return r; > + break; > > spin_lock(&glob->lru_lock); > ttm_bo_move_to_lru_tail(&bo->tbo); > @@ -223,19 +220,20 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, > vm->use_cpu_for_update) { > r = amdgpu_bo_kmap(bo, NULL); > if (r) > - return r; > + break; > } > > - if (bo->tbo.type != ttm_bo_type_kernel) { > - spin_lock(&vm->moved_lock); > - list_move(&bo_base->vm_status, &vm->moved); > - spin_unlock(&vm->moved_lock); > - } else { > + if (bo->tbo.type != ttm_bo_type_kernel) > + list_move(&bo_base->vm_status, &moved); > + else > list_move(&bo_base->vm_status, &vm->relocated); > - } > } > > - return 0; > + spin_lock(&vm->moved_lock); > + list_splice_tail(&moved, &vm->moved); > + spin_unlock(&vm->moved_lock); > + > + return r; > } > > /**