aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-01-29 06:50:23 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-01-29 06:50:23 +0000
commitb5ae6dbc896dcceb4fdaa4c941ade09668ec9236 (patch)
tree20ffa9afa0d883e6ddfc7fb4ba5cf86f6b8b0630
parentb1af10565c259b22a8c4c1731adf77372faeea19 (diff)
downloadxen-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.c2
-rw-r--r--xen/arch/x86/cpu/mcheck/mce.h6
-rw-r--r--xen/arch/x86/cpu/mcheck/mce_intel.c6
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);