[Intel-gfx] [PATCH 12/21] drm/i915/gem: Drop free_work for GEM contexts

Matthew Brost matthew.brost at intel.com
Thu Dec 10 18:50:29 UTC 2020


On Thu, Dec 10, 2020 at 08:02:31AM +0000, Chris Wilson wrote:
> The free_list and worker was introduced in commit 5f09a9c8ab6b ("drm/i915:
> Allow contexts to be unreferenced locklessly"), but subsequently made
> redundant by the removal of the last sleeping lock in commit 2935ed5339c4
> ("drm/i915: Remove logical HW ID"). As we can now free the GEM context
> immediately from any context, remove the deferral of the free_list
> 
> v2: Lift removing the context from the global list into close().
> 
> Suggested-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

Reviewed-by: Matthew Brost <matthew.brost at intel.com>

> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>  drivers/gpu/drm/i915/gem/i915_gem_context.c   | 59 +++----------------
>  drivers/gpu/drm/i915/gem/i915_gem_context.h   |  1 -
>  .../gpu/drm/i915/gem/i915_gem_context_types.h |  1 -
>  drivers/gpu/drm/i915/i915_drv.h               |  3 -
>  drivers/gpu/drm/i915/i915_gem.c               |  2 -
>  .../gpu/drm/i915/selftests/mock_gem_device.c  |  2 -
>  6 files changed, 8 insertions(+), 60 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> index ad136d009d9b..738a07b3583c 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> @@ -334,13 +334,12 @@ static struct i915_gem_engines *default_engines(struct i915_gem_context *ctx)
>  	return e;
>  }
>  
> -static void i915_gem_context_free(struct i915_gem_context *ctx)
> +void i915_gem_context_release(struct kref *ref)
>  {
> -	GEM_BUG_ON(!i915_gem_context_is_closed(ctx));
> +	struct i915_gem_context *ctx = container_of(ref, typeof(*ctx), ref);
>  
> -	spin_lock(&ctx->i915->gem.contexts.lock);
> -	list_del(&ctx->link);
> -	spin_unlock(&ctx->i915->gem.contexts.lock);
> +	trace_i915_context_free(ctx);
> +	GEM_BUG_ON(!i915_gem_context_is_closed(ctx));
>  
>  	mutex_destroy(&ctx->engines_mutex);
>  	mutex_destroy(&ctx->lut_mutex);
> @@ -354,37 +353,6 @@ static void i915_gem_context_free(struct i915_gem_context *ctx)
>  	kfree_rcu(ctx, rcu);
>  }
>  
> -static void contexts_free_all(struct llist_node *list)
> -{
> -	struct i915_gem_context *ctx, *cn;
> -
> -	llist_for_each_entry_safe(ctx, cn, list, free_link)
> -		i915_gem_context_free(ctx);
> -}
> -
> -static void contexts_flush_free(struct i915_gem_contexts *gc)
> -{
> -	contexts_free_all(llist_del_all(&gc->free_list));
> -}
> -
> -static void contexts_free_worker(struct work_struct *work)
> -{
> -	struct i915_gem_contexts *gc =
> -		container_of(work, typeof(*gc), free_work);
> -
> -	contexts_flush_free(gc);
> -}
> -
> -void i915_gem_context_release(struct kref *ref)
> -{
> -	struct i915_gem_context *ctx = container_of(ref, typeof(*ctx), ref);
> -	struct i915_gem_contexts *gc = &ctx->i915->gem.contexts;
> -
> -	trace_i915_context_free(ctx);
> -	if (llist_add(&ctx->free_link, &gc->free_list))
> -		schedule_work(&gc->free_work);
> -}
> -
>  static inline struct i915_gem_engines *
>  __context_engines_static(const struct i915_gem_context *ctx)
>  {
> @@ -633,6 +601,10 @@ static void context_close(struct i915_gem_context *ctx)
>  	 */
>  	lut_close(ctx);
>  
> +	spin_lock(&ctx->i915->gem.contexts.lock);
> +	list_del(&ctx->link);
> +	spin_unlock(&ctx->i915->gem.contexts.lock);
> +
>  	mutex_unlock(&ctx->mutex);
>  
>  	/*
> @@ -850,9 +822,6 @@ i915_gem_create_context(struct drm_i915_private *i915, unsigned int flags)
>  	    !HAS_EXECLISTS(i915))
>  		return ERR_PTR(-EINVAL);
>  
> -	/* Reap the stale contexts */
> -	contexts_flush_free(&i915->gem.contexts);
> -
>  	ctx = __create_context(i915);
>  	if (IS_ERR(ctx))
>  		return ctx;
> @@ -897,9 +866,6 @@ static void init_contexts(struct i915_gem_contexts *gc)
>  {
>  	spin_lock_init(&gc->lock);
>  	INIT_LIST_HEAD(&gc->list);
> -
> -	INIT_WORK(&gc->free_work, contexts_free_worker);
> -	init_llist_head(&gc->free_list);
>  }
>  
>  void i915_gem_init__contexts(struct drm_i915_private *i915)
> @@ -907,12 +873,6 @@ void i915_gem_init__contexts(struct drm_i915_private *i915)
>  	init_contexts(&i915->gem.contexts);
>  }
>  
> -void i915_gem_driver_release__contexts(struct drm_i915_private *i915)
> -{
> -	flush_work(&i915->gem.contexts.free_work);
> -	rcu_barrier(); /* and flush the left over RCU frees */
> -}
> -
>  static int gem_context_register(struct i915_gem_context *ctx,
>  				struct drm_i915_file_private *fpriv,
>  				u32 *id)
> @@ -986,7 +946,6 @@ int i915_gem_context_open(struct drm_i915_private *i915,
>  void i915_gem_context_close(struct drm_file *file)
>  {
>  	struct drm_i915_file_private *file_priv = file->driver_priv;
> -	struct drm_i915_private *i915 = file_priv->dev_priv;
>  	struct i915_address_space *vm;
>  	struct i915_gem_context *ctx;
>  	unsigned long idx;
> @@ -998,8 +957,6 @@ void i915_gem_context_close(struct drm_file *file)
>  	xa_for_each(&file_priv->vm_xa, idx, vm)
>  		i915_vm_put(vm);
>  	xa_destroy(&file_priv->vm_xa);
> -
> -	contexts_flush_free(&i915->gem.contexts);
>  }
>  
>  int i915_gem_vm_create_ioctl(struct drm_device *dev, void *data,
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.h b/drivers/gpu/drm/i915/gem/i915_gem_context.h
> index a133f92bbedb..b5c908f3f4f2 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_context.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.h
> @@ -110,7 +110,6 @@ i915_gem_context_clear_user_engines(struct i915_gem_context *ctx)
>  
>  /* i915_gem_context.c */
>  void i915_gem_init__contexts(struct drm_i915_private *i915);
> -void i915_gem_driver_release__contexts(struct drm_i915_private *i915);
>  
>  int i915_gem_context_open(struct drm_i915_private *i915,
>  			  struct drm_file *file);
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h
> index ae14ca24a11f..1449f54924e0 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h
> @@ -108,7 +108,6 @@ struct i915_gem_context {
>  
>  	/** link: place with &drm_i915_private.context_list */
>  	struct list_head link;
> -	struct llist_node free_link;
>  
>  	/**
>  	 * @ref: reference count
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 5d04b282c060..c2d0156e8a5d 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1172,9 +1172,6 @@ struct drm_i915_private {
>  		struct i915_gem_contexts {
>  			spinlock_t lock; /* locks list */
>  			struct list_head list;
> -
> -			struct llist_head free_list;
> -			struct work_struct free_work;
>  		} contexts;
>  
>  		/*
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 58276694c848..17a4636ee542 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -1207,8 +1207,6 @@ void i915_gem_driver_remove(struct drm_i915_private *dev_priv)
>  
>  void i915_gem_driver_release(struct drm_i915_private *dev_priv)
>  {
> -	i915_gem_driver_release__contexts(dev_priv);
> -
>  	intel_gt_driver_release(&dev_priv->gt);
>  
>  	intel_wa_list_free(&dev_priv->gt_wa_list);
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> index e946bd2087d8..0188f877cab2 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> @@ -64,8 +64,6 @@ static void mock_device_release(struct drm_device *dev)
>  	mock_device_flush(i915);
>  	intel_gt_driver_remove(&i915->gt);
>  
> -	i915_gem_driver_release__contexts(i915);
> -
>  	i915_gem_drain_workqueue(i915);
>  	i915_gem_drain_freed_objects(i915);
>  
> -- 
> 2.20.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list