+ panic-add-an-option-to-replay-all-the-printk-message-in-buffer.patch added to -mm tree

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

 



The patch titled
     Subject: panic: add an option to replay all the printk messages in buffer
has been added to the -mm tree.  Its filename is
     panic-add-an-option-to-replay-all-the-printk-message-in-buffer.patch

This patch should soon appear at
    http://ozlabs.org/~akpm/mmots/broken-out/panic-add-an-option-to-replay-all-the-printk-message-in-buffer.patch
and later at
    http://ozlabs.org/~akpm/mmotm/broken-out/panic-add-an-option-to-replay-all-the-printk-message-in-buffer.patch

Before you just go and hit "reply", please:
   a) Consider who else should be cc'ed
   b) Prefer to cc a suitable mailing list as well
   c) Ideally: find the original patch on the mailing list and do a
      reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***

The -mm tree is included into linux-next and is updated
there every 3-4 working days

------------------------------------------------------
From: Feng Tang <feng.tang@xxxxxxxxx>
Subject: panic: add an option to replay all the printk messages in buffer

Currently on panic, kernel will lower the loglevel and print out
new printk msg only with console_flush_on_panic().

Add an option for users to configure the "panic_print" to see
all dmesg in buffer, some of which they may have never seen due
to the loglevel setting, which will help debugging too.

Thanks to Petr Mladek as somes codes come directly from the sample
code in his review comments.

Link: http://lkml.kernel.org/r/20190410153718.22905-1-feng.tang@xxxxxxxxx
Signed-off-by: Feng Tang <feng.tang@xxxxxxxxx>
Cc: Aaro Koskinen <aaro.koskinen@xxxxxxxxx>
Cc: Petr Mladek <pmladek@xxxxxxxx>
Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@xxxxxxxxx>
Cc: Kees Cook <keescook@xxxxxxxxxxxx>
Cc: Borislav Petkov <bp@xxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 Documentation/admin-guide/kernel-parameters.txt |    1 
 include/linux/console.h                         |    1 
 kernel/panic.c                                  |    5 +
 kernel/printk/printk.c                          |   46 +++++++++++---
 4 files changed, 44 insertions(+), 9 deletions(-)

--- a/Documentation/admin-guide/kernel-parameters.txt~panic-add-an-option-to-replay-all-the-printk-message-in-buffer
+++ a/Documentation/admin-guide/kernel-parameters.txt
@@ -3145,6 +3145,7 @@
 			bit 2: print timer info
 			bit 3: print locks info if CONFIG_LOCKDEP is on
 			bit 4: print ftrace buffer
+			bit 5: print all printk messages in buffer
 
 	panic_on_warn	panic() instead of WARN().  Useful to cause kdump
 			on a WARN().
--- a/include/linux/console.h~panic-add-an-option-to-replay-all-the-printk-message-in-buffer
+++ a/include/linux/console.h
@@ -176,6 +176,7 @@ extern void console_unlock(void);
 extern void console_conditional_schedule(void);
 extern void console_unblank(void);
 extern void console_flush_on_panic(void);
+extern void console_replay_on_panic(void);
 extern struct tty_driver *console_device(int *);
 extern void console_stop(struct console *);
 extern void console_start(struct console *);
--- a/kernel/panic.c~panic-add-an-option-to-replay-all-the-printk-message-in-buffer
+++ a/kernel/panic.c
@@ -51,6 +51,7 @@ EXPORT_SYMBOL_GPL(panic_timeout);
 #define PANIC_PRINT_TIMER_INFO		0x00000004
 #define PANIC_PRINT_LOCK_INFO		0x00000008
 #define PANIC_PRINT_FTRACE_INFO		0x00000010
+#define PANIC_PRINT_ALL_PRINTK_MSG	0x00000020
 unsigned long panic_print;
 
 ATOMIC_NOTIFIER_HEAD(panic_notifier_list);
@@ -134,6 +135,10 @@ EXPORT_SYMBOL(nmi_panic);
 
 static void panic_print_sys_info(void)
 {
+	/* Replay existing messages before adding other sys info. */
+	if (panic_print & PANIC_PRINT_ALL_PRINTK_MSG)
+		console_replay_on_panic();
+
 	if (panic_print & PANIC_PRINT_TASK_INFO)
 		show_state();
 
--- a/kernel/printk/printk.c~panic-add-an-option-to-replay-all-the-printk-message-in-buffer
+++ a/kernel/printk/printk.c
@@ -275,6 +275,9 @@ EXPORT_SYMBOL(console_set_on_cmdline);
 /* Flag: console code may call schedule() */
 static int console_may_schedule;
 
+/* Whether to print all messages in buffer */
+static int console_replay;
+
 enum con_msg_format_flags {
 	MSG_FORMAT_DEFAULT	= 0,
 	MSG_FORMAT_SYSLOG	= (1 << 0),
@@ -2396,21 +2399,32 @@ again:
 
 	for (;;) {
 		struct printk_log *msg;
+		int reset_idx = 0;
 		size_t ext_len = 0;
-		size_t len;
+		size_t len = 0;
 
 		printk_safe_enter_irqsave(flags);
 		raw_spin_lock(&logbuf_lock);
+
 		if (console_seq < log_first_seq) {
 			len = sprintf(text,
 				      "** %llu printk messages dropped **\n",
 				      log_first_seq - console_seq);
 
 			/* messages are gone, move to first one */
+			reset_idx = 1;
+		}
+
+		if (console_replay) {
+			len += sprintf(text + len,
+				       "Replaying the entire log:\n");
+			reset_idx = 1;
+			console_replay = 0;
+		}
+
+		if (reset_idx) {
 			console_seq = log_first_seq;
 			console_idx = log_first_idx;
-		} else {
-			len = 0;
 		}
 skip:
 		if (console_seq == log_next_seq)
@@ -2533,12 +2547,7 @@ void console_unblank(void)
 	console_unlock();
 }
 
-/**
- * console_flush_on_panic - flush console content on panic
- *
- * Immediately output all pending messages no matter what.
- */
-void console_flush_on_panic(void)
+static void __flush_on_panic(int replay)
 {
 	/*
 	 * If someone else is holding the console lock, trylock will fail
@@ -2549,9 +2558,28 @@ void console_flush_on_panic(void)
 	 */
 	console_trylock();
 	console_may_schedule = 0;
+	console_replay = replay ? 1 : 0;
 	console_unlock();
 }
 
+/**
+ * console_flush_on_panic - flush console content on panic
+ *
+ * Immediately output all pending messages no matter what.
+ */
+void console_flush_on_panic(void)
+{
+	__flush_on_panic(0);
+}
+
+/**
+ * console_replay_on_panic - replay all messages in buffer on panic
+ */
+void console_replay_on_panic(void)
+{
+	__flush_on_panic(1);
+}
+
 /*
  * Return the console tty driver structure and its associated index
  */
_

Patches currently in -mm which might be from feng.tang@xxxxxxxxx are

panic-avoid-the-extra-noise-dmesg.patch
panic-add-an-option-to-replay-all-the-printk-message-in-buffer.patch




[Index of Archives]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux