Module Name:    src
Committed By:   snj
Date:           Sun Sep 21 18:12:18 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915 [netbsd-7]: i915_irq.c

Log Message:
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?


To generate a diff of this commit:
cvs rdiff -u -r1.6.2.2 -r1.6.2.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.6.2.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.6.2.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.6.2.2	Sun Sep 21 18:11:37 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c	Sun Sep 21 18:12:18 2014
@@ -2138,11 +2138,10 @@ static void i915_error_wake_up(struct dr
 	 * 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(unsig
 		}
 	}
 
-	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);
 

Reply via email to