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: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/intel_context.c       | 11 +-------
 drivers/gpu/drm/i915/gt/intel_context_types.h |  1 -
 drivers/gpu/drm/i915/i915_debugfs.c           | 25 ++++++++++++++++---
 drivers/gpu/drm/i915/i915_gem_context.c       |  2 --
 drivers/gpu/drm/i915/i915_gem_context_types.h |  1 -
 .../gpu/drm/i915/selftests/i915_gem_context.c |  1 -
 drivers/gpu/drm/i915/selftests/mock_context.c |  1 -
 7 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_context.c 
b/drivers/gpu/drm/i915/gt/intel_context.c
index 803ac9a1dd15..236db0cea59b 100644
--- a/drivers/gpu/drm/i915/gt/intel_context.c
+++ b/drivers/gpu/drm/i915/gt/intel_context.c
@@ -49,7 +49,6 @@ int __intel_context_do_pin(struct intel_context *ce)
                return -EINTR;
 
        if (likely(!atomic_read(&ce->pin_count))) {
-               struct i915_gem_context *ctx = ce->gem_context;
                intel_wakeref_t wakeref;
 
                err = 0;
@@ -58,11 +57,7 @@ int __intel_context_do_pin(struct intel_context *ce)
                if (err)
                        goto err;
 
-               i915_gem_context_get(ctx);
-
-               mutex_lock(&ctx->mutex);
-               list_add(&ce->active_link, &ctx->active_engines);
-               mutex_unlock(&ctx->mutex);
+               i915_gem_context_get(ce->gem_context); /* for ctx->ppgtt */
 
                intel_context_get(ce);
                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))) {
                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);
        }
diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h 
b/drivers/gpu/drm/i915/gt/intel_context_types.h
index 3579c2708321..d5a7dbd0daee 100644
--- a/drivers/gpu/drm/i915/gt/intel_context_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_context_types.h
@@ -38,7 +38,6 @@ struct intel_context {
        struct intel_engine_cs *engine;
        struct intel_engine_cs *active;
 
-       struct list_head active_link;
        struct list_head signal_link;
        struct list_head signals;
 
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 8ac8a67e7b81..848703b1f8ea 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -34,6 +34,7 @@
 
 #include "gt/intel_reset.h"
 
+#include "i915_gem_context.h"
 #include "intel_dp.h"
 #include "intel_drv.h"
 #include "intel_fbc.h"
@@ -396,14 +397,22 @@ static void print_context_stats(struct seq_file *m,
        struct i915_gem_context *ctx;
 
        list_for_each_entry(ctx, &i915->contexts.list, link) {
-               struct intel_context *ce;
+               struct i915_gem_engines *e;
+               unsigned int n;
+
+               e = i915_gem_context_engine_list_lock(ctx);
+               for (n = 0; n < e->num_engines; n++) {
+                       struct intel_context *ce = e->engines[n];
+
+                       if (!ce)
+                               continue;
 
-               list_for_each_entry(ce, &ctx->active_engines, active_link) {
                        if (ce->state)
                                per_file_stats(0, ce->state->obj, &kstats);
                        if (ce->ring)
                                per_file_stats(0, ce->ring->vma->obj, &kstats);
                }
+               i915_gem_context_engine_list_unlock(ctx);
 
                if (!IS_ERR_OR_NULL(ctx->file_priv)) {
                        struct file_stats stats = { .vm = &ctx->ppgtt->vm, };
@@ -1893,7 +1902,8 @@ static int i915_context_status(struct seq_file *m, void 
*unused)
                return ret;
 
        list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
-               struct intel_context *ce;
+               struct i915_gem_engines *e;
+               unsigned int n;
 
                seq_puts(m, "HW context ");
                if (!list_empty(&ctx->hw_id_link))
@@ -1917,7 +1927,13 @@ static int i915_context_status(struct seq_file *m, void 
*unused)
                seq_putc(m, ctx->remap_slice ? 'R' : 'r');
                seq_putc(m, '\n');
 
-               list_for_each_entry(ce, &ctx->active_engines, active_link) {
+               e = i915_gem_context_engine_list_lock(ctx);
+               for (n = 0; n < e->num_engines; n++) {
+                       struct intel_context *ce = e->engines[n];
+
+                       if (!ce)
+                               continue;
+
                        seq_printf(m, "%s: ", ce->engine->name);
                        if (ce->state)
                                describe_obj(m, ce->state->obj);
@@ -1925,6 +1941,7 @@ static int i915_context_status(struct seq_file *m, void 
*unused)
                                describe_ctx_ring(m, ce->ring);
                        seq_putc(m, '\n');
                }
+               i915_gem_context_engine_list_unlock(ctx);
 
                seq_putc(m, '\n');
        }
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index 517816558c85..c05f949ed893 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -292,7 +292,6 @@ static void i915_gem_context_free(struct i915_gem_context 
*ctx)
 {
        lockdep_assert_held(&ctx->i915->drm.struct_mutex);
        GEM_BUG_ON(!i915_gem_context_is_closed(ctx));
-       GEM_BUG_ON(!list_empty(&ctx->active_engines));
 
        release_hw_id(ctx);
        i915_ppgtt_put(ctx->ppgtt);
@@ -419,7 +418,6 @@ __create_context(struct drm_i915_private *dev_priv)
        list_add_tail(&ctx->link, &dev_priv->contexts.list);
        ctx->i915 = dev_priv;
        ctx->sched.priority = I915_USER_PRIORITY(I915_PRIORITY_NORMAL);
-       INIT_LIST_HEAD(&ctx->active_engines);
        mutex_init(&ctx->mutex);
 
        mutex_init(&ctx->engines_mutex);
diff --git a/drivers/gpu/drm/i915/i915_gem_context_types.h 
b/drivers/gpu/drm/i915/i915_gem_context_types.h
index 1610a74b0283..ccb64f170e49 100644
--- a/drivers/gpu/drm/i915/i915_gem_context_types.h
+++ b/drivers/gpu/drm/i915/i915_gem_context_types.h
@@ -151,7 +151,6 @@ struct i915_gem_context {
        atomic_t hw_id_pin_count;
        struct list_head hw_id_link;
 
-       struct list_head active_engines;
        struct mutex mutex;
 
        struct i915_sched_attr sched;
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c 
b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
index 7fd224a4ca4c..deedd1898fe5 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
@@ -1675,7 +1675,6 @@ static int mock_context_barrier(void *arg)
                goto out;
        }
        i915_request_add(rq);
-       GEM_BUG_ON(list_empty(&ctx->active_engines));
 
        counter = 0;
        context_barrier_inject_fault = BIT(RCS0);
diff --git a/drivers/gpu/drm/i915/selftests/mock_context.c 
b/drivers/gpu/drm/i915/selftests/mock_context.c
index 71c750693585..10e67c931ed1 100644
--- a/drivers/gpu/drm/i915/selftests/mock_context.c
+++ b/drivers/gpu/drm/i915/selftests/mock_context.c
@@ -50,7 +50,6 @@ mock_context(struct drm_i915_private *i915,
        INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);
        INIT_LIST_HEAD(&ctx->handles_list);
        INIT_LIST_HEAD(&ctx->hw_id_link);
-       INIT_LIST_HEAD(&ctx->active_engines);
        mutex_init(&ctx->mutex);
 
        ret = i915_gem_context_pin_hw_id(ctx);
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to