| From 2117021b2325d4a5169175390c4d8560080359c4 Mon Sep 17 00:00:00 2001 |
| From: Mika Kuoppala <mika.kuoppala@linux.intel.com> |
| Date: Wed, 12 Jun 2013 12:35:32 +0300 |
| Subject: drm/i915: store ring hangcheck action |
| |
| For guilty batchbuffer analysis later on when rings are reset, |
| store what state the ring was on when hang was declared. |
| This helps to weed out the waiting rings from the active ones. |
| |
| Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> |
| Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Acked-by: Ben Widawsky <ben@bwidawsk.net> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit ad8beaeada276b4b2d31e1c3422346e8829a67d6) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_irq.c | 8 ++++++-- |
| drivers/gpu/drm/i915/intel_ringbuffer.h | 3 +++ |
| 2 files changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c |
| index b6e0b15552e9..5c344a5f307c 100644 |
| --- a/drivers/gpu/drm/i915/i915_irq.c |
| +++ b/drivers/gpu/drm/i915/i915_irq.c |
| @@ -2417,7 +2417,8 @@ static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv) |
| ring->hangcheck.deadlock = false; |
| } |
| |
| -static enum { wait, active, kick, hung } ring_stuck(struct intel_ring_buffer *ring, u32 acthd) |
| +static enum intel_ring_hangcheck_action |
| +ring_stuck(struct intel_ring_buffer *ring, u32 acthd) |
| { |
| struct drm_device *dev = ring->dev; |
| struct drm_i915_private *dev_priv = dev->dev_private; |
| @@ -2520,7 +2521,10 @@ void i915_hangcheck_elapsed(unsigned long data) |
| * being repeatedly kicked and so responsible |
| * for stalling the machine. |
| */ |
| - switch (ring_stuck(ring, acthd)) { |
| + ring->hangcheck.action = ring_stuck(ring, |
| + acthd); |
| + |
| + switch (ring->hangcheck.action) { |
| case wait: |
| score = 0; |
| break; |
| diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h |
| index a3e96103dbe5..799f04c9da45 100644 |
| --- a/drivers/gpu/drm/i915/intel_ringbuffer.h |
| +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h |
| @@ -37,11 +37,14 @@ struct intel_hw_status_page { |
| #define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base)) |
| #define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base)) |
| |
| +enum intel_ring_hangcheck_action { wait, active, kick, hung }; |
| + |
| struct intel_ring_hangcheck { |
| bool deadlock; |
| u32 seqno; |
| u32 acthd; |
| int score; |
| + enum intel_ring_hangcheck_action action; |
| }; |
| |
| struct intel_ring_buffer { |
| -- |
| 1.8.5.rc3 |
| |