Commit a0d036b0 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter

drm/i915: Reorder the semaphore deadlock check, again

commit 4be17381
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Jun 6 10:22:29 2014 +0100

    drm/i915: Reorder semaphore deadlock check

did the majority of the work, but it missed one crucial detail:

The check for the unkickable deadlock on this ring must come after the
check whether the ring that we are waiting on has already passed its
target seqno.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=80709Tested-by: default avatarStefan Huber <shuber@sthu.org>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 9a3c4145
...@@ -2845,7 +2845,7 @@ static int semaphore_passed(struct intel_engine_cs *ring) ...@@ -2845,7 +2845,7 @@ static int semaphore_passed(struct intel_engine_cs *ring)
{ {
struct drm_i915_private *dev_priv = ring->dev->dev_private; struct drm_i915_private *dev_priv = ring->dev->dev_private;
struct intel_engine_cs *signaller; struct intel_engine_cs *signaller;
u32 seqno, ctl; u32 seqno;
ring->hangcheck.deadlock++; ring->hangcheck.deadlock++;
...@@ -2857,15 +2857,12 @@ static int semaphore_passed(struct intel_engine_cs *ring) ...@@ -2857,15 +2857,12 @@ static int semaphore_passed(struct intel_engine_cs *ring)
if (signaller->hangcheck.deadlock >= I915_NUM_RINGS) if (signaller->hangcheck.deadlock >= I915_NUM_RINGS)
return -1; return -1;
/* cursory check for an unkickable deadlock */
ctl = I915_READ_CTL(signaller);
if (ctl & RING_WAIT_SEMAPHORE && semaphore_passed(signaller) < 0)
return -1;
if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno)) if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno))
return 1; return 1;
if (signaller->hangcheck.deadlock) /* cursory check for an unkickable deadlock */
if (I915_READ_CTL(signaller) & RING_WAIT_SEMAPHORE &&
semaphore_passed(signaller) < 0)
return -1; return -1;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment