]> git.karo-electronics.de Git - linux-beck.git/commitdiff
drm/i915: Drop racy markup of missed-irqs from idle-worker
authorChris Wilson <chris@chris-wilson.co.uk>
Sun, 24 Jul 2016 09:10:20 +0000 (10:10 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Sun, 24 Jul 2016 09:57:19 +0000 (10:57 +0100)
During the idle-worker we disable the hangcheck and so kick any waiters
that should have been completed (since the GPU is now idle). Unlike the
hangcheck, we do not take any care to avoid the race between the irq
handler and ourselves, and so it is possible for us to declare a missed
interrupt even as the bottom-half is being scheduled to run. Let's
ignore this race to stop a potential false-positive error.

References: https://bugs.freedesktop.org/show_bug.cgi?id=96974
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1469351421-13493-1-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem.c

index 40047eb4882617573c3f125faf3f8796e262ac3f..c8436639b3ed9da94f06ce115d0073a306123577 100644 (file)
@@ -2705,11 +2705,14 @@ i915_gem_idle_work_handler(struct work_struct *work)
        dev_priv->gt.awake = false;
        rearm_hangcheck = false;
 
+       /* As we have disabled hangcheck, we need to unstick any waiters still
+        * hanging around. However, as we may be racing against the interrupt
+        * handler or the waiters themselves, we skip enabling the fake-irq.
+        */
        stuck_engines = intel_kick_waiters(dev_priv);
-       if (unlikely(stuck_engines)) {
-               DRM_DEBUG_DRIVER("kicked stuck waiters...missed irq\n");
-               dev_priv->gpu_error.missed_irq_rings |= stuck_engines;
-       }
+       if (unlikely(stuck_engines))
+               DRM_DEBUG_DRIVER("kicked stuck waiters (%x)...missed irq?\n",
+                                stuck_engines);
 
        if (INTEL_GEN(dev_priv) >= 6)
                gen6_rps_idle(dev_priv);