diff options
author | Dave Gordon <david.s.gordon@intel.com> | 2015-09-01 10:57:44 +0100 |
---|---|---|
committer | John Harrison <John.C.Harrison@Intel.com> | 2016-06-28 17:19:11 +0100 |
commit | 1fb8e81417a274c2e4a1ed8678fac03351db19b8 (patch) | |
tree | c1678e40a2726dfe59ed8e5c4621f6444e7bdc36 | |
parent | 27f326a40ca1803756ca18e65baebcc76ce75edc (diff) |
drm/i915: hangcheck=idle should wake_up_all every time, not just once
For: VIZ-2021
Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 55a746723484..340b6118db7e 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -3109,23 +3109,24 @@ static void i915_hangcheck_elapsed(struct work_struct *work) if (engine->hangcheck.seqno == seqno) { if (ring_idle(engine, seqno)) { + busy = false; engine->hangcheck.action = HANGCHECK_IDLE; if (waitqueue_active(&engine->irq_queue)) { + if (!(dev_priv->gpu_error.test_irq_rings & intel_engine_flag(engine))) + DRM_ERROR("Hangcheck timer elapsed... %s idle\n", + engine->name); + else + DRM_INFO("Fake missed irq on %s\n", + engine->name); + /* Issue a wake-up to catch stuck h/w. */ - if (!test_and_set_bit(engine->id, &dev_priv->gpu_error.missed_irq_rings)) { - if (!(dev_priv->gpu_error.test_irq_rings & intel_engine_flag(engine))) - DRM_ERROR("Hangcheck timer elapsed... %s idle\n", - engine->name); - else - DRM_INFO("Fake missed irq on %s\n", - engine->name); - wake_up_all(&engine->irq_queue); - } + set_bit(engine->id, &dev_priv->gpu_error.missed_irq_rings); + wake_up_all(&engine->irq_queue); /* Safeguard against driver failure */ engine->hangcheck.score += BUSY; - } else - busy = false; + busy = true; + } } else { /* We always increment the hangcheck score * if the ring is busy and still processing |