drm/i915: Cancel pending execlist tasklet upon wedging
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 21 Jun 2017 12:48:04 +0000 (13:48 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 21 Jun 2017 14:15:33 +0000 (15:15 +0100)
Highly unlikely, but if the stop_machine() did suspend the tasklet, we
want to make sure that when it wakes it finds there is nothing to do.
Otherwise, it will loudly complain that the ELSP port tracking no longer
matches the hardware, and we will be mightly confused.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170621124804.4529-1-chris@chris-wilson.co.uk
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
drivers/gpu/drm/i915/i915_gem.c

index 1353491c1010fc9e6061e4d8f1df62b393acf662..ae3ce1314bd11d0fcc25c8dd1b8621313cf643b8 100644 (file)
@@ -3092,6 +3092,13 @@ static void engine_set_wedged(struct intel_engine_cs *engine)
                engine->execlist_first = NULL;
 
                spin_unlock_irqrestore(&engine->timeline->lock, flags);
+
+               /* The port is checked prior to scheduling a tasklet, but
+                * just in case we have suspended the tasklet to do the
+                * wedging make sure that when it wakes, it decides there
+                * is no work to do by clearing the irq_posted bit.
+                */
+               clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
        }
 }