diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_gem.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gem.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 21ec9f5653c..84d04524573 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c @@ -159,11 +159,9 @@ void radeon_gem_object_close(struct drm_gem_object *obj,  static int radeon_gem_handle_lockup(struct radeon_device *rdev, int r)  {  	if (r == -EDEADLK) { -		radeon_mutex_lock(&rdev->cs_mutex);  		r = radeon_gpu_reset(rdev);  		if (!r)  			r = -EAGAIN; -		radeon_mutex_unlock(&rdev->cs_mutex);  	}  	return r;  } @@ -217,12 +215,14 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,  	uint32_t handle;  	int r; +	down_read(&rdev->exclusive_lock);  	/* create a gem object to contain this object in */  	args->size = roundup(args->size, PAGE_SIZE);  	r = radeon_gem_object_create(rdev, args->size, args->alignment,  					args->initial_domain, false,  					false, &gobj);  	if (r) { +		up_read(&rdev->exclusive_lock);  		r = radeon_gem_handle_lockup(rdev, r);  		return r;  	} @@ -230,10 +230,12 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,  	/* drop reference from allocate - handle holds it now */  	drm_gem_object_unreference_unlocked(gobj);  	if (r) { +		up_read(&rdev->exclusive_lock);  		r = radeon_gem_handle_lockup(rdev, r);  		return r;  	}  	args->handle = handle; +	up_read(&rdev->exclusive_lock);  	return 0;  } @@ -242,6 +244,7 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,  {  	/* transition the BO to a domain -  	 * just validate the BO into a certain domain */ +	struct radeon_device *rdev = dev->dev_private;  	struct drm_radeon_gem_set_domain *args = data;  	struct drm_gem_object *gobj;  	struct radeon_bo *robj; @@ -249,10 +252,12 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,  	/* for now if someone requests domain CPU -  	 * just make sure the buffer is finished with */ +	down_read(&rdev->exclusive_lock);  	/* just do a BO wait for now */  	gobj = drm_gem_object_lookup(dev, filp, args->handle);  	if (gobj == NULL) { +		up_read(&rdev->exclusive_lock);  		return -ENOENT;  	}  	robj = gem_to_radeon_bo(gobj); @@ -260,6 +265,7 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,  	r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);  	drm_gem_object_unreference_unlocked(gobj); +	up_read(&rdev->exclusive_lock);  	r = radeon_gem_handle_lockup(robj->rdev, r);  	return r;  }  |