Messages in this thread Patch in this message | | | Date | Fri, 22 Jun 2012 16:41:43 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH v4 2/2] x86 mce: use new printk recursion disabling interface |
| |
On Mon, 04 Jun 2012 11:07:11 +0800 ShuoX Liu <shuox.liu@intel.com> wrote:
> From: ShuoX Liu <shuox.liu@intel.com> > > Disable printk recursion to make sure MCE logs printed out. > > Signed-off-by: Yanmin Zhang <yanmin_zhang@linux.intel.com> > Signed-off-by: ShuoX Liu <shuox.liu@intel.com> > --- > We hit it when running a MTBF testing on a Android atom mobile. > --- > arch/x86/kernel/cpu/mcheck/mce.c | 2 ++ > 1 files changed, 2 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c > index 2afcbd2..906e838 100644 > --- a/arch/x86/kernel/cpu/mcheck/mce.c > +++ b/arch/x86/kernel/cpu/mcheck/mce.c > @@ -306,6 +306,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp) > { > int i, apei_err = 0; > > + printk_recursion_check_disable(); > if (!fake_panic) { > /* > * Make sure only one CPU runs in machine check panic > @@ -360,6 +361,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp) > panic(msg); > } else > pr_emerg(HW_ERR "Fake kernel panic: %s\n", msg); > + printk_recursion_check_enable(); > } > > /* Support code for software error injection */
A couple of things here.
a) mce_panic() has a "return" statement deep inside. So we return from mce_panic() with the recursion check disabled. whoops.
b) adding a nice comment is nice.
--- a/arch/x86/kernel/cpu/mcheck/mce.c~x86-mce-use-new-printk-recursion-disabling-interface-fix +++ a/arch/x86/kernel/cpu/mcheck/mce.c @@ -303,11 +303,10 @@ static void wait_for_panic(void) panic("Panicing machine check CPU died"); } -static void mce_panic(char *msg, struct mce *final, char *exp) +static void __mce_panic(char *msg, struct mce *final, char *exp) { int i, apei_err = 0; - printk_recursion_check_disable(); if (!fake_panic) { /* * Make sure only one CPU runs in machine check panic @@ -362,6 +361,17 @@ static void mce_panic(char *msg, struct panic(msg); } else pr_emerg(HW_ERR "Fake kernel panic: %s\n", msg); +} + +/* + * If an MCE happens to occur during the execution of a printk(), we want the + * MCE information to be displayed. But printk()'s recursion checking prevents + * that. So temporarily disable it. + */ +static void mce_panic(char *msg, struct mce *final, char *exp) +{ + printk_recursion_check_disable(); + __mce_panic(msg, final, exp); printk_recursion_check_enable(); } _
| |