On Tue, 28 May 2019, Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> 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@xxxxxxxxx> > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Jani Nikula <jani.nikula@xxxxxxxxxxxxxxx> > --- > 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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx