From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753604AbZLUKUk (ORCPT ); Mon, 21 Dec 2009 05:20:40 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753288AbZLUKUk (ORCPT ); Mon, 21 Dec 2009 05:20:40 -0500 Received: from fgwmail6.fujitsu.co.jp ([192.51.44.36]:55138 "EHLO fgwmail6.fujitsu.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753281AbZLUKUj (ORCPT ); Mon, 21 Dec 2009 05:20:39 -0500 X-SecurityPolicyCheck-FJ: OK by FujitsuOutboundMailChecker v1.3.1 From: KOSAKI Motohiro To: Simon Kagstrom , Anders Grafstrom , Artem Bityutskiy , David Woodhouse Subject: [PATCH] mtd: mtdoops: mtdoops works with kexec correctly Cc: kosaki.motohiro@jp.fujitsu.com, LKML Message-Id: <20091221191254.089E.A69D9226@jp.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.50.07 [ja] Date: Mon, 21 Dec 2009 19:20:35 +0900 (JST) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org commit 2e386e4ba(mtdoops: refactor as a kmsg_dumper) is very good patch. but unfortunately it doesn't works with kexec and few embedded user need to use kexec. there is no reason to don't implement it. it isn't so hard. FAQ --- Q. Why KMSG_DUMP_OOPS is insufficient? A. Because crash_kexec() is called before KMSG_DUMP_OOPS if panic_on_oops==1. Q. Why do you move KMSG_DUMP_PANIC call place? A. Otherwise kmsg_dump() is called twice if kexec enabled. it's annoy. Signed-off-by: KOSAKI Motohiro Cc: Simon Kagstrom Cc: Anders Grafstrom Cc: Artem Bityutskiy Cc: David Woodhouse --- drivers/mtd/mtdoops.c | 2 +- include/linux/kmsg_dump.h | 1 + kernel/kexec.c | 4 ++++ kernel/panic.c | 3 ++- kernel/printk.c | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c index a714ec4..92e12df 100644 --- a/drivers/mtd/mtdoops.c +++ b/drivers/mtd/mtdoops.c @@ -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 diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h index e32aa26..24b4414 100644 --- a/include/linux/kmsg_dump.h +++ b/include/linux/kmsg_dump.h @@ -17,6 +17,7 @@ enum kmsg_dump_reason { KMSG_DUMP_OOPS, KMSG_DUMP_PANIC, + KMSG_DUMP_KEXEC, }; /** diff --git a/kernel/kexec.c b/kernel/kexec.c index a9a93d9..ef077fb 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -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); diff --git a/kernel/panic.c b/kernel/panic.c index 5827f7b..c787333 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -75,7 +75,6 @@ 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. @@ -83,6 +82,8 @@ NORET_TYPE void panic(const char * fmt, ...) */ 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 diff --git a/kernel/printk.c b/kernel/printk.c index 17463ca..1751c45 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -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) -- 1.6.5.2