drm/i915/execlists: Ensure the tasklet is decoupled upon shutdown
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 29 Nov 2019 17:25:42 +0000 (17:25 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 29 Nov 2019 20:09:14 +0000 (20:09 +0000)
As we only cancel the timers asynchronously, they may
still be running on another CPU as we shutdown, raising one last
softirq. So be safe and make sure the tasklet is flushed before
destroying the engine's memory.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191129172542.1222810-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_lrc.c

index 4cd0d46b5da65cbe65a272457d5103ad412a459d..fef4b7e823f5e3728ae52252b1798b7cc47780ca 100644 (file)
@@ -3777,8 +3777,18 @@ void intel_execlists_set_default_submission(struct intel_engine_cs *engine)
                engine->flags |= I915_ENGINE_HAS_RELATIVE_MMIO;
 }
 
+static void execlists_shutdown(struct intel_engine_cs *engine)
+{
+       /* Synchronise with residual timers and any softirq they raise */
+       del_timer_sync(&engine->execlists.timer);
+       del_timer_sync(&engine->execlists.preempt);
+       tasklet_kill(&engine->execlists.tasklet);
+}
+
 static void execlists_destroy(struct intel_engine_cs *engine)
 {
+       execlists_shutdown(engine);
+
        intel_engine_cleanup_common(engine);
        lrc_destroy_wa_ctx(engine);
        kfree(engine);