drm/i915: Speed up idle detection by kicking the tasklets
We rely on ksoftirqd to run in a timely fashion in order to drain the execlists queue. Quite frequently, it does not. In some cases we may see latencies of over 200ms triggering our idle timeouts and forcing us to declare the driver wedged! Thus we can speed up idle detection by bypassing ksoftirqd in these cases and flush our tasklet to confirm if we are indeed still waiting for the ELSP to drain. v2: Put the execlists.first check back; it is required for handling reset! References: https://bugs.freedesktop.org/show_bug.cgi?id=106373 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180506171328.30034-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
e578a570dc
commit
dd0cf235d8
@ -973,10 +973,19 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
|
||||
return true;
|
||||
|
||||
/* Waiting to drain ELSP? */
|
||||
if (READ_ONCE(engine->execlists.active))
|
||||
return false;
|
||||
if (READ_ONCE(engine->execlists.active)) {
|
||||
struct intel_engine_execlists *execlists = &engine->execlists;
|
||||
|
||||
/* ELSP is empty, but there are ready requests? */
|
||||
if (tasklet_trylock(&execlists->tasklet)) {
|
||||
execlists->tasklet.func(execlists->tasklet.data);
|
||||
tasklet_unlock(&execlists->tasklet);
|
||||
}
|
||||
|
||||
if (READ_ONCE(execlists->active))
|
||||
return false;
|
||||
}
|
||||
|
||||
/* ELSP is empty, but there are ready requests? E.g. after reset */
|
||||
if (READ_ONCE(engine->execlists.first))
|
||||
return false;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user