From 820c5bbbf418fba41149fdeb870d623e21be2463 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 1 Nov 2017 20:21:49 +0000 Subject: [PATCH] drm/i915: Flush the irq and tasklets before asserting engine is idle Git-commit: 820c5bbbf418fba41149fdeb870d623e21be2463 Patch-mainline: v4.16-rc1 References: FATE#322643 bsc#1055900 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 Cc: Mika Kuoppala Link: https://patchwork.freedesktop.org/patch/msgid/20171101202149.32493-1-chris@chris-wilson.co.uk Reviewed-by: Mika Kuoppala Acked-by: Takashi Iwai --- drivers/gpu/drm/i915/intel_engine_cs.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) --- a/drivers/gpu/drm/i915/intel_engine_cs.c +++ b/drivers/gpu/drm/i915/intel_engine_cs.c @@ -1619,6 +1619,10 @@ void intel_engines_park(struct drm_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 @@ -1635,9 +1639,6 @@ void intel_engines_park(struct drm_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; }