Commit 9701975e authored by Chris Wilson's avatar Chris Wilson

drm/i915: Do not short-circuit tasklets during reset

Inside intel_engine_is_idle(), we flush the tasklet to ensure that is
being run in a timely fashion (ksoftirqd has taught us to expect the
worst). However, if we are in the middle of reset, the HW may not yet be
ready to execute the submission tasklet and so we must respect the
disable flag.

Fixes: dd0cf235 ("drm/i915: Speed up idle detection by kicking the tasklets")
Testcase: igt/drv_selftest/live_hangcheck
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMichel Thierry <michel.thierry@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180713203529.1973-2-chris@chris-wilson.co.uk
parent 9dd1a981
...@@ -989,16 +989,18 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine) ...@@ -989,16 +989,18 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
/* Waiting to drain ELSP? */ /* Waiting to drain ELSP? */
if (READ_ONCE(engine->execlists.active)) { if (READ_ONCE(engine->execlists.active)) {
struct intel_engine_execlists *execlists = &engine->execlists; struct tasklet_struct *t = &engine->execlists.tasklet;
local_bh_disable(); local_bh_disable();
if (tasklet_trylock(&execlists->tasklet)) { if (tasklet_trylock(t)) {
execlists->tasklet.func(execlists->tasklet.data); /* Must wait for any GPU reset in progress. */
tasklet_unlock(&execlists->tasklet); if (__tasklet_is_enabled(t))
t->func(t->data);
tasklet_unlock(t);
} }
local_bh_enable(); local_bh_enable();
if (READ_ONCE(execlists->active)) if (READ_ONCE(engine->execlists.active))
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment