From ad1231080be5a5cb34bbecf08fa3fea50209ef94 Mon Sep 17 00:00:00 2001 From: Nicolai Hähnle Date: Thu, 1 Dec 2016 15:06:44 +0100 Subject: drm/vgem: Use ww_mutex_(un)lock even with a NULL context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v2: use resv->lock instead of resv->lock.base (Christian König) Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Maarten Lankhorst Cc: Daniel Vetter Cc: Chris Wilson Cc: dri-devel@lists.freedesktop.org Signed-off-by: Nicolai Hähnle Reviewed-by: Chris Wilson Signed-off-by: Daniel Vetter Link: http://patchwork.freedesktop.org/patch/msgid/1480601214-26583-2-git-send-email-nhaehnle@gmail.com --- drivers/gpu/drm/vgem/vgem_fence.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/drm/vgem/vgem_fence.c') diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c index 488909a21ed8..9cb00a5d5d08 100644 --- a/drivers/gpu/drm/vgem/vgem_fence.c +++ b/drivers/gpu/drm/vgem/vgem_fence.c @@ -191,12 +191,12 @@ int vgem_fence_attach_ioctl(struct drm_device *dev, /* Expose the fence via the dma-buf */ ret = 0; - mutex_lock(&resv->lock.base); + ww_mutex_lock(&resv->lock, NULL); if (arg->flags & VGEM_FENCE_WRITE) reservation_object_add_excl_fence(resv, fence); else if ((ret = reservation_object_reserve_shared(resv)) == 0) reservation_object_add_shared_fence(resv, fence); - mutex_unlock(&resv->lock.base); + ww_mutex_unlock(&resv->lock); /* Record the fence in our idr for later signaling */ if (ret == 0) { -- cgit v1.2.3 From 72a93e8dd52c9feea42f1258d555e6070680a347 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 7 Dec 2016 21:45:27 +0000 Subject: 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 [danvet: Update kerneldoc.] Signed-off-by: Daniel Vetter Link: http://patchwork.freedesktop.org/patch/msgid/20161207214527.22533-1-chris@chris-wilson.co.uk --- drivers/gpu/drm/drm_prime.c | 12 +++++++----- drivers/gpu/drm/vgem/vgem_fence.c | 1 - 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'drivers/gpu/drm/vgem/vgem_fence.c') 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, * * 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; } 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, return PTR_ERR(dmabuf); obj->dma_buf = dmabuf; - drm_gem_object_reference(obj); return 0; } -- cgit v1.2.3