drm/i915: Mark all current requests as complete before resetting them
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 20 Jul 2016 08:21:10 +0000 (09:21 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 20 Jul 2016 08:29:53 +0000 (09:29 +0100)
Following a GPU reset upon hang, we retire all the requests and then
mark them all as complete. If we mark them as complete first, we both
keep the normal retirement order (completed first then retired) and
provide a small optimisation for concurrent lookups.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1469002875-2335-3-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem.c

index 6df14058b3fedbaa7a498e5b4d43625c12dfebf9..61729d6b4eccf3418f9a532b70d905ac6363f8c4 100644 (file)
@@ -2486,6 +2486,12 @@ static void i915_gem_reset_engine_cleanup(struct intel_engine_cs *engine)
                i915_gem_object_retire__read(obj, engine->id);
        }
 
+       /* Mark all pending requests as complete so that any concurrent
+        * (lockless) lookup doesn't try and wait upon the request as we
+        * reset it.
+        */
+       intel_ring_init_seqno(engine, engine->last_submitted_seqno);
+
        /*
         * Clear the execlists queue up before freeing the requests, as those
         * are the ones that keep the context and ringbuffer backing objects
@@ -2528,8 +2534,6 @@ static void i915_gem_reset_engine_cleanup(struct intel_engine_cs *engine)
                intel_ring_update_space(buffer);
        }
 
-       intel_ring_init_seqno(engine, engine->last_submitted_seqno);
-
        engine->i915->gt.active_engines &= ~intel_engine_flag(engine);
 }