All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Chris Wilson <chris@chris-wilson.co.uk>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	DRI Development <dri-devel@lists.freedesktop.org>,
	Intel Graphics Development <intel-gfx@lists.freedesktop.org>,
	Daniel Vetter <daniel.vetter@intel.com>
Subject: Re: [PATCH 09/35] drm/gem: support BO freeing without dev->struct_mutex
Date: Tue, 26 Apr 2016 22:10:14 +0200	[thread overview]
Message-ID: <20160426201014.GE2558@phenom.ffwll.local> (raw)
In-Reply-To: <20160426194732.GU27856@nuc-i3427.alporthouse.com>

On Tue, Apr 26, 2016 at 08:47:32PM +0100, Chris Wilson wrote:
> On Tue, Apr 26, 2016 at 07:29:42PM +0200, Daniel Vetter wrote:
> > Finally all the core gem and a lot of drivers are entirely free of
> > dev->struct_mutex depencies, and we can start to have an entirely
> > lockless unref path.
> > 
> > To make sure that no one who touches the core code accidentally breaks
> > existing drivers which still require dev->struct_mutex I've made the
> > might_lock check unconditional.
> > 
> > While at it de-inline the ref/unref functions, they've become a bit
> > too big.
> > 
> > v2: Make it not leak like a sieve.
> > 
> > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > ---
> >  drivers/gpu/drm/drm_gem.c | 64 ++++++++++++++++++++++++++++++++++++++---------
> >  include/drm/drmP.h        | 12 ++++++++-
> >  include/drm/drm_gem.h     | 45 ++-------------------------------
> >  3 files changed, 65 insertions(+), 56 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> > index 25dac31eef37..8f2eff448bb5 100644
> > --- a/drivers/gpu/drm/drm_gem.c
> > +++ b/drivers/gpu/drm/drm_gem.c
> > @@ -788,16 +788,7 @@ drm_gem_object_release(struct drm_gem_object *obj)
> >  }
> >  EXPORT_SYMBOL(drm_gem_object_release);
> >  
> > -/**
> > - * drm_gem_object_free - free a GEM object
> > - * @kref: kref of the object to free
> > - *
> > - * Called after the last reference to the object has been lost.
> > - * Must be called holding struct_ mutex
> > - *
> > - * Frees the object
> > - */
> > -void
> > +static void
> >  drm_gem_object_free(struct kref *kref)
> >  {
> >  	struct drm_gem_object *obj =
> > @@ -806,10 +797,59 @@ drm_gem_object_free(struct kref *kref)
> >  
> >  	WARN_ON(!mutex_is_locked(&dev->struct_mutex));
> >  
> > -	if (dev->driver->gem_free_object != NULL)
> > +	if (dev->driver->gem_free_object_unlocked != NULL)
> > +		dev->driver->gem_free_object_unlocked(obj);
> > +	else if (dev->driver->gem_free_object != NULL)
> >  		dev->driver->gem_free_object(obj);
> >  }
> > -EXPORT_SYMBOL(drm_gem_object_free);
> > +
> > +/**
> > + * drm_gem_object_unreference_unlocked - release a GEM BO reference
> > + * @obj: GEM buffer object
> > + *
> > + * This releases a reference to @obj. Callers must not hold the
> > + * dev->struct_mutex lock when calling this function.
> > + */
> > +void
> > +drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
> > +{
> 
> I have i915.ko in a state where we could use this as well. I would like
> to have our inlines back though. I would add
> 
> static inline void
> i915_gem_object_put(struct drm_i915_gem_object *obj)
> {
> 	kref_put(&obj->base.refcount, drm_gem_object_free);
> }
> 
> Hmm, considering how simple that is, maybe I won't ask for
> 
> static inline void
> __drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
> {
> 	BUG_ON(obj->dev->driver->gem_free_object == NULL);
> 	kref_put(&obj->refcount, drm_gem_object_free);
> }

Yeah, something like that makes sense. Imo the core versions really need
all the silly locking checks and all that to make sure no one abuses them
by accident, or breaks a driver still using struct_mutex. Adding a
fastpath for drivers using gem_free_object_unlocked just wrapping the
kref_put certainly looks like a good idea.

And if we document the exact use case I think we could even nuke the
BUG_ON too. This can be audited with a simple

$ git grep __drm_gem_object_unreference_unlocked -- drivers/gpu/drm/$driver

so imo nothing too dangerous.

Ack/r-b on the patch itself?
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2016-04-26 20:10 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-26 17:29 [PATCH 00/35] Moar struct_mutex nuking Daniel Vetter
2016-04-26 17:29 ` [PATCH 01/35] drm: Give drm_agp_clear drm_legacy_ prefix Daniel Vetter
2016-04-26 21:09   ` Chris Wilson
2016-04-27  6:41     ` Daniel Vetter
2016-04-26 17:29 ` [PATCH 02/35] drm: Put legacy lastclose work into drm_legacy_dev_reinit Daniel Vetter
2016-04-26 21:31   ` Alex Deucher
2016-04-26 17:29 ` [PATCH 03/35] drm: Move drm_getmap into drm_bufs.c and give it a legacy prefix Daniel Vetter
2016-04-26 21:19   ` Chris Wilson
2016-04-26 21:32   ` Alex Deucher
2016-04-26 17:29 ` [PATCH 04/35] drm: Forbid legacy MAP functions for DRIVER_MODESET Daniel Vetter
2016-04-26 21:23   ` Chris Wilson
2016-04-26 21:35   ` Alex Deucher
2016-04-27  6:46     ` Daniel Vetter
2016-04-27  6:56       ` Daniel Vetter
2016-04-27  7:12         ` Dave Airlie
2016-04-27  7:55           ` Daniel Vetter
2016-04-27  7:21   ` [PATCH] drm: sti: remove useless call to dev->struct_mutex Daniel Vetter
2016-04-27  7:58     ` Daniel Vetter
2016-04-26 17:29 ` [PATCH 05/35] drm: Push struct_mutex into ->master_destroy Daniel Vetter
2016-04-26 20:54   ` Chris Wilson
2016-04-26 21:36   ` Alex Deucher
2016-04-26 17:29 ` [PATCH 06/35] drm: Hide master MAP cleanup in drm_bufs.c Daniel Vetter
2016-04-26 21:17   ` Chris Wilson
2016-04-26 21:41   ` Alex Deucher
2016-04-27  7:20   ` [PATCH] " Daniel Vetter
2016-04-27  8:15     ` Daniel Vetter
2016-04-26 17:29 ` [PATCH 07/35] drm: Make drm_vm_open/close_locked private to drm_vm.c Daniel Vetter
2016-04-26 21:42   ` Alex Deucher
2016-04-26 17:29 ` [PATCH 08/35] drm: Protect dev->filelist with its own mutex Daniel Vetter
2016-04-26 20:52   ` Chris Wilson
2016-04-26 21:45     ` [Intel-gfx] " Alex Deucher
2016-04-27  7:06       ` Daniel Vetter
2016-04-27  7:08         ` Daniel Vetter
2016-04-27  7:14           ` Deucher, Alexander
2016-04-27  7:17         ` [Intel-gfx] " Chris Wilson
2016-04-27  8:01           ` Daniel Vetter
2016-04-27  8:04             ` [Intel-gfx] " Chris Wilson
2016-04-27  8:17   ` Daniel Vetter
2016-04-26 17:29 ` [PATCH 09/35] drm/gem: support BO freeing without dev->struct_mutex Daniel Vetter
2016-04-26 19:47   ` Chris Wilson
2016-04-26 20:10     ` Daniel Vetter [this message]
2016-04-26 20:34       ` Chris Wilson
2016-04-26 21:52   ` Alex Deucher
2016-04-27  8:18     ` Daniel Vetter
2016-04-27  9:31   ` Lucas Stach
2016-04-27 11:21     ` Daniel Vetter
2016-04-27 11:50   ` [PATCH] " Daniel Vetter
2016-04-27 11:58     ` Chris Wilson
2016-04-27 12:12       ` Daniel Vetter
2016-04-27 12:19         ` Chris Wilson
2016-04-29  9:31     ` Daniel Vetter
2016-05-02  8:40       ` Daniel Vetter
2016-05-03 15:59         ` Alex Deucher
2016-05-04 10:26           ` Daniel Vetter
2016-04-29 11:18     ` ✗ Fi.CI.BAT: failure for " Patchwork
2016-04-29 11:39       ` Chris Wilson
2016-05-02  8:44     ` Patchwork
2016-05-02  8:48     ` Patchwork
2016-04-26 17:29 ` [PATCH 10/35] drm/amdgpu: Use lockless gem BO free callback Daniel Vetter
2016-04-26 17:29 ` [PATCH 11/35] drm/armada: " Daniel Vetter
2016-04-28 13:27   ` Russell King - ARM Linux
2016-04-26 17:29 ` [PATCH 12/35] drm/ast: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 13/35] drm/atmel: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 14/35] drm/bochs: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 15/35] drm/cirrus: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 16/35] drm/etnaviv: " Daniel Vetter
2016-04-27  9:32   ` Lucas Stach
2016-04-28 13:28   ` Russell King - ARM Linux
2016-04-26 17:29 ` [PATCH 17/35] drm/exynos: " Daniel Vetter
2016-05-10  6:52   ` Inki Dae
2016-04-26 17:29 ` [PATCH 18/35] drm/fls-dcu: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 19/35] drm/imx: " Daniel Vetter
2016-04-27 10:29   ` Philipp Zabel
2016-04-27 11:21     ` Daniel Vetter
2016-04-27 12:01       ` Philipp Zabel
2016-05-04 10:28         ` Daniel Vetter
2016-05-04 10:53           ` Philipp Zabel
2016-04-26 17:29 ` [PATCH 20/35] drm/mga200g: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 21/35] drm/nouveau: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 22/35] drm/qxl: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 23/35] drm/radeon: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 24/35] drm/rcar-du: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 25/35] drm/rockchip: " Daniel Vetter
2016-04-26 17:29 ` [PATCH 26/35] drm/shmob: " Daniel Vetter
     [not found] ` <1461691808-12414-1-git-send-email-daniel.vetter-/w4YWyX8dFk@public.gmane.org>
