|
@@ -215,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;
|
|
|
}
|
|
@@ -228,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;
|
|
|
}
|
|
|
|
|
@@ -240,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;
|
|
@@ -247,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);
|
|
@@ -258,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;
|
|
|
}
|