[Intel-gfx] [PATCH 23/24] drm/i915: Keep a recent cache of freed contexts objects for reuse

Chris Wilson chris at chris-wilson.co.uk
Thu May 18 14:19:46 UTC 2017


On Thu, May 18, 2017 at 02:52:41PM +0100, Tvrtko Ursulin wrote:
> 
> On 18/05/2017 10:46, Chris Wilson wrote:
> >Keep the recently freed context objects for reuse. This allows us to use
> >the current GGTT bindings and dma bound pages, avoiding any clflushes as
> >required. We mark the objects as purgeable under memory pressure, and
> >reap the list of freed objects as soon as the device is idle.
> 
> Some description on when is this interesting and by how much?

No interesting workload (a few synthetic benchmarks including the GL).
Best argument would be a minor improvement in application startup.

> Since you drop everything on idle it must be for some workload which
> likes to go through context while keeping busy?

Yup, it's just the rule of thumb I have (from experience with the
cmdparser batch caching).
 
> >Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> >---
> > drivers/gpu/drm/i915/i915_drv.h                  |  2 +
> > drivers/gpu/drm/i915/i915_gem.c                  |  1 +
> > drivers/gpu/drm/i915/i915_gem_context.c          | 59 ++++++++++++++++++++++--
> > drivers/gpu/drm/i915/i915_gem_context.h          |  5 ++
> > drivers/gpu/drm/i915/intel_lrc.c                 |  2 +-
> > drivers/gpu/drm/i915/intel_ringbuffer.c          |  2 +-
> > drivers/gpu/drm/i915/selftests/mock_context.c    |  1 +
> > drivers/gpu/drm/i915/selftests/mock_gem_device.c |  1 +
> > 8 files changed, 68 insertions(+), 5 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> >index 1d55bbde68df..1fa1e7d48f02 100644
> >--- a/drivers/gpu/drm/i915/i915_drv.h
> >+++ b/drivers/gpu/drm/i915/i915_drv.h
> >@@ -2316,6 +2316,8 @@ struct drm_i915_private {
> > 		struct llist_head free_list;
> > 		struct work_struct free_work;
> >
> >+		struct list_head freed_objects;
> 
> free_ctx_objects maybe?

This is i915->contexts.freed_objects (new contexts substruct). There is
already a precedent for using freed_ (mainly because I think its a
better description for that phase, free is too similar to avail,
although you may persuade me that free is better).

> Knowing you I am surprised this is not bucketed! :)

I didn't bother since we only really have two sizes - also reason why I
didn't make it per-engine so that we could share the xcs context
objects. My expectation is that we won't be caught up in slow list
searches, so went for simplicity for a change.

> >+struct drm_i915_gem_object *
> >+i915_gem_context_create_object(struct drm_i915_private *i915,
> >+			       unsigned long size)
> >+{
> >+	struct drm_i915_gem_object *obj, *on;
> >+
> >+	lockdep_assert_held(&i915->drm.struct_mutex);
> >+
> >+	list_for_each_entry_safe(obj, on,
> >+				 &i915->contexts.freed_objects,
> >+				 batch_pool_link) {
> >+		if (obj->mm.madv != I915_MADV_DONTNEED) {
> >+			/* Purge the heretic! */
> 
> I don't see this can happen in the current version?

The power of the shrinker. Remember it can and will stab you in the back
at any time.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list