[Intel-gfx] [PATCH 4/4] drm/i915: Only free the oldest stale context before allocating
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed Jul 5 15:18:23 UTC 2017
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>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list