drm/i915: Flush waiters on seqno wraparound
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 6 Mar 2018 13:01:43 +0000 (13:01 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 6 Mar 2018 17:25:56 +0000 (17:25 +0000)
Previously, we would spin waiting for all waiters to wake up and notice
their request had completed before we would reset the seqno upon
wraparound.  However, we can mark their waits as complete and wake them
up directly using the existing machinery for handling the flushing of
missed wakeups when idling.

Suggested-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180306130143.13312-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_request.c
drivers/gpu/drm/i915/intel_breadcrumbs.c
drivers/gpu/drm/i915/intel_ringbuffer.h

index d34a3e5800b730eeca4c7afe4c3858fb9764967f..d437beac3969f815c7e8c8430cd7c590d2bba2a6 100644 (file)
@@ -217,10 +217,8 @@ static int reset_all_global_seqno(struct drm_i915_private *i915, u32 seqno)
                struct intel_timeline *tl = engine->timeline;
 
                if (!i915_seqno_passed(seqno, tl->seqno)) {
-                       /* spin until threads are complete */
-                       while (intel_breadcrumbs_busy(engine))
-                               cond_resched();
-
+                       /* Flush any waiters before we reuse the seqno */
+                       intel_engine_disarm_breadcrumbs(engine);
                        GEM_BUG_ON(!list_empty(&engine->breadcrumbs.signals));
                }
 
index bab74c3ee81a936427d55358f276780b3daf5bde..1f79e7a474338f644e82c76d085a965bfb985d4c 100644 (file)
@@ -873,25 +873,6 @@ void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine)
        cancel_fake_irq(engine);
 }
 
-bool intel_breadcrumbs_busy(struct intel_engine_cs *engine)
-{
-       struct intel_breadcrumbs *b = &engine->breadcrumbs;
-       bool busy = false;
-
-       if (b->irq_wait) {
-               spin_lock_irq(&b->irq_lock);
-
-               if (b->irq_wait) {
-                       wake_up_process(b->irq_wait->tsk);
-                       busy = true;
-               }
-
-               spin_unlock_irq(&b->irq_lock);
-       }
-
-       return busy;
-}
-
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
 #include "selftests/intel_breadcrumbs.c"
 #endif
index e7526a4f05e5b953134f5b9f95263b8c4d8d571c..26605f39bbfd8650e9e724c118ab0586fc87f893 100644 (file)
@@ -951,7 +951,6 @@ void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine);
 
 void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine);
 void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine);
-bool intel_breadcrumbs_busy(struct intel_engine_cs *engine);
 
 static inline u32 *gen8_emit_pipe_control(u32 *batch, u32 flags, u32 offset)
 {