summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Gordon <david.s.gordon@intel.com>2015-09-01 10:57:44 +0100
committerJohn Harrison <John.C.Harrison@Intel.com>2016-06-28 17:19:11 +0100
commit1fb8e81417a274c2e4a1ed8678fac03351db19b8 (patch)
treec1678e40a2726dfe59ed8e5c4621f6444e7bdc36
parent27f326a40ca1803756ca18e65baebcc76ce75edc (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.c23
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