diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 19 | 
1 files changed, 11 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 159ce54bbd8d..ae037e5b6ad0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -922,8 +922,9 @@ int amdgpu_vm_clear_invalids(struct amdgpu_device *adev,  		bo_va = list_first_entry(&vm->invalidated,  			struct amdgpu_bo_va, vm_status);  		spin_unlock(&vm->status_lock); - +		mutex_lock(&bo_va->mutex);  		r = amdgpu_vm_bo_update(adev, bo_va, NULL); +		mutex_unlock(&bo_va->mutex);  		if (r)  			return r; @@ -967,7 +968,7 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,  	INIT_LIST_HEAD(&bo_va->valids);  	INIT_LIST_HEAD(&bo_va->invalids);  	INIT_LIST_HEAD(&bo_va->vm_status); - +	mutex_init(&bo_va->mutex);  	list_add_tail(&bo_va->bo_list, &bo->va);  	return bo_va; @@ -1045,7 +1046,9 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,  	mapping->offset = offset;  	mapping->flags = flags; +	mutex_lock(&bo_va->mutex);  	list_add(&mapping->list, &bo_va->invalids); +	mutex_unlock(&bo_va->mutex);  	spin_lock(&vm->it_lock);  	interval_tree_insert(&mapping->it, &vm->va);  	spin_unlock(&vm->it_lock); @@ -1121,7 +1124,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,  	bool valid = true;  	saddr /= AMDGPU_GPU_PAGE_SIZE; - +	mutex_lock(&bo_va->mutex);  	list_for_each_entry(mapping, &bo_va->valids, list) {  		if (mapping->it.start == saddr)  			break; @@ -1135,10 +1138,12 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,  				break;  		} -		if (&mapping->list == &bo_va->invalids) +		if (&mapping->list == &bo_va->invalids) { +			mutex_unlock(&bo_va->mutex);  			return -ENOENT; +		}  	} - +	mutex_unlock(&bo_va->mutex);  	list_del(&mapping->list);  	spin_lock(&vm->it_lock);  	interval_tree_remove(&mapping->it, &vm->va); @@ -1190,8 +1195,8 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,  		spin_unlock(&vm->it_lock);  		kfree(mapping);  	} -  	fence_put(bo_va->last_pt_update); +	mutex_destroy(&bo_va->mutex);  	kfree(bo_va);  } @@ -1236,7 +1241,6 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)  		vm->ids[i].id = 0;  		vm->ids[i].flushed_updates = NULL;  	} -	mutex_init(&vm->mutex);  	vm->va = RB_ROOT;  	spin_lock_init(&vm->status_lock);  	INIT_LIST_HEAD(&vm->invalidated); @@ -1320,7 +1324,6 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)  		fence_put(vm->ids[i].flushed_updates);  	} -	mutex_destroy(&vm->mutex);  }  /** |