drm: Take ownership of the dmabuf->obj when exporting
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 7 Dec 2016 21:45:27 +0000 (21:45 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 8 Dec 2016 09:29:22 +0000 (10:29 +0100)
Currently the reference for the dmabuf->obj is incremented for the
dmabuf in drm_gem_prime_handle_to_fd() (at the high level userspace
interface), but is released in drm_gem_dmabuf_release() (the lowlevel
handler). Improve the symmetry of the dmabuf->obj ownership by acquiring
the reference in drm_gem_dmabuf_export(). This makes it easier to use
the prime functions directly.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: Update kerneldoc.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161207214527.22533-1-chris@chris-wilson.co.uk
drivers/gpu/drm/drm_prime.c
drivers/gpu/drm/vgem/vgem_fence.c

index b22a94dd7b53fcf2459328e5852cff6b3833f447..8d77b2462594b8d1f316401d0e9ced67dc641d53 100644 (file)
@@ -290,7 +290,8 @@ static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
  *
  * This wraps dma_buf_export() for use by generic GEM drivers that are using
  * drm_gem_dmabuf_release(). In addition to calling dma_buf_export(), we take
- * a reference to the drm_device which is released by drm_gem_dmabuf_release().
+ * a reference to the &drm_device and the exported &drm_gem_object (stored in
+ * exp_info->priv) which is released by drm_gem_dmabuf_release().
  *
  * Returns the new dmabuf.
  */
@@ -300,8 +301,11 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
        struct dma_buf *dma_buf;
 
        dma_buf = dma_buf_export(exp_info);
-       if (!IS_ERR(dma_buf))
-               drm_dev_ref(dev);
+       if (IS_ERR(dma_buf))
+               return dma_buf;
+
+       drm_dev_ref(dev);
+       drm_gem_object_reference(exp_info->priv);
 
        return dma_buf;
 }
@@ -472,8 +476,6 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
         */
        obj->dma_buf = dmabuf;
        get_dma_buf(obj->dma_buf);
-       /* Grab a new ref since the callers is now used by the dma-buf */
-       drm_gem_object_reference(obj);
 
        return dmabuf;
 }
index 9cb00a5d5d08ca0fab86be865f321a223c01d1cc..da25dfe7b80eed1a0f8fa90f01ef7fe664af174f 100644 (file)
@@ -126,7 +126,6 @@ static int attach_dmabuf(struct drm_device *dev,
                return PTR_ERR(dmabuf);
 
        obj->dma_buf = dmabuf;
-       drm_gem_object_reference(obj);
        return 0;
 }