All of lore.kernel.org
 help / color / mirror / Atom feed
From: John.C.Harrison@Intel.com
To: Intel-Xe@Lists.FreeDesktop.Org
Cc: John Harrison <John.C.Harrison@Intel.com>
Subject: [PATCH v8 04/11] drm/xe/devcoredump: Add ASCII85 dump helper function
Date: Thu, 19 Sep 2024 20:21:01 -0700	[thread overview]
Message-ID: <20240920032108.629796-5-John.C.Harrison@Intel.com> (raw)
In-Reply-To: <20240920032108.629796-1-John.C.Harrison@Intel.com>

From: John Harrison <John.C.Harrison@Intel.com>

There is a need to include the GuC log and other large binary objects
in core dumps and via dmesg. So add a helper for dumping to a printer
function via conversion to ASCII85 encoding.

Another issue with dumping such a large buffer is that it can be slow,
especially if dumping to dmesg over a serial port. So add a yield to
prevent the 'task has been stuck for 120s' kernel hang check feature
from firing.

v2: Add a prefix to the output string. Fix memory allocation bug.
v3: Correct a string size calculation and clean up a define (review
feedback from Julia F).

Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
---
 drivers/gpu/drm/xe/xe_devcoredump.c | 87 +++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_devcoredump.h |  6 ++
 2 files changed, 93 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_devcoredump.c b/drivers/gpu/drm/xe/xe_devcoredump.c
index 2690f1d1cde4..0884c49942fe 100644
--- a/drivers/gpu/drm/xe/xe_devcoredump.c
+++ b/drivers/gpu/drm/xe/xe_devcoredump.c
@@ -6,6 +6,7 @@
 #include "xe_devcoredump.h"
 #include "xe_devcoredump_types.h"
 
+#include <linux/ascii85.h>
 #include <linux/devcoredump.h>
 #include <generated/utsrelease.h>
 
@@ -315,3 +316,89 @@ int xe_devcoredump_init(struct xe_device *xe)
 }
 
 #endif
+
+/**
+ * xe_print_blob_ascii85 - print a BLOB to some useful location in ASCII85
+ *
+ * The output is split to multiple lines because some print targets, e.g. dmesg
+ * cannot handle arbitrarily long lines. Note also that printing to dmesg in
+ * piece-meal fashion is not possible, each separate call to drm_puts() has a
+ * line-feed automatically added! Therefore, the entire output line must be
+ * constructed in a local buffer first, then printed in one atomic output call.
+ *
+ * There is also a scheduler yield call to prevent the 'task has been stuck for
+ * 120s' kernel hang check feature from firing when printing to a slow target
+ * such as dmesg over a serial port.
+ *
+ * TODO: Add compression prior to the ASCII85 encoding to shrink huge buffers down.
+ *
+ * @p: the printer object to output to
+ * @prefix: optional prefix to add to output string
+ * @blob: the Binary Large OBject to dump out
+ * @offset: offset in bytes to skip from the front of the BLOB, must be a multiple of sizeof(u32)
+ * @size: the size in bytes of the BLOB, must be a multiple of sizeof(u32)
+ */
+void xe_print_blob_ascii85(struct drm_printer *p, const char *prefix,
+			   const void *blob, size_t offset, size_t size)
+{
+	const u32 *blob32 = (const u32 *)blob;
+	char buff[ASCII85_BUFSZ], *line_buff;
+	size_t line_pos = 0;
+
+#define DMESG_MAX_LINE_LEN	800
+#define MIN_SPACE		(ASCII85_BUFSZ + 2)		/* 85 + "\n\0" */
+
+	if (size & 3)
+		drm_printf(p, "Size not word aligned: %zu", size);
+	if (offset & 3)
+		drm_printf(p, "Offset not word aligned: %zu", size);
+
+	line_buff = kzalloc(DMESG_MAX_LINE_LEN, GFP_KERNEL);
+	if (IS_ERR_OR_NULL(line_buff)) {
+		drm_printf(p, "Failed to allocate line buffer: %pe", line_buff);
+		return;
+	}
+
+	blob32 += offset / sizeof(*blob32);
+	size /= sizeof(*blob32);
+
+	if (prefix) {
+		strscpy(line_buff, prefix, DMESG_MAX_LINE_LEN - MIN_SPACE - 2);
+		line_pos = strlen(line_buff);
+
+		line_buff[line_pos++] = ':';
+		line_buff[line_pos++] = ' ';
+	}
+
+	while (size--) {
+		u32 val = *(blob32++);
+
+		strscpy(line_buff + line_pos, ascii85_encode(val, buff),
+			DMESG_MAX_LINE_LEN - line_pos);
+		line_pos += strlen(line_buff + line_pos);
+
+		if ((line_pos + MIN_SPACE) >= DMESG_MAX_LINE_LEN) {
+			line_buff[line_pos++] = '\n';
+			line_buff[line_pos++] = 0;
+
+			drm_puts(p, line_buff);
+
+			line_pos = 0;
+
+			/* Prevent 'stuck thread' time out errors */
+			cond_resched();
+		}
+	}
+
+	if (line_pos) {
+		line_buff[line_pos++] = '\n';
+		line_buff[line_pos++] = 0;
+
+		drm_puts(p, line_buff);
+	}
+
+	kfree(line_buff);
+
+#undef MIN_SPACE
+#undef DMESG_MAX_LINE_LEN
+}
diff --git a/drivers/gpu/drm/xe/xe_devcoredump.h b/drivers/gpu/drm/xe/xe_devcoredump.h
index e2fa65ce0932..a4eebc285fc8 100644
--- a/drivers/gpu/drm/xe/xe_devcoredump.h
+++ b/drivers/gpu/drm/xe/xe_devcoredump.h
@@ -6,6 +6,9 @@
 #ifndef _XE_DEVCOREDUMP_H_
 #define _XE_DEVCOREDUMP_H_
 
