diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-01-29 06:50:23 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-01-29 06:50:23 +0000 |
commit | b5ae6dbc896dcceb4fdaa4c941ade09668ec9236 (patch) | |
tree | 20ffa9afa0d883e6ddfc7fb4ba5cf86f6b8b0630 | |
parent | b1af10565c259b22a8c4c1731adf77372faeea19 (diff) | |
download | xen-b5ae6dbc896dcceb4fdaa4c941ade09668ec9236.tar.gz xen-b5ae6dbc896dcceb4fdaa4c941ade09668ec9236.tar.bz2 xen-b5ae6dbc896dcceb4fdaa4c941ade09668ec9236.zip |
x86 mca: Be more careful for printk in MCE context
MCE may happen in printk context, and will cause deadlock if we try to
call printk again in MCE context.
A new level(mce_critical) is added to mce_verbosity for printk in mce
context. This level is only for developer that aware of such issue.
In mce_panic, force console unlock.
Singed-off-by: Jiang, Yunhong <yunhong.jiang@intel.com>
-rw-r--r-- | xen/arch/x86/cpu/mcheck/mce.c | 2 | ||||
-rw-r--r-- | xen/arch/x86/cpu/mcheck/mce.h | 6 | ||||
-rw-r--r-- | xen/arch/x86/cpu/mcheck/mce_intel.c | 6 |
3 files changed, 8 insertions, 6 deletions
diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c index 415e6a0a44..c1b5983c43 100644 --- a/xen/arch/x86/cpu/mcheck/mce.c +++ b/xen/arch/x86/cpu/mcheck/mce.c @@ -1605,7 +1605,7 @@ void set_poll_bankmask(struct cpuinfo_x86 *c) void mc_panic(char *s) { is_mc_panic = 1; - console_start_sync(); + console_force_unlock(); printk("Fatal machine check: %s\n", s); printk("\n" "****************************************\n" diff --git a/xen/arch/x86/cpu/mcheck/mce.h b/xen/arch/x86/cpu/mcheck/mce.h index 48fdf506d8..6a8c8c85b3 100644 --- a/xen/arch/x86/cpu/mcheck/mce.h +++ b/xen/arch/x86/cpu/mcheck/mce.h @@ -12,8 +12,10 @@ #include "x86_mca.h" #include "mctelem.h" -#define MCE_QUIET 0 -#define MCE_VERBOSE 1 +#define MCE_QUIET 0 +#define MCE_VERBOSE 1 +/* !only for developer debug as printk is unsafe in MCE context */ +#define MCE_CRITICAL 2 extern int mce_verbosity; /* Define the default level of machine check related print. diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c index fe1610d426..e2cd0012dc 100644 --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -687,7 +687,7 @@ static void intel_machine_check(struct cpu_user_regs * regs, long error_code) } atomic_set(&found_error, 1); - mce_printk(MCE_VERBOSE, "MCE: clear_bank map %lx on CPU%d\n", + mce_printk(MCE_CRITICAL, "MCE: clear_bank map %lx on CPU%d\n", *((unsigned long*)clear_bank), smp_processor_id()); mcheck_mca_clearbanks(clear_bank); /* Print MCE error */ @@ -714,13 +714,13 @@ static void intel_machine_check(struct cpu_user_regs * regs, long error_code) /* Clear error finding flags after all cpus finishes above judgement */ mce_barrier_enter(&mce_trap_bar); if (atomic_read(&found_error)) { - mce_printk(MCE_VERBOSE, "MCE: Choose one CPU " + mce_printk(MCE_CRITICAL, "MCE: Choose one CPU " "to clear error finding flag\n "); atomic_set(&found_error, 0); } mca_rdmsrl(MSR_IA32_MCG_STATUS, gstatus); if ((gstatus & MCG_STATUS_MCIP) != 0) { - mce_printk(MCE_VERBOSE, "MCE: Clear MCIP@ last step"); + mce_printk(MCE_CRITICAL, "MCE: Clear MCIP@ last step"); mca_wrmsrl(MSR_IA32_MCG_STATUS, gstatus & ~MCG_STATUS_MCIP); } mce_barrier_exit(&mce_trap_bar); |