[Intel-gfx] [PATCH] drm/i915: Kill the undead intel_context.c zombie

Jani Nikula jani.nikula at linux.intel.com
Tue May 28 11:33:14 UTC 2019


On Tue, 28 May 2019, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> It was moved over to gt/ but the backmerge brought it back from the dead.

Whoops, mea culpa.

Reviewed-by: Jani Nikula <jani.nikula at intel.com>

>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nikula at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/intel_context.c | 270 ---------------------------
>  1 file changed, 270 deletions(-)
>  delete mode 100644 drivers/gpu/drm/i915/intel_context.c
>
> diff --git a/drivers/gpu/drm/i915/intel_context.c b/drivers/gpu/drm/i915/intel_context.c
> deleted file mode 100644
> index 924cc556223a..000000000000
> --- a/drivers/gpu/drm/i915/intel_context.c
> +++ /dev/null
> @@ -1,270 +0,0 @@
> -/*
> - * SPDX-License-Identifier: MIT
> - *
> - * Copyright © 2019 Intel Corporation
> - */
> -
> -#include "i915_drv.h"
> -#include "i915_gem_context.h"
> -#include "i915_globals.h"
> -#include "intel_context.h"
> -#include "intel_ringbuffer.h"
> -
> -static struct i915_global_context {
> -	struct i915_global base;
> -	struct kmem_cache *slab_ce;
> -} global;
> -
> -struct intel_context *intel_context_alloc(void)
> -{
> -	return kmem_cache_zalloc(global.slab_ce, GFP_KERNEL);
> -}
> -
> -void intel_context_free(struct intel_context *ce)
> -{
> -	kmem_cache_free(global.slab_ce, ce);
> -}
> -
> -struct intel_context *
> -intel_context_lookup(struct i915_gem_context *ctx,
> -		     struct intel_engine_cs *engine)
> -{
> -	struct intel_context *ce = NULL;
> -	struct rb_node *p;
> -
> -	spin_lock(&ctx->hw_contexts_lock);
> -	p = ctx->hw_contexts.rb_node;
> -	while (p) {
> -		struct intel_context *this =
> -			rb_entry(p, struct intel_context, node);
> -
> -		if (this->engine == engine) {
> -			GEM_BUG_ON(this->gem_context != ctx);
> -			ce = this;
> -			break;
> -		}
> -
> -		if (this->engine < engine)
> -			p = p->rb_right;
> -		else
> -			p = p->rb_left;
> -	}
> -	spin_unlock(&ctx->hw_contexts_lock);
> -
> -	return ce;
> -}
> -
> -struct intel_context *
> -__intel_context_insert(struct i915_gem_context *ctx,
> -		       struct intel_engine_cs *engine,
> -		       struct intel_context *ce)
> -{
> -	struct rb_node **p, *parent;
> -	int err = 0;
> -
> -	spin_lock(&ctx->hw_contexts_lock);
> -
> -	parent = NULL;
> -	p = &ctx->hw_contexts.rb_node;
> -	while (*p) {
> -		struct intel_context *this;
> -
> -		parent = *p;
> -		this = rb_entry(parent, struct intel_context, node);
> -
> -		if (this->engine == engine) {
> -			err = -EEXIST;
> -			ce = this;
> -			break;
> -		}
> -
> -		if (this->engine < engine)
> -			p = &parent->rb_right;
> -		else
> -			p = &parent->rb_left;
> -	}
> -	if (!err) {
> -		rb_link_node(&ce->node, parent, p);
> -		rb_insert_color(&ce->node, &ctx->hw_contexts);
> -	}
> -
> -	spin_unlock(&ctx->hw_contexts_lock);
> -
> -	return ce;
> -}
> -
> -void __intel_context_remove(struct intel_context *ce)
> -{
> -	struct i915_gem_context *ctx = ce->gem_context;
> -
> -	spin_lock(&ctx->hw_contexts_lock);
> -	rb_erase(&ce->node, &ctx->hw_contexts);
> -	spin_unlock(&ctx->hw_contexts_lock);
> -}
> -
> -static struct intel_context *
> -intel_context_instance(struct i915_gem_context *ctx,
> -		       struct intel_engine_cs *engine)
> -{
> -	struct intel_context *ce, *pos;
> -
> -	ce = intel_context_lookup(ctx, engine);
> -	if (likely(ce))
> -		return ce;
> -
> -	ce = intel_context_alloc();
> -	if (!ce)
> -		return ERR_PTR(-ENOMEM);
> -
> -	intel_context_init(ce, ctx, engine);
> -
> -	pos = __intel_context_insert(ctx, engine, ce);
> -	if (unlikely(pos != ce)) /* Beaten! Use their HW context instead */
> -		intel_context_free(ce);
> -
> -	GEM_BUG_ON(intel_context_lookup(ctx, engine) != pos);
> -	return pos;
> -}
> -
> -struct intel_context *
> -intel_context_pin_lock(struct i915_gem_context *ctx,
> -		       struct intel_engine_cs *engine)
> -	__acquires(ce->pin_mutex)
> -{
> -	struct intel_context *ce;
> -
> -	ce = intel_context_instance(ctx, engine);
> -	if (IS_ERR(ce))
> -		return ce;
> -
> -	if (mutex_lock_interruptible(&ce->pin_mutex))
> -		return ERR_PTR(-EINTR);
> -
> -	return ce;
> -}
> -
> -struct intel_context *
> -intel_context_pin(struct i915_gem_context *ctx,
> -		  struct intel_engine_cs *engine)
> -{
> -	struct intel_context *ce;
> -	int err;
> -
> -	ce = intel_context_instance(ctx, engine);
> -	if (IS_ERR(ce))
> -		return ce;
> -
> -	if (likely(atomic_inc_not_zero(&ce->pin_count)))
> -		return ce;
> -
> -	if (mutex_lock_interruptible(&ce->pin_mutex))
> -		return ERR_PTR(-EINTR);
> -
> -	if (likely(!atomic_read(&ce->pin_count))) {
> -		err = ce->ops->pin(ce);
> -		if (err)
> -			goto err;
> -
> -		i915_gem_context_get(ctx);
> -		GEM_BUG_ON(ce->gem_context != ctx);
> -
> -		mutex_lock(&ctx->mutex);
> -		list_add(&ce->active_link, &ctx->active_engines);
> -		mutex_unlock(&ctx->mutex);
> -
> -		intel_context_get(ce);
> -		smp_mb__before_atomic(); /* flush pin before it is visible */
> -	}
> -
> -	atomic_inc(&ce->pin_count);
> -	GEM_BUG_ON(!intel_context_is_pinned(ce)); /* no overflow! */
> -
> -	mutex_unlock(&ce->pin_mutex);
> -	return ce;
> -
> -err:
> -	mutex_unlock(&ce->pin_mutex);
> -	return ERR_PTR(err);
> -}
> -
> -void intel_context_unpin(struct intel_context *ce)
> -{
> -	if (likely(atomic_add_unless(&ce->pin_count, -1, 1)))
> -		return;
> -
> -	/* We may be called from inside intel_context_pin() to evict another */
> -	intel_context_get(ce);
> -	mutex_lock_nested(&ce->pin_mutex, SINGLE_DEPTH_NESTING);
> -
> -	if (likely(atomic_dec_and_test(&ce->pin_count))) {
> -		ce->ops->unpin(ce);
> -
> -		mutex_lock(&ce->gem_context->mutex);
> -		list_del(&ce->active_link);
> -		mutex_unlock(&ce->gem_context->mutex);
> -
> -		i915_gem_context_put(ce->gem_context);
> -		intel_context_put(ce);
> -	}
> -
> -	mutex_unlock(&ce->pin_mutex);
> -	intel_context_put(ce);
> -}
> -
> -static void intel_context_retire(struct i915_active_request *active,
> -				 struct i915_request *rq)
> -{
> -	struct intel_context *ce =
> -		container_of(active, typeof(*ce), active_tracker);
> -
> -	intel_context_unpin(ce);
> -}
> -
> -void
> -intel_context_init(struct intel_context *ce,
> -		   struct i915_gem_context *ctx,
> -		   struct intel_engine_cs *engine)
> -{
> -	kref_init(&ce->ref);
> -
> -	ce->gem_context = ctx;
> -	ce->engine = engine;
> -	ce->ops = engine->cops;
> -	ce->saturated = 0;
> -
> -	INIT_LIST_HEAD(&ce->signal_link);
> -	INIT_LIST_HEAD(&ce->signals);
> -
> -	mutex_init(&ce->pin_mutex);
> -
> -	/* Use the whole device by default */
> -	ce->sseu = intel_device_default_sseu(ctx->i915);
> -
> -	i915_active_request_init(&ce->active_tracker,
> -				 NULL, intel_context_retire);
> -}
> -
> -static void i915_global_context_shrink(void)
> -{
> -	kmem_cache_shrink(global.slab_ce);
> -}
> -
> -static void i915_global_context_exit(void)
> -{
> -	kmem_cache_destroy(global.slab_ce);
> -}
> -
> -static struct i915_global_context global = { {
> -	.shrink = i915_global_context_shrink,
> -	.exit = i915_global_context_exit,
> -} };
> -
> -int __init i915_global_context_init(void)
> -{
> -	global.slab_ce = KMEM_CACHE(intel_context, SLAB_HWCACHE_ALIGN);
> -	if (!global.slab_ce)
> -		return -ENOMEM;
> -
> -	i915_global_register(&global.base);
> -	return 0;
> -}

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list