2016-04-26 17:30   ` [PATCH 27/35] drm/tegra: " Daniel Vetter
2016-05-10 13:33     ` Thierry Reding
     [not found]       ` <20160510133300.GA30323-EkSeR96xj6Pcmrwk2tT4+A@public.gmane.org>
2016-05-11  7:35         ` Daniel Vetter
2016-04-26 17:30 ` [PATCH 28/35] drm/tilcdc: " Daniel Vetter
2016-04-26 17:30 ` [PATCH 29/35] drm/vc4: Use drm_gem_object_unreference_unlocked Daniel Vetter
2016-04-26 17:30 ` [PATCH 30/35] drm/vc4: Use lockless gem BO free callback Daniel Vetter
2016-04-26 17:30 ` [PATCH 31/35] drm/vgem: " Daniel Vetter
2016-04-26 17:30 ` [PATCH 32/35] drm/virtio: " Daniel Vetter
2016-04-26 17:30 ` [PATCH 33/35] drm: sti: remove useless call to dev->struct_mutex Daniel Vetter
2016-04-26 17:30 ` [PATCH 34/35] drm/virtio: Use lockless gem BO free callback Daniel Vetter
2016-04-26 17:30 ` [PATCH 35/35] drm/rockchip: Use cma gem vm ops Daniel Vetter
2016-04-27 11:38   ` [PATCH 1/3] " Daniel Vetter
2016-04-27 11:38     ` [PATCH 2/3] drm/exynos: Nuke dummy fb->dirty callback Daniel Vetter
2016-05-10  6:48       ` Inki Dae
2016-04-27 11:38     ` [PATCH 3/3] drm/msm: " Daniel Vetter
2016-04-27  6:50 ` ✗ Fi.CI.BAT: failure for Moar struct_mutex nuking Patchwork

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=20160426201014.GE2558@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=chris@chris-wilson.co.uk \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniel.vetter@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.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.