Fix i915_wait_irq in the presence of interrupt masking.
authorEric Anholt <eric@anholt.net>
Fri, 13 Jun 2008 17:47:33 +0000 (10:47 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 13 Jun 2008 17:47:33 +0000 (10:47 -0700)
In the short-circuit code for the breadcrumb already being new enough, we
need to update the sarea_priv copy of the breadcrumb just as if we had
waited.  Otherwise userland error checking will notice that we returned
too early based on its wrong information, and call wait_irq again (leading
to spinning until someone else comes along and updates the sarea_priv).

This bug was hidden when we had interrupt masking disabled, such as in
master, since the interrupt handler would update sarea_priv.

shared-core/i915_irq.c

index 6daf291..cfa9320 100644 (file)
@@ -560,8 +560,12 @@ int i915_wait_irq(struct drm_device * dev, int irq_nr)
        DRM_DEBUG("irq_nr=%d breadcrumb=%d\n", irq_nr,
                  READ_BREADCRUMB(dev_priv));
 
-       if (READ_BREADCRUMB(dev_priv) >= irq_nr)
+       if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
+               if (dev_priv->sarea_priv)
+                       dev_priv->sarea_priv->last_dispatch =
+                               READ_BREADCRUMB(dev_priv);
                return 0;
+       }
 
        i915_user_irq_on(dev_priv);
        DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ,