Quoting Chris Wilson (2018-05-03 07:36:52) > 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@xxxxxxxxxxxxxxxxxx> > Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx> Oh I thought I sent this earlier, but I appear not to have. Please review as it can go in all by itself... > 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 309e38b00e95..2d7f10492e35 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 > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx