[Intel-gfx] [PATCH] drm/i915: Wake-up wait_request() from elapsed hang-check

Chris Wilson chris at chris-wilson.co.uk
Sat Aug 7 14:06:57 CEST 2010


If our watchdog fires and we see that the GPU is idle, but that we
are still waiting on an interrupt, forcibly wake-up the waiter.

i915_do_wait_request() should not be racy, yet there are persistent
reports that 945GM hangs whilst the GPU is idle. This implies that the
hardware is not quite as coherent as the documentation claims - a write
followed by a flush is supposed to be coherent in main memory before the
flush is retired and the irq is emitted. This seems to be a sensible and
elegant guard to force the wait to timeout.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_irq.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 5161cea..3af2ac5 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1304,6 +1304,12 @@ void i915_hangcheck_elapsed(unsigned long data)
 				&dev_priv->render_ring),
 			i915_get_tail_request(dev)->seqno)) {
 		dev_priv->hangcheck_count = 0;
+
+		/* issue a wake-up to catch stuck h/w. */
+		if (dev_priv->render_ring.waiting_gem_seqno)
+			DRM_WAKEUP(&dev_priv->render_ring.irq_queue);
+		if (dev_priv->bsd_ring.waiting_gem_seqno)
+			DRM_WAKEUP(&dev_priv->bsd_ring.irq_queue);
 		return;
 	}
 
-- 
1.7.1




More information about the Intel-gfx mailing list