diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 23 | 
1 files changed, 15 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 596f1ea8babc..4a1cb20deb2d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -240,10 +240,13 @@ static void amdgpu_vm_bo_invalidated(struct amdgpu_vm_bo_base *vm_bo)   */  static void amdgpu_vm_bo_relocated(struct amdgpu_vm_bo_base *vm_bo)  { -	if (vm_bo->bo->parent) +	if (vm_bo->bo->parent) { +		spin_lock(&vm_bo->vm->status_lock);  		list_move(&vm_bo->vm_status, &vm_bo->vm->relocated); -	else +		spin_unlock(&vm_bo->vm->status_lock); +	} else {  		amdgpu_vm_bo_idle(vm_bo); +	}  }  /** @@ -680,9 +683,14 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	struct amdgpu_vm_update_params params;  	struct amdgpu_vm_bo_base *entry;  	bool flush_tlb_needed = false; +	LIST_HEAD(relocated);  	int r, idx; -	if (list_empty(&vm->relocated)) +	spin_lock(&vm->status_lock); +	list_splice_init(&vm->relocated, &relocated); +	spin_unlock(&vm->status_lock); + +	if (list_empty(&relocated))  		return 0;  	if (!drm_dev_enter(adev_to_drm(adev), &idx)) @@ -697,7 +705,7 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	if (r)  		goto error; -	list_for_each_entry(entry, &vm->relocated, vm_status) { +	list_for_each_entry(entry, &relocated, vm_status) {  		/* vm_flush_needed after updating moved PDEs */  		flush_tlb_needed |= entry->moved; @@ -713,9 +721,8 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	if (flush_tlb_needed)  		atomic64_inc(&vm->tlb_seq); -	while (!list_empty(&vm->relocated)) { -		entry = list_first_entry(&vm->relocated, -					 struct amdgpu_vm_bo_base, +	while (!list_empty(&relocated)) { +		entry = list_first_entry(&relocated, struct amdgpu_vm_bo_base,  					 vm_status);  		amdgpu_vm_bo_idle(entry);  	} @@ -912,6 +919,7 @@ void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem,  {  	struct amdgpu_bo_va *bo_va, *tmp; +	spin_lock(&vm->status_lock);  	list_for_each_entry_safe(bo_va, tmp, &vm->idle, base.vm_status) {  		if (!bo_va->base.bo)  			continue; @@ -936,7 +944,6 @@ void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem,  		amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,  				gtt_mem, cpu_mem);  	} -	spin_lock(&vm->status_lock);  	list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, base.vm_status) {  		if (!bo_va->base.bo)  			continue; | 
