drm/i915: Defer declaration of missed-interrupt until the waiter is asleep
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 17 Feb 2017 15:13:02 +0000 (15:13 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 17 Feb 2017 15:31:14 +0000 (15:31 +0000)
If the waiter was currently running, assume it hasn't had a chance
to process the pending interrupt (e.g, low priority task on a loaded
system) and wait until it sleeps before declaring a missed interrupt.

References: https://bugs.freedesktop.org/show_bug.cgi?id=99816
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170217151304.16665-4-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_breadcrumbs.c

index 4395b177493e0d4d48a761a750a367e063514f7c..f78b9baf61b62810aac1d7915f4f2b869c5098eb 100644 (file)
@@ -45,6 +45,15 @@ static void intel_breadcrumbs_hangcheck(unsigned long data)
                return;
        }
 
+       /* If the waiter was currently running, assume it hasn't had a chance
+        * to process the pending interrupt (e.g, low priority task on a loaded
+        * system) and wait until it sleeps before declaring a missed interrupt.
+        */
+       if (!intel_engine_wakeup(engine)) {
+               mod_timer(&b->hangcheck, wait_timeout());
+               return;
+       }
+
        DRM_DEBUG("Hangcheck timer elapsed... %s idle\n", engine->name);
        set_bit(engine->id, &engine->i915->gpu_error.missed_irq_rings);
        mod_timer(&engine->breadcrumbs.fake_irq, jiffies + 1);