From 1ba6405638439a4214783965538b0196c8de8a5b Mon Sep 17 00:00:00 2001 From: Devin Wittmayer Date: Thu, 15 Oct 2026 22:27:21 -0700 Subject: [PATCH] drm/panic: Fix kmsg screen hang on a long log line The kmsg panic screen reads the log back one chunk at a time. A record that does not fit in a chunk comes back empty without moving on, so the screen asks for it again forever and the panic never finishes. Every oops logs the list of loaded modules, and on my machine that list does not fit. Read into a buffer the size printk formats one record into, and stop if a read still comes back empty. Fixes: 54034bebb22f ("drm/panic: Add a kmsg panic screen") Cc: stable@vger.kernel.org Signed-off-by: Devin Wittmayer Reviewed-by: Jocelyn Falempe Link: https://patch.msgid.link/20261016052722.60051-1-lucid_duck@justthetip.ca Signed-off-by: Jocelyn Falempe --- drivers/gpu/drm/drm_panic.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c index 64a515e56f70..9c9145bcb9d6 100644 --- a/drivers/gpu/drm/drm_panic.c +++ b/drivers/gpu/drm/drm_panic.c @@ -556,7 +556,8 @@ static void draw_panic_screen_kmsg(struct drm_scanout_buffer *sb) const struct font_desc *font = get_default_font(sb->width, sb->height, NULL, NULL); struct drm_rect r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height); struct kmsg_dump_iter iter; - char kmsg_buf[512]; + /* the size printk formats one record into, too big for the stack */ + static char kmsg_buf[2048]; size_t kmsg_len; struct drm_panic_line line; int yoffset; @@ -575,6 +576,10 @@ static void draw_panic_screen_kmsg(struct drm_scanout_buffer *sb) char *start; char *end; + /* a record that does not fit comes back empty, every time */ + if (!kmsg_len) + break; + /* ignore terminating NUL and newline */ start = kmsg_buf + kmsg_len - 2; end = kmsg_buf + kmsg_len - 1; -- GitLab