Commit 2b284288 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Clean up GPU hang message

Remove some redundant kernel messages as we deduce a hung GPU and
capture the error state.

v2: Fix "hang" vs "no progress" message whilst I was there
v3: s/snprintf/scnprintf/
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1467618513-4966-2-git-send-email-chris@chris-wilson.co.ukReviewed-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
parent 8eb95204
...@@ -3084,9 +3084,8 @@ static void i915_hangcheck_elapsed(struct work_struct *work) ...@@ -3084,9 +3084,8 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
container_of(work, typeof(*dev_priv), container_of(work, typeof(*dev_priv),
gpu_error.hangcheck_work.work); gpu_error.hangcheck_work.work);
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
enum intel_engine_id id; unsigned int hung = 0, stuck = 0;
int busy_count = 0, rings_hung = 0; int busy_count = 0;
bool stuck[I915_NUM_ENGINES] = { 0 };
#define BUSY 1 #define BUSY 1
#define KICK 5 #define KICK 5
#define HUNG 20 #define HUNG 20
...@@ -3104,7 +3103,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work) ...@@ -3104,7 +3103,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
*/ */
intel_uncore_arm_unclaimed_mmio_detection(dev_priv); intel_uncore_arm_unclaimed_mmio_detection(dev_priv);
for_each_engine_id(engine, dev_priv, id) { for_each_engine(engine, dev_priv) {
bool busy = intel_engine_has_waiter(engine); bool busy = intel_engine_has_waiter(engine);
u64 acthd; u64 acthd;
u32 seqno; u32 seqno;
...@@ -3167,10 +3166,15 @@ static void i915_hangcheck_elapsed(struct work_struct *work) ...@@ -3167,10 +3166,15 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
break; break;
case HANGCHECK_HUNG: case HANGCHECK_HUNG:
engine->hangcheck.score += HUNG; engine->hangcheck.score += HUNG;
stuck[id] = true;
break; break;
} }
} }
if (engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG) {
hung |= intel_engine_flag(engine);
if (engine->hangcheck.action != HANGCHECK_HUNG)
stuck |= intel_engine_flag(engine);
}
} else { } else {
engine->hangcheck.action = HANGCHECK_ACTIVE; engine->hangcheck.action = HANGCHECK_ACTIVE;
...@@ -3195,17 +3199,24 @@ static void i915_hangcheck_elapsed(struct work_struct *work) ...@@ -3195,17 +3199,24 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
busy_count += busy; busy_count += busy;
} }
for_each_engine_id(engine, dev_priv, id) { if (hung) {
if (engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG) { char msg[80];
DRM_INFO("%s on %s\n", int len;
stuck[id] ? "stuck" : "no progress",
engine->name);
rings_hung |= intel_engine_flag(engine);
}
}
if (rings_hung) /* If some rings hung but others were still busy, only
i915_handle_error(dev_priv, rings_hung, "Engine(s) hung"); * blame the hanging rings in the synopsis.
*/
if (stuck != hung)
hung &= ~stuck;
len = scnprintf(msg, sizeof(msg),
"%s on ", stuck == hung ? "No progress" : "Hang");
for_each_engine_masked(engine, dev_priv, hung)
len += scnprintf(msg + len, sizeof(msg) - len,
"%s, ", engine->name);
msg[len-2] = '\0';
return i915_handle_error(dev_priv, hung, msg);
}
/* Reset timer in case GPU hangs without another request being added */ /* Reset timer in case GPU hangs without another request being added */
if (busy_count) if (busy_count)
......
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