[PATCH 06/74] drm/i915: Detect if we missed kicking the execlists tasklet

Chris Wilson chris at chris-wilson.co.uk
Sun May 6 11:57:13 UTC 2018


If inside hangcheck we see that the engine has paused, but there is an
execlists interrupt still pending, we know that the tasklet did not
fire. Dump the GEM trace along with the current engine state, and kick
the tasklet to recovery without having to go through a GPU reset.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
---
 drivers/gpu/drm/i915/intel_hangcheck.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_hangcheck.c b/drivers/gpu/drm/i915/intel_hangcheck.c
index d47e346bd49e..befb4048b3a9 100644
--- a/drivers/gpu/drm/i915/intel_hangcheck.c
+++ b/drivers/gpu/drm/i915/intel_hangcheck.c
@@ -267,6 +267,29 @@ engine_stuck(struct intel_engine_cs *engine, u64 acthd)
 		}
 	}
 
+	if (test_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted)) {
+		struct intel_engine_execlists *execlists = &engine->execlists;
+		enum intel_engine_hangcheck_action ret = ENGINE_WAIT;
+
+		if (GEM_SHOW_DEBUG()) {
+			struct drm_printer p = drm_debug_printer("hangcheck");
+
+			GEM_TRACE_DUMP();
+			intel_engine_dump(engine, &p,
+					  "%s stuck\n", engine->name);
+		}
+
+		if (tasklet_trylock(&execlists->tasklet)) {
+			execlists->tasklet.func(execlists->tasklet.data);
+			tasklet_unlock(&execlists->tasklet);
+
+			ret = ENGINE_WAIT_KICK;
+		}
+
+		tasklet_hi_schedule(&execlists->tasklet);
+		return ret;
+	}
+
 	return ENGINE_DEAD;
 }
 
-- 
2.17.0



More information about the Intel-gfx-trybot mailing list