All of lore.kernel.org
 help / color / mirror / Atom feed
From: 김승우 <sw0312.kim@samsung.com>
To: Jani Nikula <jani.nikula@linux.intel.com>
Cc: daniel.vetter@ffwll.ch, dri-devel@lists.freedesktop.org,
	rob.clark@linaro.org, kyungmin.park@samsung.com,
	alexander.deucher@amd.com
Subject: Re: [PATCH] drm/prime: drop reference on imported dma-buf come from gem
Date: Sat, 03 Nov 2012 16:59:47 +0900	[thread overview]
Message-ID: <5094CEF3.9020301@samsung.com> (raw)
In-Reply-To: <874nmjh995.fsf@intel.com>

Hi Jani,

Sorry for late reply.

On 2012년 09월 27일 22:43, Jani Nikula wrote:
> On Thu, 27 Sep 2012, Seung-Woo Kim <sw0312.kim@samsung.com> wrote:
>> Increasing ref counts of both dma-buf and gem for imported dma-buf come from gem
>> makes memory leak. release function of dma-buf cannot be called because f_count
>> of dma-buf increased by importing gem and gem ref count cannot be decrease
>> because of exported dma-buf.
>>
>> So I add dma_buf_put() for imported gem come from its own gem into each drivers
>> having prime_import and prime_export capabilities. With this, only gem ref
>> count is increased if importing gem exported from gem of same driver.
> 
> There's a reference leak bug [1] related to prime self import found by
> intel-gpu-tools tests. Without much thinking, I just applied this patch
> to see if it makes a difference. Instead, it now fails with:
> 
> prime_self_import: prime_self_import.c:61: check_bo: Assertion `ptr1'
> failed.
> 
> The assert is at [2].

I think it was possible to re-use a handle imported_buf list which is
already deleted, and it was fixed after Dave's commit "drm/prime: add
exported buffers to current fprivs imported buffer list (v2)".

> 
> I haven't looked into why this happens at all, so I'm just sharing this
> in case you guys find it helpful.

If you still have same assert, I think it will be very helpful to let me
know exactly where the assert occurs from 5 check_bo() in test
application in your link.

Thanks and Best Regards,
- Seung-Woo Kim

> 
> BR,
> Jani.
> 
> 
> 
> [1] https://bugs.freedesktop.org/show_bug.cgi?id=54111
> [2] http://cgit.freedesktop.org/xorg/app/intel-gpu-tools/tree/tests/prime_self_import.c#n61
> 
> 
>>
>> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
>> Signed-off-by: Kyungmin.park <kyungmin.park@samsung.com>
>> Cc: Inki Dae <inki.dae@samsung.com>
>> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
>> Cc: Rob Clark <rob.clark@linaro.org>
>> Cc: Alex Deucher <alexander.deucher@amd.com>
>> ---
>>  drivers/gpu/drm/exynos/exynos_drm_dmabuf.c |    5 +++++
>>  drivers/gpu/drm/i915/i915_gem_dmabuf.c     |    5 +++++
>>  drivers/gpu/drm/nouveau/nouveau_prime.c    |    1 +
>>  drivers/gpu/drm/radeon/radeon_prime.c      |    1 +
>>  drivers/staging/omapdrm/omap_gem_dmabuf.c  |    5 +++++
>>  5 files changed, 17 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
>> index ae13feb..b0897c9 100644
>> --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
>> +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
>> @@ -211,7 +211,12 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,
>>  
>>  		/* is it from our device? */
>>  		if (obj->dev == drm_dev) {
>> +			/*
>> +			 * Importing dmabuf exported from out own gem increases
>> +			 * refcount on gem itself instead of f_count of dmabuf.
>> +			 */
>>  			drm_gem_object_reference(obj);
>> +			dma_buf_put(dma_buf);
>>  			return obj;
>>  		}
>>  	}
>> diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
>> index aa308e1..32e6287 100644
>> --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
>> +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
>> @@ -188,7 +188,12 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
>>  		obj = dma_buf->priv;
>>  		/* is it from our device? */
>>  		if (obj->base.dev == dev) {
>> +			/*
>> +			 * Importing dmabuf exported from out own gem increases
>> +			 * refcount on gem itself instead of f_count of dmabuf.
>> +			 */
>>  			drm_gem_object_reference(&obj->base);
>> +			dma_buf_put(dma_buf);
>>  			return &obj->base;
>>  		}
>>  	}
>> diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c
>> index a25cf2c..bb653c6 100644
>> --- a/drivers/gpu/drm/nouveau/nouveau_prime.c
>> +++ b/drivers/gpu/drm/nouveau/nouveau_prime.c
>> @@ -199,6 +199,7 @@ struct drm_gem_object *nouveau_gem_prime_import(struct drm_device *dev,
>>  		if (nvbo->gem) {
>>  			if (nvbo->gem->dev == dev) {
>>  				drm_gem_object_reference(nvbo->gem);
>> +				dma_buf_put(dma_buf);
>>  				return nvbo->gem;
>>  			}
>>  		}
>> diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
>> index 6bef46a..d344a3be 100644
>> --- a/drivers/gpu/drm/radeon/radeon_prime.c
>> +++ b/drivers/gpu/drm/radeon/radeon_prime.c
>> @@ -195,6 +195,7 @@ struct drm_gem_object *radeon_gem_prime_import(struct drm_device *dev,
>>  		bo = dma_buf->priv;
>>  		if (bo->gem_base.dev == dev) {
>>  			drm_gem_object_reference(&bo->gem_base);
>> +			dma_buf_put(dma_buf);
>>  			return &bo->gem_base;
>>  		}
>>  	}
>> diff --git a/drivers/staging/omapdrm/omap_gem_dmabuf.c b/drivers/staging/omapdrm/omap_gem_dmabuf.c
>> index 42728e0..5b50eb6 100644
>> --- a/drivers/staging/omapdrm/omap_gem_dmabuf.c
>> +++ b/drivers/staging/omapdrm/omap_gem_dmabuf.c
>> @@ -207,7 +207,12 @@ struct drm_gem_object * omap_gem_prime_import(struct drm_device *dev,
>>  		obj = buffer->priv;
>>  		/* is it from our device? */
>>  		if (obj->dev == dev) {
>> +			/*
>> +			 * Importing dmabuf exported from out own gem increases
>> +			 * refcount on gem itself instead of f_count of dmabuf.
>> +			 */
>>  			drm_gem_object_reference(obj);
>> +			dma_buf_put(buffer);
>>  			return obj;
>>  		}
>>  	}
>> -- 
>> 1.7.4.1
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
> 

-- 
Seung-Woo Kim
Samsung Software R&D Center
--

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2012-11-03  7:59 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-27  6:30 [PATCH] drm/prime: drop reference on imported dma-buf come from gem Seung-Woo Kim
2012-09-27  6:52 ` Rob Clark
2012-09-27  7:14   ` 김승우
2012-09-27  7:38     ` Rob Clark
2012-09-27 13:43 ` Jani Nikula
2012-11-03  7:59   ` 김승우 [this message]
2012-11-15  3:52 ` [RESEND][PATCH] " Seung-Woo Kim
2012-11-19  8:40   ` Inki Dae
2012-11-19 10:27   ` Maarten Lankhorst
2012-11-20  1:03     ` 김승우
2012-11-20 10:26       ` Maarten Lankhorst
2012-11-21  5:28         ` 김승우
2012-12-18  6:30 ` [PATCH] " Dave Airlie
2012-12-18  6:59   ` 김승우
2012-12-20  0:48     ` Dave Airlie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5094CEF3.9020301@samsung.com \
    --to=sw0312.kim@samsung.com \
    --cc=alexander.deucher@amd.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jani.nikula@linux.intel.com \
    --cc=kyungmin.park@samsung.com \
    --cc=rob.clark@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.