+#include <linux/types.h>
+
+struct drm_printer;
 struct xe_device;
 struct xe_sched_job;
 
@@ -23,4 +26,7 @@ static inline int xe_devcoredump_init(struct xe_device *xe)
 }
 #endif
 
+void xe_print_blob_ascii85(struct drm_printer *p, const char *prefix,
+			   const void *blob, size_t offset, size_t size);
+
 #endif
-- 
2.46.0


  parent reply	other threads:[~2024-09-20  3:21 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-20  3:20 [PATCH v8 00/11] drm/xe/guc: Improve GuC log dumping and add to devcoredump John.C.Harrison
2024-09-20  3:20 ` [PATCH v8 01/11] drm/xe/guc: Remove spurious line feed in debug print John.C.Harrison
2024-09-20  3:20 ` [PATCH v8 02/11] drm/xe/devcoredump: Use drm_puts and already cached local variables John.C.Harrison
2024-10-01  0:59   ` Julia Filipchuk
2024-09-20  3:21 ` [PATCH v8 03/11] drm/xe/devcoredump: Improve section headings and add tile info John.C.Harrison
2024-10-01  1:26   ` Julia Filipchuk
2024-09-20  3:21 ` John.C.Harrison [this message]
2024-10-01 15:56   ` [PATCH v8 04/11] drm/xe/devcoredump: Add ASCII85 dump helper function Julia Filipchuk
2024-09-20  3:21 ` [PATCH v8 05/11] drm/xe/guc: Copy GuC log prior to dumping John.C.Harrison
2024-09-20  3:21 ` [PATCH v8 06/11] drm/xe/guc: Use a two stage dump for GuC logs and add more info John.C.Harrison
2024-10-01 22:17   ` Julia Filipchuk
2024-10-02 20:53   ` Julia Filipchuk
2024-10-02 21:26     ` John Harrison
2024-09-20  3:21 ` [PATCH v8 07/11] drm/print: Introduce drm_line_printer John.C.Harrison
2024-09-20  3:21 ` [PATCH v8 08/11] drm/xe/guc: Dead CT helper John.C.Harrison
2024-09-30 23:04   ` John.C.Harrison
2024-10-02 17:40     ` Julia Filipchuk
2024-10-02 17:28   ` Julia Filipchuk
2024-09-20  3:21 ` [PATCH v8 09/11] drm/xe/guc: Dump entire CTB on errors John.C.Harrison
2024-09-20  3:21 ` [PATCH v8 10/11] drm/xe/guc: Add GuC log to devcoredump captures John.C.Harrison
2024-09-20  3:21 ` [PATCH v8 11/11] drm/xe/guc: Add a helper function for dumping GuC log to dmesg John.C.Harrison
2024-09-20  3:45 ` ✓ CI.Patch_applied: success for drm/xe/guc: Improve GuC log dumping and add to devcoredump (rev3) Patchwork
2024-09-20  3:45 ` ✗ CI.checkpatch: warning " Patchwork
2024-09-20  3:46 ` ✓ CI.KUnit: success " Patchwork
2024-09-20  3:59 ` ✓ CI.Build: " Patchwork
2024-09-20  4:01 ` ✓ CI.Hooks: " Patchwork
2024-09-20  4:17 ` ✗ CI.checksparse: warning " Patchwork
2024-09-20  4:52 ` ✗ CI.BAT: failure " Patchwork
2024-09-20  9:53 ` ✗ CI.FULL: " Patchwork
2024-10-01  0:49 ` ✓ CI.Patch_applied: success for drm/xe/guc: Improve GuC log dumping and add to devcoredump (rev4) Patchwork
2024-10-01  0:49 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-01  0:50 ` ✓ CI.KUnit: success " Patchwork
2024-10-01  1:02 ` ✓ CI.Build: " Patchwork
2024-10-01  1:04 ` ✓ CI.Hooks: " Patchwork
2024-10-01  1:05 ` ✗ CI.checksparse: warning " Patchwork
2024-10-01  1:31 ` ✓ CI.BAT: success " Patchwork
2024-10-01 11:18 ` ✗ CI.FULL: failure " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2024-09-20  3:19 [PATCH v8 00/11] drm/xe/guc: Improve GuC log dumping and add to devcoredump John.C.Harrison
2024-09-20  3:19 ` [PATCH v8 04/11] drm/xe/devcoredump: Add ASCII85 dump helper function John.C.Harrison

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240920032108.629796-5-John.C.Harrison@Intel.com \
    --to=john.c.harrison@intel.com \
    --cc=Intel-Xe@Lists.FreeDesktop.Org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.