Commit 02684446 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Remove intel_context.active_link



We no longer need to track the active intel_contexts within each engine,
allowing us to drop a tricky mutex_lock from inside unpin (which may
occur inside fs_reclaim).

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190426163336.15906-8-chris@chris-wilson.co.uk
parent 5e2a0419
Loading
Loading
Loading
Loading
+1 −10
Original line number Original line Diff line number Diff line
@@ -49,7 +49,6 @@ int __intel_context_do_pin(struct intel_context *ce)
		return -EINTR;
		return -EINTR;


	if (likely(!atomic_read(&ce->pin_count))) {
	if (likely(!atomic_read(&ce->pin_count))) {
		struct i915_gem_context *ctx = ce->gem_context;
		intel_wakeref_t wakeref;
		intel_wakeref_t wakeref;


		err = 0;
		err = 0;
@@ -58,11 +57,7 @@ int __intel_context_do_pin(struct intel_context *ce)
		if (err)
		if (err)
			goto err;
			goto err;


		i915_gem_context_get(ctx);
		i915_gem_context_get(ce->gem_context); /* for ctx->ppgtt */

		mutex_lock(&ctx->mutex);
		list_add(&ce->active_link, &ctx->active_engines);
		mutex_unlock(&ctx->mutex);


		intel_context_get(ce);
		intel_context_get(ce);
		smp_mb__before_atomic(); /* flush pin before it is visible */
		smp_mb__before_atomic(); /* flush pin before it is visible */
@@ -91,10 +86,6 @@ void intel_context_unpin(struct intel_context *ce)
	if (likely(atomic_dec_and_test(&ce->pin_count))) {
	if (likely(atomic_dec_and_test(&ce->pin_count))) {
		ce->ops->unpin(ce);
		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);
		i915_gem_context_put(ce->gem_context);
		intel_context_put(ce);
		intel_context_put(ce);
	}
	}
+0 −1
Original line number Original line Diff line number Diff line
@@ -38,7 +38,6 @@ struct intel_context {
	struct intel_engine_cs *engine;
	struct intel_engine_cs *engine;
	struct intel_engine_cs *active;
	struct intel_engine_cs *active;


	struct list_head active_link;
	struct list_head signal_link;
	struct list_head signal_link;
	struct list_head signals;
	struct list_head signals;


+9 −2
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@


#include "gt/intel_reset.h"
#include "gt/intel_reset.h"


#include "i915_gem_context.h"
#include "intel_dp.h"
#include "intel_dp.h"
#include "intel_drv.h"
#include "intel_drv.h"
#include "intel_fbc.h"
#include "intel_fbc.h"
@@ -397,14 +398,17 @@ static void print_context_stats(struct seq_file *m,
	struct i915_gem_context *ctx;
	struct i915_gem_context *ctx;


	list_for_each_entry(ctx, &i915->contexts.list, link) {
	list_for_each_entry(ctx, &i915->contexts.list, link) {
		struct i915_gem_engines_iter it;
		struct intel_context *ce;
		struct intel_context *ce;


		list_for_each_entry(ce, &ctx->active_engines, active_link) {
		for_each_gem_engine(ce,
				    i915_gem_context_lock_engines(ctx), it) {
			if (ce->state)
			if (ce->state)
				per_file_stats(0, ce->state->obj, &kstats);
				per_file_stats(0, ce->state->obj, &kstats);
			if (ce->ring)
			if (ce->ring)
				per_file_stats(0, ce->ring->vma->obj, &kstats);
				per_file_stats(0, ce->ring->vma->obj, &kstats);
		}
		}
		i915_gem_context_unlock_engines(ctx);


		if (!IS_ERR_OR_NULL(ctx->file_priv)) {
		if (!IS_ERR_OR_NULL(ctx->file_priv)) {
			struct file_stats stats = { .vm = &ctx->ppgtt->vm, };
			struct file_stats stats = { .vm = &ctx->ppgtt->vm, };
@@ -1882,6 +1886,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
		return ret;
		return ret;


	list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
	list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
		struct i915_gem_engines_iter it;
		struct intel_context *ce;
		struct intel_context *ce;


		seq_puts(m, "HW context ");
		seq_puts(m, "HW context ");
@@ -1906,7 +1911,8 @@ static int i915_context_status(struct seq_file *m, void *unused)
		seq_putc(m, ctx->remap_slice ? 'R' : 'r');
		seq_putc(m, ctx->remap_slice ? 'R' : 'r');
		seq_putc(m, '\n');
		seq_putc(m, '\n');


		list_for_each_entry(ce, &ctx->active_engines, active_link) {
		for_each_gem_engine(ce,
				    i915_gem_context_lock_engines(ctx), it) {
			seq_printf(m, "%s: ", ce->engine->name);
			seq_printf(m, "%s: ", ce->engine->name);
			if (ce->state)
			if (ce->state)
				describe_obj(m, ce->state->obj);
				describe_obj(m, ce->state->obj);
@@ -1914,6 +1920,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
				describe_ctx_ring(m, ce->ring);
				describe_ctx_ring(m, ce->ring);
			seq_putc(m, '\n');
			seq_putc(m, '\n');
		}
		}
		i915_gem_context_unlock_engines(ctx);


		seq_putc(m, '\n');
		seq_putc(m, '\n');
	}
	}
+0 −2
Original line number Original line Diff line number Diff line
@@ -289,7 +289,6 @@ static void i915_gem_context_free(struct i915_gem_context *ctx)
{
{
	lockdep_assert_held(&ctx->i915->drm.struct_mutex);
	lockdep_assert_held(&ctx->i915->drm.struct_mutex);
	GEM_BUG_ON(!i915_gem_context_is_closed(ctx));
	GEM_BUG_ON(!i915_gem_context_is_closed(ctx));
	GEM_BUG_ON(!list_empty(&ctx->active_engines));


	release_hw_id(ctx);
	release_hw_id(ctx);
	i915_ppgtt_put(ctx->ppgtt);
	i915_ppgtt_put(ctx->ppgtt);
@@ -416,7 +415,6 @@ __create_context(struct drm_i915_private *dev_priv)
	list_add_tail(&ctx->link, &dev_priv->contexts.list);
	list_add_tail(&ctx->link, &dev_priv->contexts.list);
	ctx->i915 = dev_priv;
	ctx->i915 = dev_priv;
	ctx->sched.priority = I915_USER_PRIORITY(I915_PRIORITY_NORMAL);
	ctx->sched.priority = I915_USER_PRIORITY(I915_PRIORITY_NORMAL);
	INIT_LIST_HEAD(&ctx->active_engines);
	mutex_init(&ctx->mutex);
	mutex_init(&ctx->mutex);


	mutex_init(&ctx->engines_mutex);
	mutex_init(&ctx->engines_mutex);
+0 −1
Original line number Original line Diff line number Diff line
@@ -165,7 +165,6 @@ struct i915_gem_context {
	atomic_t hw_id_pin_count;
	atomic_t hw_id_pin_count;
	struct list_head hw_id_link;
	struct list_head hw_id_link;


	struct list_head active_engines;
	struct mutex mutex;
	struct mutex mutex;


	struct i915_sched_attr sched;
	struct i915_sched_attr sched;
Loading