diff options
author | Eric Anholt <eric@anholt.net> | 2008-06-13 10:47:33 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2008-06-13 10:47:33 -0700 |
commit | df4ef348c8a48cead807a42fcd315f7e422aa156 (patch) | |
tree | c2ce73fd4de9a4a3ab02919c10ace0dfaf416898 | |
parent | e558e1d7dacafa1e7f9681f1eaec072d663287de (diff) |
Fix i915_wait_irq in the presence of interrupt masking.
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.
-rw-r--r-- | shared-core/i915_irq.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c index 6daf2918..cfa9320e 100644 --- a/shared-core/i915_irq.c +++ b/shared-core/i915_irq.c @@ -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, |