Chris Wilson <ch...@chris-wilson.co.uk> writes:

> Before we assert that the engine is idle, make sure we flush any
> residual tasklet. After that point, if the engine is not idle, more work
> may be queued despite us trying to park the engine and go to sleep.
>
> References: https://bugs.freedesktop.org/show_bug.cgi?id=103479
> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuopp...@linux.intel.com>

Reviewed-by: Mika Kuoppala <mika.kuopp...@linux.intel.com>

> ---
>  drivers/gpu/drm/i915/intel_engine_cs.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c 
> b/drivers/gpu/drm/i915/intel_engine_cs.c
> index 0f8c542f0af2..70eeafe8a6ec 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -1542,6 +1542,10 @@ void intel_engines_park(struct drm_i915_private *i915)
>       enum intel_engine_id id;
>  
>       for_each_engine(engine, i915, id) {
> +             /* Flush the residual irq tasklets first. */
> +             intel_engine_disarm_breadcrumbs(engine);
> +             tasklet_kill(&engine->execlists.irq_tasklet);
> +
>               /*
>                * We are committed now to parking the engines, make sure there
>                * will be no more interrupts arriving later and the engines
> @@ -1558,9 +1562,6 @@ void intel_engines_park(struct drm_i915_private *i915)
>               if (engine->park)
>                       engine->park(engine);
>  
> -             intel_engine_disarm_breadcrumbs(engine);
> -             tasklet_kill(&engine->execlists.irq_tasklet);
> -
>               i915_gem_batch_pool_fini(&engine->batch_pool);
>               engine->execlists.no_priolist = false;
>       }
> -- 
> 2.15.0.rc2
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to