[Intel-gfx] [PATCH 4/6] drm/i915: Free batch pool when idle

Chris Wilson chris at chris-wilson.co.uk
Thu Mar 19 10:14:19 PDT 2015


On Thu, Mar 19, 2015 at 05:03:56PM +0000, Tvrtko Ursulin wrote:
> 
> On 03/09/2015 09:55 AM, Chris Wilson wrote:
> >At runtime, this helps ensure that the batch pools are kept trim and
> >fast. Then at suspend, this releases memory that we do not need to
> >restore. It also ties into the oom-notifier to ensure that we recover as
> >much kernel memory as possible during OOM.
> >
> >Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> >---
> >  drivers/gpu/drm/i915/i915_gem.c | 13 ++++++++++++-
> >  1 file changed, 12 insertions(+), 1 deletion(-)
> >
> >diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> >index 9f33005bdfd1..efb5545251c7 100644
> >--- a/drivers/gpu/drm/i915/i915_gem.c
> >+++ b/drivers/gpu/drm/i915/i915_gem.c
> >@@ -2849,8 +2849,19 @@ i915_gem_idle_work_handler(struct work_struct *work)
> >  {
> >  	struct drm_i915_private *dev_priv =
> >  		container_of(work, typeof(*dev_priv), mm.idle_work.work);
> >+	struct drm_device *dev = dev_priv->dev;
> >+
> >+	intel_mark_idle(dev);
> >
> >-	intel_mark_idle(dev_priv->dev);
> >+	if (mutex_trylock(&dev->struct_mutex)) {
> >+		struct intel_engine_cs *ring;
> >+		int i;
> >+
> >+		for_each_ring(ring, dev_priv, i)
> >+			i915_gem_batch_pool_fini(&ring->batch_pool);
> 
> This is sooo bad... destructor in the idle handler, what message
> does that send? :D

That I noticed the function could also be used to cleanup the lists at
runtime, and I wasn't a fan of say i915_gem_batch_pool_cleanup().

#define i915_gem_batch_pool_reset i915_gem_batch_pool_fini ?

> >+
> >+		mutex_unlock(&dev->struct_mutex);
> >+	}
> 
> Would it be worth self-re-arming if trylock fails?

Possibly. I wasn't too concerned, holding the struct_mutex generally
involves work being emitted shortly afterwards. And I regarded this as
a performance optimisation rather than preventing leaks.

> I couldn't
> immediately figure out if last retirement can somehow race with a
> struct_mutex holder somewhere.

On suspend, we drop the struct mutex before flushing the idle work. Then
we explicitly free the lists anyway on shutdown.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list