Skip to content

Commit

Permalink
kmsg_dump: Dump on crash_kexec as well
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Simon Kagstrom <[email protected]>
Signed-off-by: David Woodhouse <[email protected]>
  • Loading branch information
kosaki authored and David Woodhouse committed Dec 31, 2009
1 parent 60d9aa7 commit 0f4bd46
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 2 deletions.
2 changes: 1 addition & 1 deletion drivers/mtd/mtdoops.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ static void mtdoops_do_dump(struct kmsg_dumper *dumper,
memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy);

/* Panics must be written immediately */
if (reason == KMSG_DUMP_PANIC) {
if (reason != KMSG_DUMP_OOPS) {
if (!cxt->mtd->panic_write)
printk(KERN_ERR "mtdoops: Cannot write from panic without panic_write\n");
else
Expand Down
1 change: 1 addition & 0 deletions include/linux/kmsg_dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
enum kmsg_dump_reason {
KMSG_DUMP_OOPS,
KMSG_DUMP_PANIC,
KMSG_DUMP_KEXEC,
};

/**
Expand Down
4 changes: 4 additions & 0 deletions kernel/kexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <linux/console.h>
#include <linux/vmalloc.h>
#include <linux/swap.h>
#include <linux/kmsg_dump.h>

#include <asm/page.h>
#include <asm/uaccess.h>
Expand Down Expand Up @@ -1074,6 +1075,9 @@ void crash_kexec(struct pt_regs *regs)
if (mutex_trylock(&kexec_mutex)) {
if (kexec_crash_image) {
struct pt_regs fixed_regs;

kmsg_dump(KMSG_DUMP_KEXEC);

crash_setup_regs(&fixed_regs, regs);
crash_save_vmcoreinfo();
machine_crash_shutdown(&fixed_regs);
Expand Down
3 changes: 2 additions & 1 deletion kernel/panic.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,15 @@ NORET_TYPE void panic(const char * fmt, ...)
dump_stack();
#endif

kmsg_dump(KMSG_DUMP_PANIC);
/*
* If we have crashed and we have a crash kernel loaded let it handle
* everything else.
* Do we want to call this before we try to display a message?
*/
crash_kexec(NULL);

kmsg_dump(KMSG_DUMP_PANIC);

/*
* Note smp_send_stop is the usual smp shutdown function, which
* unfortunately means it may not be hardened to work in a panic
Expand Down
1 change: 1 addition & 0 deletions kernel/printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -1467,6 +1467,7 @@ EXPORT_SYMBOL_GPL(kmsg_dump_unregister);
static const char const *kmsg_reasons[] = {
[KMSG_DUMP_OOPS] = "oops",
[KMSG_DUMP_PANIC] = "panic",
[KMSG_DUMP_KEXEC] = "kexec",
};

static const char *kmsg_to_str(enum kmsg_dump_reason reason)
Expand Down

0 comments on commit 0f4bd46

Please sign in to comment.