diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 17 | 
2 files changed, 12 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 306f75700bf8..50672bb19798 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -496,6 +496,7 @@ struct amdgpu_bo_va_mapping {  /* bo virtual addresses in a specific vm */  struct amdgpu_bo_va { +	struct mutex		        mutex;  	/* protected by bo being reserved */  	struct list_head		bo_list;  	struct fence		        *last_pt_update; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 159ce54bbd8d..d6904ef742f0 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);  } | 
