[RFC 2/2] drm/i915: Use user engine names in error state ecode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>

Instead of printing out the internal engine mask, which can change between
kernel versions making it difficult to map to actual engines, list user
friendly engine names in the ecode string. For example:

  [drm] GPU HANG: ecode 9:vcs1:a77ffefe, in gem_exec_captur [929]

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>
---
 drivers/gpu/drm/i915/i915_gpu_error.c | 38 ++++++++++++++++-----------
 drivers/gpu/drm/i915/i915_gpu_error.h |  2 +-
 2 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 857db66cc4a3..ce876e3f3ec5 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -1659,32 +1659,40 @@ static u32 generate_ecode(const struct intel_engine_coredump *ee)
 static const char *error_msg(struct i915_gpu_coredump *error)
 {
 	struct intel_engine_coredump *first = NULL;
+	int space = sizeof(error->error_msg) - 1, len;
 	struct intel_gt_coredump *gt;
-	intel_engine_mask_t engines;
-	int len;
+	char *p = error->error_msg;
+
+	len = scnprintf(p, space, "GPU HANG: ecode %d:",
+			INTEL_GEN(error->i915));
+	p += len;
+	space -= len;
 
-	engines = 0;
 	for (gt = error->gt; gt; gt = gt->next) {
 		struct intel_engine_coredump *cs;
 
 		for (cs = gt->engine; cs; cs = cs->next) {
-			if (cs->hung) {
-				engines |= cs->engine->mask;
-				if (!first)
-					first = cs;
-			}
+			if (!cs->hung)
+				continue;
+
+			len = scnprintf(p, space, "%s%s",
+					first ? "," : "",
+					cs->engine->name);
+			p += len;
+			space -= len;
+
+			if (!first)
+				first = cs;
 		}
 	}
 
-	len = scnprintf(error->error_msg, sizeof(error->error_msg),
-			"GPU HANG: ecode %d:%x:%08x",
-			INTEL_GEN(error->i915), engines,
-			generate_ecode(first));
+	len = scnprintf(p, space, ":%08x", generate_ecode(first));
+	p += len;
+	space -= len;
+
 	if (first && first->context.pid) {
 		/* Just show the first executing process, more is confusing */
-		len += scnprintf(error->error_msg + len,
-				 sizeof(error->error_msg) - len,
-				 ", in %s [%d]",
+		len += scnprintf(p, space, ", in %s [%d]",
 				 first->context.comm, first->context.pid);
 	}
 
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h
index 3a7ca90a3436..6b8573ddbe67 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.h
+++ b/drivers/gpu/drm/i915/i915_gpu_error.h
@@ -168,7 +168,7 @@ struct i915_gpu_coredump {
 
 	struct intel_gt_coredump *gt;
 
-	char error_msg[128];
+	char error_msg[256];
 	bool simulated;
 	bool wakelock;
 	bool suspended;
-- 
2.25.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx



[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux