[Intel-gfx] [PATCH 4/4] drm/i915: Only free the oldest stale context before allocating
Chris Wilson
chris at chris-wilson.co.uk
Thu Jul 6 10:53:12 UTC 2017
Quoting Tvrtko Ursulin (2017-07-05 16:18:23)
>
> On 05/07/2017 15:26, Chris Wilson wrote:
> > Currently, we move all unreferenced contexts to an RCU free list and
> > then onto a worker for eventual reaping. To compensate against this
> > growing into a long list with frequent allocations starving the system
> > of available memory, before we allocate a new context we reap all the
> > stale contexts. This puts all the cost of destroying the context into
> > the next allocator, which is presumably more sensitive to syscall
> > latency and unfair. We can limit the number of contexts being freed by
> > the new allocator to both keep the list trimmed and to allow the
> > allocator to be reasonably fast.
> >
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> > ---
> > drivers/gpu/drm/i915/i915_gem_context.c | 19 +++++++++++++++++--
> > 1 file changed, 17 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> > index 4f6773ea7d85..1a87d04e7937 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > @@ -201,6 +201,21 @@ static void contexts_free(struct drm_i915_private *i915)
> > i915_gem_context_free(ctx);
> > }
> >
> > +static void contexts_free_first(struct drm_i915_private *i915)
> > +{
> > + struct i915_gem_context *ctx;
> > + struct llist_node *freed;
> > +
> > + lockdep_assert_held(&i915->drm.struct_mutex);
> > +
> > + freed = llist_del_first(&i915->contexts.free_list);
> > + if (!freed)
> > + return;
> > +
> > + ctx = container_of(freed, typeof(*ctx), free_link);
> > + i915_gem_context_free(ctx);
> > +}
> > +
> > static void contexts_free_worker(struct work_struct *work)
> > {
> > struct drm_i915_private *i915 =
> > @@ -383,8 +398,8 @@ i915_gem_create_context(struct drm_i915_private *dev_priv,
> >
> > lockdep_assert_held(&dev_priv->drm.struct_mutex);
> >
> > - /* Reap stale contexts */
> > - contexts_free(dev_priv);
> > + /* Reap the most stale context */
> > + contexts_free_first(dev_priv);
> >
> > ctx = __create_hw_context(dev_priv, file_priv);
> > if (IS_ERR(ctx))
> >
>
> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Pushed this set as after looking at the report from many-magics, it
should not be related to context recreation.
Thanks for the review and suggestions.
-Chris
More information about the Intel-gfx
mailing list