[Intel-gfx] [PATCH] drm/i915: Cancel pending execlists irq handler upon idling
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed Jun 28 08:59:04 UTC 2017
On 27/06/2017 16:25, Chris Wilson wrote:
> Due to the slight asynchronicity in handling the execlists interrupts
> (i.e. we defer the work to a handler that may consume more than one
> interrupt event), when the engine is idle we may still have an irq
> tasklet queued (especially when it has been deferred to a ksoftirqd).
> At the beginning of the tasklet, we assert that we do hold a device
> wakeref for the access we are about to perform. This assumes that when
> we idle and release the GT wakeref, all execlists work has been
> completed (since the elsp tracking says the hw is idle). However, there
> may still be a tasklet queued, so as we mark the engine idle, also
> cancel any pending tasklet.
We check the irq_posted bit which should correspond with a pending
tasklet (intel_engines_are_idle/intel_engine_is_idle), before
transitioning to idle so I don't understand this.
Regards,
Tvrtko
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/intel_engine_cs.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> index 3b46c1f7b88b..49e875c46c96 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -1328,6 +1328,7 @@ void intel_engines_mark_idle(struct drm_i915_private *i915)
> for_each_engine(engine, i915, id) {
> intel_engine_disarm_breadcrumbs(engine);
> i915_gem_batch_pool_fini(&engine->batch_pool);
> + tasklet_kill(&engine->irq_tasklet);
> engine->no_priolist = false;
> }
> }
>
More information about the Intel-gfx
mailing list