diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 27 | 
1 files 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 168875115538..b2e96682b9bb 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;  }  /** | 
