[Intel-gfx] [PATCH 1/3] drm: use common drm_gem_dmabuf_release in i915/exynos drivers
Inki Dae
inki.dae at samsung.com
Wed Aug 7 11:40:14 CEST 2013
> -----Original Message-----
> From: Daniel Vetter [mailto:daniel.vetter at ffwll.ch]
> Sent: Wednesday, August 07, 2013 6:15 PM
> To: DRI Development
> Cc: Intel Graphics Development; Daniel Vetter; Inki Dae
> Subject: [PATCH 1/3] drm: use common drm_gem_dmabuf_release in i915/exynos
> drivers
>
> Note that this is slightly tricky since both drivers store their
> native objects in dma_buf->priv. But both also embed the base
> drm_gem_object at the first position, so the implicit cast is ok.
>
> To use the release helper we need to export it, too.
Yeah, may I repost this patch with additional work? We also need to export
with a gem object instead of specific one like you did.
Thanks,
Inki Dae
>
> Cc: Inki Dae <inki.dae at samsung.com>
> Cc: Intel Graphics Development <intel-gfx at lists.freedesktop.org>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/gpu/drm/drm_prime.c | 3 ++-
> drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | 23 +----------------------
> drivers/gpu/drm/i915/i915_gem_dmabuf.c | 13 +------------
> include/drm/drmP.h | 1 +
> 4 files changed, 5 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 85e450e..a35f206 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -192,7 +192,7 @@ static void drm_gem_unmap_dma_buf(struct
> dma_buf_attachment *attach,
> /* nothing to be done here */
> }
>
> -static void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
> +void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
> {
> struct drm_gem_object *obj = dma_buf->priv;
>
> @@ -202,6 +202,7 @@ static void drm_gem_dmabuf_release(struct dma_buf
> *dma_buf)
> drm_gem_object_unreference_unlocked(obj);
> }
> }
> +EXPORT_SYMBOL(drm_gem_dmabuf_release);
>
> static void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf)
> {
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
> b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
> index a0f997e..3cd56e1 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
> @@ -127,27 +127,6 @@ static void exynos_gem_unmap_dma_buf(struct
> dma_buf_attachment *attach,
> /* Nothing to do. */
> }
>
> -static void exynos_dmabuf_release(struct dma_buf *dmabuf)
> -{
> - struct exynos_drm_gem_obj *exynos_gem_obj = dmabuf->priv;
> -
> - /*
> - * exynos_dmabuf_release() call means that file object's
> - * f_count is 0 and it calls drm_gem_object_handle_unreference()
> - * to drop the references that these values had been increased
> - * at drm_prime_handle_to_fd()
> - */
> - if (exynos_gem_obj->base.export_dma_buf == dmabuf) {
> - exynos_gem_obj->base.export_dma_buf = NULL;
> -
> - /*
> - * drop this gem object refcount to release allocated buffer
> - * and resources.
> - */
> - drm_gem_object_unreference_unlocked(&exynos_gem_obj->base);
> - }
> -}
> -
> static void *exynos_gem_dmabuf_kmap_atomic(struct dma_buf *dma_buf,
> unsigned long page_num)
> {
> @@ -193,7 +172,7 @@ static struct dma_buf_ops exynos_dmabuf_ops = {
> .kunmap = exynos_gem_dmabuf_kunmap,
> .kunmap_atomic = exynos_gem_dmabuf_kunmap_atomic,
> .mmap = exynos_gem_dmabuf_mmap,
> - .release = exynos_dmabuf_release,
> + .release = drm_gem_dmabuf_release,
> };
>
> struct dma_buf *exynos_dmabuf_prime_export(struct drm_device *drm_dev,
> diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> index f2e185c..63ee1a9 100644
> --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> @@ -90,17 +90,6 @@ static void i915_gem_unmap_dma_buf(struct
> dma_buf_attachment *attachment,
> kfree(sg);
> }
>
> -static void i915_gem_dmabuf_release(struct dma_buf *dma_buf)
> -{
> - struct drm_i915_gem_object *obj = dma_buf->priv;
> -
> - if (obj->base.export_dma_buf == dma_buf) {
> - /* drop the reference on the export fd holds */
> - obj->base.export_dma_buf = NULL;
> - drm_gem_object_unreference_unlocked(&obj->base);
> - }
> -}
> -
> static void *i915_gem_dmabuf_vmap(struct dma_buf *dma_buf)
> {
> struct drm_i915_gem_object *obj = dma_buf->priv;
> @@ -211,7 +200,7 @@ static int i915_gem_begin_cpu_access(struct dma_buf
> *dma_buf, size_t start, size
> static const struct dma_buf_ops i915_dmabuf_ops = {
> .map_dma_buf = i915_gem_map_dma_buf,
> .unmap_dma_buf = i915_gem_unmap_dma_buf,
> - .release = i915_gem_dmabuf_release,
> + .release = drm_gem_dmabuf_release,
> .kmap = i915_gem_dmabuf_kmap,
> .kmap_atomic = i915_gem_dmabuf_kmap_atomic,
> .kunmap = i915_gem_dmabuf_kunmap,
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 4b518e0..cc991a2 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1537,6 +1537,7 @@ extern struct drm_gem_object
> *drm_gem_prime_import(struct drm_device *dev,
> struct dma_buf *dma_buf);
> extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,
> struct drm_file *file_priv, int prime_fd, uint32_t *handle);
> +extern void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
>
> extern int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void
> *data,
> struct drm_file *file_priv);
> --
> 1.8.3.2
More information about the Intel-gfx
mailing list