aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-03-06 08:01:43 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2018-03-06 12:25:56 -0500
commitf41d19beccfebb84abc729e2d8ece0c368b2152f (patch)
treeafc82d28e6237d7c31a3c7b14190bd0e82c2eca0
parent93eef7d65329b62cf8a6db918fe5ca5d84eedf50 (diff)
drm/i915: Flush waiters on seqno wraparound
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
-rw-r--r--drivers/gpu/drm/i915/i915_request.c6
-rw-r--r--drivers/gpu/drm/i915/intel_breadcrumbs.c19
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h1
3 files changed, 2 insertions, 24 deletions
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index d34a3e5800b7..d437beac3969 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -217,10 +217,8 @@ static int reset_all_global_seqno(struct drm_i915_private *i915, u32 seqno)
217 struct intel_timeline *tl = engine->timeline; 217 struct intel_timeline *tl = engine->timeline;
218 218
219 if (!i915_seqno_passed(seqno, tl->seqno)) { 219 if (!i915_seqno_passed(seqno, tl->seqno)) {
220 /* spin until threads are complete */ 220 /* Flush any waiters before we reuse the seqno */
221 while (intel_breadcrumbs_busy(engine)) 221 intel_engine_disarm_breadcrumbs(engine);
222 cond_resched();
223
224 GEM_BUG_ON(!list_empty(&engine->breadcrumbs.signals)); 222 GEM_BUG_ON(!list_empty(&engine->breadcrumbs.signals));
225 } 223 }
226 224
diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
index bab74c3ee81a..1f79e7a47433 100644
--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
@@ -873,25 +873,6 @@ void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine)
873 cancel_fake_irq(engine); 873 cancel_fake_irq(engine);
874} 874}
875 875
876bool intel_breadcrumbs_busy(struct intel_engine_cs *engine)
877{
878 struct intel_breadcrumbs *b = &engine->breadcrumbs;
879 bool busy = false;
880
881 if (b->irq_wait) {
882 spin_lock_irq(&b->irq_lock);
883
884 if (b->irq_wait) {
885 wake_up_process(b->irq_wait->tsk);
886 busy = true;
887 }
888
889 spin_unlock_irq(&b->irq_lock);
890 }
891
892 return busy;
893}
894
895#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) 876#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
896#include "selftests/intel_breadcrumbs.c" 877#include "selftests/intel_breadcrumbs.c"
897#endif 878#endif
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index e7526a4f05e5..26605f39bbfd 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -951,7 +951,6 @@ void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine);
951 951
952void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine); 952void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine);
953void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine); 953void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine);
954bool intel_breadcrumbs_busy(struct intel_engine_cs *engine);
955 954
956static inline u32 *gen8_emit_pipe_control(u32 *batch, u32 flags, u32 offset) 955static inline u32 *gen8_emit_pipe_control(u32 *batch, u32 flags, u32 offset)
957{ 956{