diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 45 | 
1 files changed, 23 insertions, 22 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 7297ca3a0ba7..fc32fc01a64b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -115,11 +115,9 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri  	struct amdgpu_vm *vm = &fpriv->vm;  	struct amdgpu_bo_va *bo_va;  	int r; -  	r = amdgpu_bo_reserve(rbo, false); -	if (r) { +	if (r)  		return r; -	}  	bo_va = amdgpu_vm_bo_find(vm, rbo);  	if (!bo_va) { @@ -128,7 +126,6 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri  		++bo_va->ref_count;  	}  	amdgpu_bo_unreserve(rbo); -  	return 0;  } @@ -141,7 +138,6 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,  	struct amdgpu_vm *vm = &fpriv->vm;  	struct amdgpu_bo_va *bo_va;  	int r; -  	r = amdgpu_bo_reserve(rbo, true);  	if (r) {  		dev_err(adev->dev, "leaking bo va because " @@ -181,7 +177,6 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,  	bool kernel = false;  	int r; -	down_read(&adev->exclusive_lock);  	/* create a gem object to contain this object in */  	if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |  	    AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) { @@ -214,11 +209,9 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,  	memset(args, 0, sizeof(*args));  	args->out.handle = handle; -	up_read(&adev->exclusive_lock);  	return 0;  error_unlock: -	up_read(&adev->exclusive_lock);  	r = amdgpu_gem_handle_lockup(adev, r);  	return r;  } @@ -250,8 +243,6 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,  		return -EACCES;  	} -	down_read(&adev->exclusive_lock); -  	/* create a gem object to contain this object in */  	r = amdgpu_gem_object_create(adev, args->size, 0,  				     AMDGPU_GEM_DOMAIN_CPU, 0, @@ -293,14 +284,12 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,  		goto handle_lockup;  	args->handle = handle; -	up_read(&adev->exclusive_lock);  	return 0;  release_object:  	drm_gem_object_unreference_unlocked(gobj);  handle_lockup: -	up_read(&adev->exclusive_lock);  	r = amdgpu_gem_handle_lockup(adev, r);  	return r; @@ -487,19 +476,17 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,  		if (domain == AMDGPU_GEM_DOMAIN_CPU)  			goto error_unreserve;  	} +	r = amdgpu_vm_update_page_directory(adev, bo_va->vm); +	if (r) +		goto error_unreserve; -	mutex_lock(&bo_va->vm->mutex);  	r = amdgpu_vm_clear_freed(adev, bo_va->vm);  	if (r) -		goto error_unlock; - +		goto error_unreserve;  	if (operation == AMDGPU_VA_OP_MAP)  		r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem); -error_unlock: -	mutex_unlock(&bo_va->vm->mutex); -  error_unreserve:  	ttm_eu_backoff_reservation(&ticket, &list); @@ -521,6 +508,9 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	struct amdgpu_fpriv *fpriv = filp->driver_priv;  	struct amdgpu_bo *rbo;  	struct amdgpu_bo_va *bo_va; +	struct ttm_validate_buffer tv, tv_pd; +	struct ww_acquire_ctx ticket; +	struct list_head list, duplicates;  	uint32_t invalid_flags, va_flags = 0;  	int r = 0; @@ -556,9 +546,19 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	gobj = drm_gem_object_lookup(dev, filp, args->handle);  	if (gobj == NULL)  		return -ENOENT; -  	rbo = gem_to_amdgpu_bo(gobj); -	r = amdgpu_bo_reserve(rbo, false); +	INIT_LIST_HEAD(&list); +	INIT_LIST_HEAD(&duplicates); +	tv.bo = &rbo->tbo; +	tv.shared = true; +	list_add(&tv.head, &list); + +	if (args->operation == AMDGPU_VA_OP_MAP) { +		tv_pd.bo = &fpriv->vm.page_directory->tbo; +		tv_pd.shared = true; +		list_add(&tv_pd.head, &list); +	} +	r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates);  	if (r) {  		drm_gem_object_unreference_unlocked(gobj);  		return r; @@ -566,7 +566,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	bo_va = amdgpu_vm_bo_find(&fpriv->vm, rbo);  	if (!bo_va) { -		amdgpu_bo_unreserve(rbo); +		ttm_eu_backoff_reservation(&ticket, &list); +		drm_gem_object_unreference_unlocked(gobj);  		return -ENOENT;  	} @@ -588,7 +589,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	default:  		break;  	} - +	ttm_eu_backoff_reservation(&ticket, &list);  	if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE))  		amdgpu_gem_va_update_vm(adev, bo_va, args->operation); |