]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: Check that the breadcrumb wasn't disarmed automatically before parking
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 31 Oct 2017 12:22:35 +0000 (12:22 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 1 Nov 2017 13:43:14 +0000 (13:43 +0000)
We will disarm the breadcrumb interrupt if we see a user interrupt
whilst no one is waiting. This may race with the call to
intel_engine_disarm_breadcrumbs() triggering an assert that we aren't
trying to do the same job twice. Prevent this by checking that the irq
is still armed after flushing the interrupt (for the irq spinlock).

Fixes: bcbd5c33a342 ("drm/i915/guc: Always enable the breadcrumbs irq")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: MichaƂ Winiarski <michal.winiarski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171031122235.1395-1-chris@chris-wilson.co.uk
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
drivers/gpu/drm/i915/intel_breadcrumbs.c

index 1bd0a461d66538a59b5bd72d961873702e8d128f..4de054f8c1bafe60bca7466edf1af5e181b4db39 100644 (file)
@@ -219,7 +219,8 @@ void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine)
 
        spin_lock(&b->irq_lock);
        first = fetch_and_zero(&b->irq_wait);
-       __intel_engine_disarm_breadcrumbs(engine);
+       if (b->irq_armed)
+               __intel_engine_disarm_breadcrumbs(engine);
        spin_unlock(&b->irq_lock);
 
        rbtree_postorder_for_each_entry_safe(wait, n, &b->waiters, node) {