Merge tag 'v3.5-rc7' into drm-next
[linux-2.6-microblaze.git] / drivers / gpu / drm / radeon / radeon_gem.c
index 21ec9f5..84d0452 100644 (file)
@@ -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;
 }