Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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.uk


Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
parent 8eb95204
Loading
Loading
Loading
Loading
+26 −15
Original line number Original line Diff line number Diff line
@@ -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)
	 */
	 */
	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)
					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)
		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)