drm: don't take modeset locks in getfb ioctl
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 13 Dec 2012 22:06:08 +0000 (23:06 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Sun, 20 Jan 2013 21:17:05 +0000 (22:17 +0100)
We only need to push the fb unreference a bit down. While at it,
properly pass the return value from ->create_handle back to userspace.

Most drivers either return -ENODEV if they don't have a concept of
buffer objects (ast, cirrus, ...) or just install a handle for the
underlying gem object (which is ok since we hold a reference on that
through the framebuffer).

v2: Split out the ->create_handle rework in the individual drivers.

Reviewed-by: Rob Clark <rob@ti.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/drm_crtc.c

index 2e6103c5d63252ff80ebba280d72010f7ed64ad4..cba8c8bb789c868a81c58b0eac5767a1ab47ae40 100644 (file)
@@ -2542,19 +2542,14 @@ int drm_mode_getfb(struct drm_device *dev,
 {
        struct drm_mode_fb_cmd *r = data;
        struct drm_framebuffer *fb;
-       int ret = 0;
+       int ret;
 
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;
 
-       drm_modeset_lock_all(dev);
        fb = drm_framebuffer_lookup(dev, r->fb_id);
-       if (!fb) {
-               ret = -EINVAL;
-               goto out;
-       }
-       /* fb is protect by the mode_config lock, so drop the ref immediately */
-       drm_framebuffer_unreference(fb);
+       if (!fb)
+               return -EINVAL;
 
        r->height = fb->height;
        r->width = fb->width;
@@ -2566,8 +2561,8 @@ int drm_mode_getfb(struct drm_device *dev,
        else
                ret = -ENODEV;
 
-out:
-       drm_modeset_unlock_all(dev);
+       drm_framebuffer_unreference(fb);
+
        return ret;
 }