Commit 04c6862c authored by Seiji Aguchi's avatar Seiji Aguchi Committed by Linus Torvalds

kmsg_dump: add kmsg_dump() calls to the reboot, halt, poweroff and emergency_restart paths

We need to know the reason why system rebooted in support service.
However, we can't inform our customers of the reason because final
messages are lost on current Linux kernel.

This patch improves the situation above because the final messages are
saved by adding kmsg_dump() to reboot, halt, poweroff and
emergency_restart path.
Signed-off-by: default avatarSeiji Aguchi <seiji.aguchi@hds.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Marco Stornelli <marco.stornelli@gmail.com>
Reviewed-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Reviewed-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent fc2d557c
...@@ -18,6 +18,10 @@ enum kmsg_dump_reason { ...@@ -18,6 +18,10 @@ enum kmsg_dump_reason {
KMSG_DUMP_OOPS, KMSG_DUMP_OOPS,
KMSG_DUMP_PANIC, KMSG_DUMP_PANIC,
KMSG_DUMP_KEXEC, KMSG_DUMP_KEXEC,
KMSG_DUMP_RESTART,
KMSG_DUMP_HALT,
KMSG_DUMP_POWEROFF,
KMSG_DUMP_EMERG,
}; };
/** /**
......
...@@ -1539,6 +1539,10 @@ static const char * const kmsg_reasons[] = { ...@@ -1539,6 +1539,10 @@ static const char * const kmsg_reasons[] = {
[KMSG_DUMP_OOPS] = "oops", [KMSG_DUMP_OOPS] = "oops",
[KMSG_DUMP_PANIC] = "panic", [KMSG_DUMP_PANIC] = "panic",
[KMSG_DUMP_KEXEC] = "kexec", [KMSG_DUMP_KEXEC] = "kexec",
[KMSG_DUMP_RESTART] = "restart",
[KMSG_DUMP_HALT] = "halt",
[KMSG_DUMP_POWEROFF] = "poweroff",
[KMSG_DUMP_EMERG] = "emergency_restart",
}; };
static const char *kmsg_to_str(enum kmsg_dump_reason reason) static const char *kmsg_to_str(enum kmsg_dump_reason reason)
......
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
#include <linux/kprobes.h> #include <linux/kprobes.h>
#include <linux/user_namespace.h> #include <linux/user_namespace.h>
#include <linux/kmsg_dump.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/unistd.h> #include <asm/unistd.h>
...@@ -285,6 +287,7 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who) ...@@ -285,6 +287,7 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
*/ */
void emergency_restart(void) void emergency_restart(void)
{ {
kmsg_dump(KMSG_DUMP_EMERG);
machine_emergency_restart(); machine_emergency_restart();
} }
EXPORT_SYMBOL_GPL(emergency_restart); EXPORT_SYMBOL_GPL(emergency_restart);
...@@ -312,6 +315,7 @@ void kernel_restart(char *cmd) ...@@ -312,6 +315,7 @@ void kernel_restart(char *cmd)
printk(KERN_EMERG "Restarting system.\n"); printk(KERN_EMERG "Restarting system.\n");
else else
printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd); printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
kmsg_dump(KMSG_DUMP_RESTART);
machine_restart(cmd); machine_restart(cmd);
} }
EXPORT_SYMBOL_GPL(kernel_restart); EXPORT_SYMBOL_GPL(kernel_restart);
...@@ -333,6 +337,7 @@ void kernel_halt(void) ...@@ -333,6 +337,7 @@ void kernel_halt(void)
kernel_shutdown_prepare(SYSTEM_HALT); kernel_shutdown_prepare(SYSTEM_HALT);
sysdev_shutdown(); sysdev_shutdown();
printk(KERN_EMERG "System halted.\n"); printk(KERN_EMERG "System halted.\n");
kmsg_dump(KMSG_DUMP_HALT);
machine_halt(); machine_halt();
} }
...@@ -351,6 +356,7 @@ void kernel_power_off(void) ...@@ -351,6 +356,7 @@ void kernel_power_off(void)
disable_nonboot_cpus(); disable_nonboot_cpus();
sysdev_shutdown(); sysdev_shutdown();
printk(KERN_EMERG "Power down.\n"); printk(KERN_EMERG "Power down.\n");
kmsg_dump(KMSG_DUMP_POWEROFF);
machine_power_off(); machine_power_off();
} }
EXPORT_SYMBOL_GPL(kernel_power_off); EXPORT_SYMBOL_GPL(kernel_power_off);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment