From 233b42c82895ace5431afc768be7dac1086e1701 Mon Sep 17 00:00:00 2001 From: snj Date: Sun, 21 Sep 2014 18:12:18 +0000 Subject: [PATCH] Pull up following revision(s) (requested by riastradh in ticket #99): sys/external/bsd/drm2/dist/drm/i915/i915_irq.c: revision 1.8 Fix two mistakes in previous. - i915_error_wake_up is given irq_lock, so it need not take that. - Unlock irq_lock on exit from i915_hangcheck_elapsed if ring_hung. XXX This introduces the lock order irq_lock -> pending_flip_lock. How about just using irq_lock for pending flips? --- sys/external/bsd/drm2/dist/drm/i915/i915_irq.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c b/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c index b68611cac122..7a97050d0cf9 100644 --- a/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c +++ b/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c @@ -2138,11 +2138,10 @@ static void i915_error_wake_up(struct drm_i915_private *dev_priv, * a gpu reset pending so that i915_error_work_func can acquire them). */ + assert_spin_locked(&dev_priv->irq_lock); #ifdef __NetBSD__ - spin_lock(&dev_priv->irq_lock); for_each_ring(ring, dev_priv, i) DRM_SPIN_WAKEUP_ALL(&ring->irq_queue, &dev_priv->irq_lock); - spin_unlock(&dev_priv->irq_lock); spin_lock(&dev_priv->pending_flip_lock); DRM_SPIN_WAKEUP_ALL(&dev_priv->pending_flip_queue, @@ -2851,8 +2850,11 @@ static void i915_hangcheck_elapsed(unsigned long data) } } - if (rings_hung) - return i915_handle_error(dev, true, "Ring hung"); + if (rings_hung) { + i915_handle_error(dev, true, "Ring hung"); + spin_unlock(&dev_priv->irq_lock); + return; + } spin_unlock(&dev_priv->irq_lock);