kmsg_dump: Dump on crash_kexec as well
crash_kexec gets called before kmsg_dump(KMSG_DUMP_OOPS) if panic_on_oops is set, so the kernel log buffer is not stored for this case. This patch adds a KMSG_DUMP_KEXEC dump type which gets called when crash_kexec() is invoked. To avoid getting double dumps, the old KMSG_DUMP_PANIC is moved below crash_kexec(). The mtdoops driver is modified to handle KMSG_DUMP_KEXEC in the same way as a panic. Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Acked-by: Simon Kagstrom <simon.kagstrom@netinsight.net> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
60d9aa758c
commit
0f4bd46ec2
5 changed files with 9 additions and 2 deletions
|
@ -322,7 +322,7 @@ static void mtdoops_do_dump(struct kmsg_dumper *dumper,
|
||||||
memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy);
|
memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy);
|
||||||
|
|
||||||
/* Panics must be written immediately */
|
/* Panics must be written immediately */
|
||||||
if (reason == KMSG_DUMP_PANIC) {
|
if (reason != KMSG_DUMP_OOPS) {
|
||||||
if (!cxt->mtd->panic_write)
|
if (!cxt->mtd->panic_write)
|
||||||
printk(KERN_ERR "mtdoops: Cannot write from panic without panic_write\n");
|
printk(KERN_ERR "mtdoops: Cannot write from panic without panic_write\n");
|
||||||
else
|
else
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
enum kmsg_dump_reason {
|
enum kmsg_dump_reason {
|
||||||
KMSG_DUMP_OOPS,
|
KMSG_DUMP_OOPS,
|
||||||
KMSG_DUMP_PANIC,
|
KMSG_DUMP_PANIC,
|
||||||
|
KMSG_DUMP_KEXEC,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/swap.h>
|
#include <linux/swap.h>
|
||||||
|
#include <linux/kmsg_dump.h>
|
||||||
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
@ -1074,6 +1075,9 @@ void crash_kexec(struct pt_regs *regs)
|
||||||
if (mutex_trylock(&kexec_mutex)) {
|
if (mutex_trylock(&kexec_mutex)) {
|
||||||
if (kexec_crash_image) {
|
if (kexec_crash_image) {
|
||||||
struct pt_regs fixed_regs;
|
struct pt_regs fixed_regs;
|
||||||
|
|
||||||
|
kmsg_dump(KMSG_DUMP_KEXEC);
|
||||||
|
|
||||||
crash_setup_regs(&fixed_regs, regs);
|
crash_setup_regs(&fixed_regs, regs);
|
||||||
crash_save_vmcoreinfo();
|
crash_save_vmcoreinfo();
|
||||||
machine_crash_shutdown(&fixed_regs);
|
machine_crash_shutdown(&fixed_regs);
|
||||||
|
|
|
@ -75,7 +75,6 @@ NORET_TYPE void panic(const char * fmt, ...)
|
||||||
dump_stack();
|
dump_stack();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
kmsg_dump(KMSG_DUMP_PANIC);
|
|
||||||
/*
|
/*
|
||||||
* If we have crashed and we have a crash kernel loaded let it handle
|
* If we have crashed and we have a crash kernel loaded let it handle
|
||||||
* everything else.
|
* everything else.
|
||||||
|
@ -83,6 +82,8 @@ NORET_TYPE void panic(const char * fmt, ...)
|
||||||
*/
|
*/
|
||||||
crash_kexec(NULL);
|
crash_kexec(NULL);
|
||||||
|
|
||||||
|
kmsg_dump(KMSG_DUMP_PANIC);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note smp_send_stop is the usual smp shutdown function, which
|
* Note smp_send_stop is the usual smp shutdown function, which
|
||||||
* unfortunately means it may not be hardened to work in a panic
|
* unfortunately means it may not be hardened to work in a panic
|
||||||
|
|
|
@ -1467,6 +1467,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_unregister);
|
||||||
static const char const *kmsg_reasons[] = {
|
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",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *kmsg_to_str(enum kmsg_dump_reason reason)
|
static const char *kmsg_to_str(enum kmsg_dump_reason reason)
|
||||||
|
|
Loading…
Reference in a new issue