All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Cc: "Neil Armstrong" <neil.armstrong@linaro.org>,
	"Nicolas Boichat" <drinkcat@chromium.org>,
	"Daniel Stone" <daniels@collabora.com>,
	"Liviu Dudau" <Liviu.Dudau@arm.com>,
	dri-devel@lists.freedesktop.org,
	"Steven Price" <steven.price@arm.com>,
	"Clément Péron" <peron.clem@gmail.com>,
	"Marty E . Plummer" <hanetzer@startmail.com>,
	"Robin Murphy" <robin.murphy@arm.com>,
	"Faith Ekstrand" <faith.ekstrand@collabora.com>
Subject: Re: [PATCH v2 01/15] drm/shmem-helper: Make pages_use_count an atomic_t
Date: Mon, 28 Aug 2023 11:03:31 +0200	[thread overview]
Message-ID: <20230828110331.0c17976d@collabora.com> (raw)
In-Reply-To: <7327e03f-2ce9-f35b-4281-d2cfb57d2bf3@collabora.com>

On Sat, 19 Aug 2023 05:13:06 +0300
Dmitry Osipenko <dmitry.osipenko@collabora.com> wrote:

> On 8/11/23 16:08, Steven Price wrote:
> > On 09/08/2023 17:53, Boris Brezillon wrote:  
> >> This way we can grab a pages ref without acquiring the resv lock when
> >> pages_use_count > 0. Need to implement asynchronous map using the  
> > 
> > NIT: s/Need/This is needed/
> >   
> >> drm_gpuva_mgr when the map/unmap operation triggers a mapping split,
> >> requiring the new left/right regions to grab an additional page ref
> >> to guarantee that the pages stay pinned when the middle section is
> >> unmapped.
> >>
> >> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> >> ---
> >>  drivers/gpu/drm/drm_gem_shmem_helper.c  | 28 +++++++++++++------------
> >>  drivers/gpu/drm/lima/lima_gem.c         |  2 +-
> >>  drivers/gpu/drm/panfrost/panfrost_mmu.c |  2 +-
> >>  include/drm/drm_gem_shmem_helper.h      |  2 +-
> >>  4 files changed, 18 insertions(+), 16 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> >> index a783d2245599..ca6938ea1b82 100644
> >> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> >> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> >> @@ -155,7 +155,7 @@ void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem)
> >>  		if (shmem->pages)
> >>  			drm_gem_shmem_put_pages(shmem);
> >>  
> >> -		drm_WARN_ON(obj->dev, shmem->pages_use_count);
> >> +		drm_WARN_ON(obj->dev, atomic_read(&shmem->pages_use_count));
> >>  
> >>  		dma_resv_unlock(shmem->base.resv);
> >>  	}
> >> @@ -172,14 +172,14 @@ static int drm_gem_shmem_get_pages(struct drm_gem_shmem_object *shmem)
> >>  
> >>  	dma_resv_assert_held(shmem->base.resv);
> >>  
> >> -	if (shmem->pages_use_count++ > 0)
> >> +	if (atomic_inc_return(&shmem->pages_use_count) > 1)
> >>  		return 0;
> >>  
> >>  	pages = drm_gem_get_pages(obj);
> >>  	if (IS_ERR(pages)) {
> >>  		drm_dbg_kms(obj->dev, "Failed to get pages (%ld)\n",
> >>  			    PTR_ERR(pages));
> >> -		shmem->pages_use_count = 0;
> >> +		atomic_set(&shmem->pages_use_count, 0);
> >>  		return PTR_ERR(pages);
> >>  	}
> >>  
> >> @@ -210,10 +210,10 @@ void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem)
> >>  
> >>  	dma_resv_assert_held(shmem->base.resv);
> >>  
> >> -	if (drm_WARN_ON_ONCE(obj->dev, !shmem->pages_use_count))
> >> +	if (drm_WARN_ON_ONCE(obj->dev, !atomic_read(&shmem->pages_use_count)))
> >>  		return;
> >>  
> >> -	if (--shmem->pages_use_count > 0)
> >> +	if (atomic_dec_return(&shmem->pages_use_count) > 0)
> >>  		return;
> >>  
> >>  #ifdef CONFIG_X86
> >> @@ -263,6 +263,10 @@ int drm_gem_shmem_pin(struct drm_gem_shmem_object *shmem)
> >>  
> >>  	drm_WARN_ON(obj->dev, obj->import_attach);
> >>  
> >> +	/* If we are the first owner, we need to grab the lock. */
> >> +	if (atomic_inc_not_zero(&shmem->pages_use_count))
> >> +		return 0;
> >> +  
> > 
> > Unless I'm misunderstanding I think this introduces a race where two
> > threads call drm_gem_shmem_pin() at the same time:
> > 
> > Thread1				| Thread 2
> > --------------------------------+------------------------------
> > drm_gem_shmem_pin()		|
> >  - pages_use_count == 0 so not  |
> >    incremented                  |
> >  - lock taken			|
> > drm_gem_shmem_pin_locked()	|
> > drm_gem_shmem_get_pages()	|
> >  - pages_use_count incremented	|
> > <thread descheduled>            | drm_gem_shmem_pin()
> >                                 |  - pages_use_count == 1 so is it
> > 				|    incremented and returns early
> > 				|    without taking the lock
> > 				| Code tries to use shmem->pages
> > <thread rescheduled>		| and blows up
> > drm_gem_get_pages()		|
> > shmem->pages populated		|
> > lock released			|
> > 
> > I think you need to modify drm_gem_shmem_get_pages() to only increment
> > pages_use_count when shmem->pages has been populated.

