[Precise][PATCH 2/2] kmsg_dump: don't run on non-error paths by default

joseph.salisbury at canonical.com joseph.salisbury at canonical.com
Fri Apr 6 22:41:49 UTC 2012

From: Matthew Garrett <mjg at redhat.com>

BugLink: http://bugs.launchpad.net/bugs/944772

Since commit 04c6862c055f ("kmsg_dump: add kmsg_dump() calls to the
reboot, halt, poweroff and emergency_restart paths"), kmsg_dump() gets
run on normal paths including poweroff and reboot.

This is less than ideal given pstore implementations that can only
represent single backtraces, since a reboot may overwrite a stored oops
before it's been picked up by userspace.  In addition, some pstore
backends may have low performance and provide a significant delay in
reboot as a result.

This patch adds a printk.always_kmsg_dump kernel parameter (which can also
be changed from userspace).  Without it, the code will only be run on
failure paths rather than on normal paths.  The option can be enabled in
environments where there's a desire to attempt to audit whether or not a
reboot was cleanly requested or not.

Signed-off-by: Matthew Garrett <mjg at redhat.com>
Acked-by: Seiji Aguchi <seiji.aguchi at hds.com>
Cc: Seiji Aguchi <seiji.aguchi at hds.com>
Cc: David Woodhouse <dwmw2 at infradead.org>
Cc: Marco Stornelli <marco.stornelli at gmail.com>
Cc: Artem Bityutskiy <Artem.Bityutskiy at nokia.com>
Cc: KOSAKI Motohiro <kosaki.motohiro at jp.fujitsu.com>
Cc: Vivek Goyal <vgoyal at redhat.com>
Cc: Don Zickus <dzickus at redhat.com>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
(cherry picked from commit c22ab332902333f83766017478c1ef6607ace681)

Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
 Documentation/kernel-parameters.txt |    6 ++++++
 include/linux/kmsg_dump.h           |    9 +++++++--
 kernel/printk.c                     |    6 ++++++
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index dd57275..cb0532b 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2187,6 +2187,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 			default: off.
+	printk.always_kmsg_dump=
+			Trigger kmsg_dump for cases other than kernel oops or
+			panics
+			Format: <bool>  (1/Y/y=enable, 0/N/n=disable)
+			default: disabled
 	printk.time=	Show timing data prefixed to each printk message line
 			Format: <bool>  (1/Y/y=enable, 0/N/n=disable)
diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h
index fee6631..35f7237 100644
--- a/include/linux/kmsg_dump.h
+++ b/include/linux/kmsg_dump.h
@@ -15,13 +15,18 @@
 #include <linux/errno.h>
 #include <linux/list.h>
+ * Keep this list arranged in rough order of priority. Anything listed after
+ * KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump
+ * is passed to the kernel.
+ */
 enum kmsg_dump_reason {
diff --git a/kernel/printk.c b/kernel/printk.c
index 7982a0a..3524a2d 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -701,6 +701,9 @@ static int printk_time = 0;
 module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
+static bool always_kmsg_dump;
+module_param_named(always_kmsg_dump, always_kmsg_dump, bool, S_IRUGO | S_IWUSR);
 /* Check if we have any console registered that can be called early in boot. */
 static int have_callable_console(void)
@@ -1733,6 +1736,9 @@ void kmsg_dump(enum kmsg_dump_reason reason)
 	unsigned long l1, l2;
 	unsigned long flags;
+	if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump)
+		return;
 	/* Theoretically, the log could move on after we do this, but
 	   there's not a lot we can do about that. The new messages
 	   will overwrite the start of what we dump. */

More information about the kernel-team mailing list