diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-07 16:45:27 -0500 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-12-08 04:29:22 -0500 |
| commit | 72a93e8dd52c9feea42f1258d555e6070680a347 (patch) | |
| tree | 881432ea83e9dfb888bfd5a52d5175f22703a4a9 | |
| parent | f3f4c4d68a2862c361fd9890998275da5ef02724 (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.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/vgem/vgem_fence.c | 1 |
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 | ||
