drm/i915: Use explicit flag to mark unreachable intel_context
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 19 Mar 2020 17:07:06 +0000 (17:07 +0000)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 26 Mar 2020 17:21:04 +0000 (10:21 -0700)
I need to keep the GEM context around a bit longer so adding an explicit
flag for syncing execbuf with closed/abandonded contexts.

v2:
 * Use already available context flags. (Chris)

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20200319170707.8262-1-chris@chris-wilson.co.uk
(cherry picked from commit 207e4a71fb53e761be72daaeb78a49225bc31c69)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
drivers/gpu/drm/i915/gt/intel_context.c
drivers/gpu/drm/i915/gt/intel_context.h
drivers/gpu/drm/i915/gt/intel_context_types.h

index 026999b34abdc93c64fccd5be89acb686c05fa53..68326ad3b2e09e7f3dcc1107d1d425c4fe86c653 100644 (file)
@@ -574,7 +574,7 @@ static void engines_idle_release(struct i915_gem_context *ctx,
                int err = 0;
 
                /* serialises with execbuf */
-               RCU_INIT_POINTER(ce->gem_context, NULL);
+               set_bit(CONTEXT_CLOSED_BIT, &ce->flags);
                if (!intel_context_pin_if_active(ce))
                        continue;
 
index d3f4f28e9468caaa87e1ba16d2a2e388ae941b30..36d069504836efdde43d0d29a8f8966e8cee8ef6 100644 (file)
@@ -2316,7 +2316,7 @@ static void eb_request_add(struct i915_execbuffer *eb)
        prev = __i915_request_commit(rq);
 
        /* Check that the context wasn't destroyed before submission */
-       if (likely(rcu_access_pointer(eb->context->gem_context))) {
+       if (likely(!intel_context_is_closed(eb->context))) {
                attr = eb->gem_context->sched;
 
                /*
index 01474d3a558be71d97191976683db610eccb8fd4..aea992e46c423cc4a713069203bfbe304049a70e 100644 (file)
@@ -97,6 +97,8 @@ int __intel_context_do_pin(struct intel_context *ce)
 {
        int err;
 
+       GEM_BUG_ON(intel_context_is_closed(ce));
+
        if (unlikely(!test_bit(CONTEXT_ALLOC_BIT, &ce->flags))) {
                err = intel_context_alloc_state(ce);
                if (err)
index 18efad2551245a915917a1bcb893ba3a9d1a4099..07be021882ccd3efef37af754d8da2d1a5d89773 100644 (file)
@@ -173,6 +173,11 @@ static inline bool intel_context_is_barrier(const struct intel_context *ce)
        return test_bit(CONTEXT_BARRIER_BIT, &ce->flags);
 }
 
+static inline bool intel_context_is_closed(const struct intel_context *ce)
+{
+       return test_bit(CONTEXT_CLOSED_BIT, &ce->flags);
+}
+
 static inline bool intel_context_use_semaphores(const struct intel_context *ce)
 {
        return test_bit(CONTEXT_USE_SEMAPHORES, &ce->flags);
index 0f3b68b95c56482762807b7615b0fc5393a8b775..07cb83a0d0171a48fbedee19944bb0064b142416 100644 (file)
@@ -62,10 +62,11 @@ struct intel_context {
 #define CONTEXT_BARRIER_BIT            0
 #define CONTEXT_ALLOC_BIT              1
 #define CONTEXT_VALID_BIT              2
-#define CONTEXT_USE_SEMAPHORES         3
-#define CONTEXT_BANNED                 4
-#define CONTEXT_FORCE_SINGLE_SUBMISSION        5
-#define CONTEXT_NOPREEMPT              6
+#define CONTEXT_CLOSED_BIT             3
+#define CONTEXT_USE_SEMAPHORES         4
+#define CONTEXT_BANNED                 5
+#define CONTEXT_FORCE_SINGLE_SUBMISSION        6
+#define CONTEXT_NOPREEMPT              7
 
        u32 *lrc_reg_state;
        u64 lrc_desc;