aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-12-07 16:45:27 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-12-08 04:29:22 -0500
commit72a93e8dd52c9feea42f1258d555e6070680a347 (patch)
tree881432ea83e9dfb888bfd5a52d5175f22703a4a9
parentf3f4c4d68a2862c361fd9890998275da5ef02724 (diff)
drm: Take ownership of the dmabuf->obj when exporting
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
-rw-r--r--drivers/gpu/drm/drm_prime.c12
-rw-r--r--drivers/gpu/drm/vgem/vgem_fence.c1
2 files changed, 7 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index b22a94dd7b53..8d77b2462594 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -290,7 +290,8 @@ static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
290 * 290 *
291 * This wraps dma_buf_export() for use by generic GEM drivers that are using 291 * This wraps dma_buf_export() for use by generic GEM drivers that are using
292 * drm_gem_dmabuf_release(). In addition to calling dma_buf_export(), we take 292 * drm_gem_dmabuf_release(). In addition to calling dma_buf_export(), we take
293 * a reference to the drm_device which is released by drm_gem_dmabuf_release(). 293 * a reference to the &drm_device and the exported &drm_gem_object (stored in
294 * exp_info->priv) which is released by drm_gem_dmabuf_release().
294 * 295 *
295 * Returns the new dmabuf. 296 * Returns the new dmabuf.
296 */ 297 */
@@ -300,8 +301,11 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
300 struct dma_buf *dma_buf; 301 struct dma_buf *dma_buf;
301 302
302 dma_buf = dma_buf_export(exp_info); 303 dma_buf = dma_buf_export(exp_info);
303 if (!IS_ERR(dma_buf)) 304 if (IS_ERR(dma_buf))
304 drm_dev_ref(dev); 305 return dma_buf;
306
307 drm_dev_ref(dev);
308 drm_gem_object_reference(exp_info->priv);
305 309
306 return dma_buf; 310 return dma_buf;
307} 311}
@@ -472,8 +476,6 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
472 */ 476 */
473 obj->dma_buf = dmabuf; 477 obj->dma_buf = dmabuf;
474 get_dma_buf(obj->dma_buf); 478 get_dma_buf(obj->dma_buf);
475 /* Grab a new ref since the callers is now used by the dma-buf */
476 drm_gem_object_reference(obj);
477 479
478 return dmabuf; 480 return dmabuf;
479} 481}
diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
index 9cb00a5d5d08..da25dfe7b80e 100644
--- a/drivers/gpu/drm/vgem/vgem_fence.c
+++ b/drivers/gpu/drm/vgem/vgem_fence.c
@@ -126,7 +126,6 @@ static int attach_dmabuf(struct drm_device *dev,
126 return PTR_ERR(dmabuf); 126 return PTR_ERR(dmabuf);
127 127
128 obj->dma_buf = dmabuf; 128 obj->dma_buf = dmabuf;
129 drm_gem_object_reference(obj);
130 return 0; 129 return 0;
131} 130}
132 131