Oops, didn't spot that race. Thanks for pointing it out.

> 
> This is correct, both pin() and get_pages() should use
> atomic_inc_not_zero().
> 
> Note that we shouldn't use atomic functions open-coded, there is kref
> helper for that which uses refcount_t underneath and has additional
> checks/warnings for count underflow/overflow. I'm going to post patches
> converting drm-shmem to kref around next week, Boris is aware about it
> and we should then sync shrinker/panthor patchsets to the common
> drm-shmem base.

Thanks, I'll have a look at these patches pretty soon.

  reply	other threads:[~2023-08-28  9:03 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-09 16:53 [PATCH v2 00/15] drm: Add a driver for FW-based Mali GPUs Boris Brezillon
2023-08-09 16:53 ` [PATCH v2 01/15] drm/shmem-helper: Make pages_use_count an atomic_t Boris Brezillon
2023-08-11 13:08   ` Steven Price
2023-08-19  2:13     ` Dmitry Osipenko
2023-08-28  9:03       ` Boris Brezillon [this message]
2023-08-09 16:53 ` [PATCH v2 02/15] drm/panthor: Add uAPI Boris Brezillon
2023-08-11 14:13   ` Steven Price
2023-09-01 13:59   ` Liviu Dudau
2023-09-01 16:10   ` Boris Brezillon
2023-09-04  7:42     ` Steven Price
2023-09-04  8:26       ` Boris Brezillon
2023-09-04  9:26       ` Boris Brezillon
2023-09-04 15:22         ` Steven Price
2023-09-04 16:16           ` Boris Brezillon
2023-09-04 16:25             ` Robin Murphy
2023-09-06 10:55               ` Steven Price
2023-09-04 16:06   ` Robin Murphy
2023-09-06 12:18   ` Ketil Johnsen
2023-08-09 16:53 ` [PATCH v2 03/15] drm/panthor: Add GPU register definitions Boris Brezillon
2023-08-11 14:13   ` Steven Price
2023-08-29 13:00     ` Boris Brezillon
2023-08-09 16:53 ` [PATCH v2 04/15] drm/panthor: Add the device logical block Boris Brezillon
2023-08-11 15:47   ` Steven Price
2023-08-29 14:00     ` Boris Brezillon
2023-08-30 13:17       ` Steven Price
2023-08-30 14:06         ` Boris Brezillon
2023-09-04 11:46         ` Liviu Dudau
2023-08-09 16:53 ` [PATCH v2 05/15] drm/panthor: Add the GPU " Boris Brezillon
2023-08-14 10:54   ` Steven Price
2023-08-21 16:09     ` Robin Murphy
2023-08-23  8:48       ` Steven Price
2023-08-29 14:42       ` Boris Brezillon
2023-08-29 14:40     ` Boris Brezillon
2023-08-09 16:53 ` [PATCH v2 06/15] drm/panthor: Add GEM " Boris Brezillon
2023-08-14 13:40   ` Steven Price
2023-08-29 14:45     ` Boris Brezillon
2023-08-09 16:53 ` [PATCH v2 07/15] drm/panthor: Add the devfreq " Boris Brezillon
2023-08-14 13:45   ` Steven Price
2023-08-09 16:53 ` [PATCH v2 08/15] drm/panthor: Add the MMU/VM " Boris Brezillon
2023-08-14 15:53   ` Steven Price
2023-08-29 15:33     ` Boris Brezillon
2023-08-30 14:12       ` Steven Price
2023-08-30 14:53         ` Boris Brezillon
2023-08-30 15:55           ` Steven Price
2023-08-09 16:53 ` [PATCH v2 09/15] drm/panthor: Add the FW " Boris Brezillon
2023-08-16 16:01   ` Steven Price
2023-08-29 16:15     ` Boris Brezillon
2023-08-30 15:20       ` Steven Price
2023-08-09 16:53 ` [PATCH v2 10/15] drm/panthor: Add the heap " Boris Brezillon
2023-08-18 14:39   ` Steven Price
2023-08-29 16:21     ` Boris Brezillon
2023-08-09 16:53 ` [PATCH v2 11/15] drm/panthor: Add the scheduler " Boris Brezillon
2023-08-18 15:38   ` Steven Price
2023-08-29 16:36     ` Boris Brezillon
2023-08-09 16:53 ` [PATCH v2 12/15] drm/panthor: Add the driver frontend block Boris Brezillon
2023-08-21 11:31   ` Steven Price
2023-08-29 17:46     ` Boris Brezillon
2023-08-31 14:42       ` Steven Price
2023-09-06 12:38   ` Ketil Johnsen
2023-09-06 13:05     ` Boris Brezillon
2023-08-09 16:53 ` [PATCH v2 13/15] drm/panthor: Allow driver compilation Boris Brezillon
2023-08-11 16:35   ` Robin Murphy
2023-08-11 16:56     ` Daniel Stone
2023-08-11 19:26       ` Robin Murphy
2023-08-14 11:18         ` Steven Price
2023-08-21 17:56           ` Robin Murphy
2023-08-23  9:17             ` Steven Price
2023-08-29 12:51             ` Boris Brezillon
2023-08-21 12:47   ` Steven Price
2023-08-09 16:53 ` [PATCH v2 14/15] dt-bindings: gpu: mali-valhall-csf: Add initial bindings for panthor driver Boris Brezillon
2023-08-09 16:53   ` Boris Brezillon
2023-08-20  8:01   ` Krzysztof Kozlowski
2023-08-20  8:01     ` Krzysztof Kozlowski
2023-09-20 13:41     ` Liviu Dudau
2023-09-20 13:41       ` Liviu Dudau
2023-09-20 13:51       ` Krzysztof Kozlowski
2023-09-20 13:51         ` Krzysztof Kozlowski
2023-09-20 14:25         ` Liviu Dudau
2023-09-20 14:25           ` Liviu Dudau
2023-09-20 15:31           ` Krzysztof Kozlowski
2023-09-20 15:31             ` Krzysztof Kozlowski
2023-09-20 13:56       ` Boris Brezillon
2023-09-20 13:56         ` Boris Brezillon
2023-09-20 14:03         ` Liviu Dudau
2023-08-09 16:53 ` [PATCH v2 15/15] drm/panthor: Add an entry to MAINTAINERS Boris Brezillon
2023-08-11 16:08   ` Steven Price
2023-08-29 17:48     ` Boris Brezillon
2023-08-31 13:18   ` Liviu Dudau
2023-08-31 13:25     ` Boris Brezillon
2023-08-09 20:22 ` [PATCH v2 00/15] drm: Add a driver for FW-based Mali GPUs Rob Herring
2023-08-10 15:44   ` Boris Brezillon
2023-08-21 14:01     ` Rob Herring
2023-09-27 15:47 ` Steven Price

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=20230828110331.0c17976d@collabora.com \
    --to=boris.brezillon@collabora.com \
    --cc=Liviu.Dudau@arm.com \
    --cc=daniels@collabora.com \
    --cc=dmitry.osipenko@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=drinkcat@chromium.org \
    --cc=faith.ekstrand@collabora.com \
    --cc=hanetzer@startmail.com \
    --cc=neil.armstrong@linaro.org \
    --cc=peron.clem@gmail.com \
    --cc=robin.murphy@arm.com \
    --cc=steven.price@arm.com \
    /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.