[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86 mce: Small fix for polling/CMCI race conditions.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1239021971 -3600 # Node ID 1a7457bb1fdf3ca09840d5762cb77416eda5bd84 # Parent 5a60eb7fad79294ca1b9e74f8da1ea1d165d3199 x86 mce: Small fix for polling/CMCI race conditions. When CMCI happens very quickly, polling/CMCI processing path might cross. For Intel CPUs which support CMCI, if the error bank has CMCI capability, we'll disable poll on this bank. Signed-off-by: Liping Ke <liping.ke@xxxxxxxxx> Signed-off-by: Yunhong Jiang<yunhong.jiang@xxxxxxxxx> --- xen/arch/x86/cpu/mcheck/mce.c | 15 ++++++++++++++- xen/arch/x86/cpu/mcheck/mce.h | 4 ++++ xen/arch/x86/cpu/mcheck/mce_intel.c | 4 ++-- xen/arch/x86/cpu/mcheck/non-fatal.c | 8 ++------ 4 files changed, 22 insertions(+), 9 deletions(-) diff -r 5a60eb7fad79 -r 1a7457bb1fdf xen/arch/x86/cpu/mcheck/mce.c --- a/xen/arch/x86/cpu/mcheck/mce.c Thu Apr 02 14:17:19 2009 +0100 +++ b/xen/arch/x86/cpu/mcheck/mce.c Mon Apr 06 13:46:11 2009 +0100 @@ -577,6 +577,7 @@ void mcheck_init(struct cpuinfo_x86 *c) break; } + set_poll_bankmask(c); if (!inited) printk(XENLOG_INFO "CPU%i: No machine check initialization\n", smp_processor_id()); @@ -1230,7 +1231,19 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u return ret; } - +void set_poll_bankmask(struct cpuinfo_x86 *c) +{ + + if (cmci_support && !mce_disabled) { + memcpy(&(__get_cpu_var(poll_bankmask)), + &(__get_cpu_var(no_cmci_banks)), sizeof(cpu_banks_t)); + } + else { + memcpy(&(get_cpu_var(poll_bankmask)), &mca_allbanks, sizeof(cpu_banks_t)); + if (mce_firstbank(c)) + clear_bit(0, get_cpu_var(poll_bankmask)); + } +} void mc_panic(char *s) { console_start_sync(); diff -r 5a60eb7fad79 -r 1a7457bb1fdf xen/arch/x86/cpu/mcheck/mce.h --- a/xen/arch/x86/cpu/mcheck/mce.h Thu Apr 02 14:17:19 2009 +0100 +++ b/xen/arch/x86/cpu/mcheck/mce.h Mon Apr 06 13:46:11 2009 +0100 @@ -88,6 +88,10 @@ struct mca_summary { }; extern cpu_banks_t mca_allbanks; +void set_poll_bankmask(struct cpuinfo_x86 *c); +DECLARE_PER_CPU(cpu_banks_t, poll_bankmask); +DECLARE_PER_CPU(cpu_banks_t, no_cmci_banks); +extern int cmci_support; extern mctelem_cookie_t mcheck_mca_logout(enum mca_source, cpu_banks_t, struct mca_summary *); diff -r 5a60eb7fad79 -r 1a7457bb1fdf xen/arch/x86/cpu/mcheck/mce_intel.c --- a/xen/arch/x86/cpu/mcheck/mce_intel.c Thu Apr 02 14:17:19 2009 +0100 +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c Mon Apr 06 13:46:11 2009 +0100 @@ -12,9 +12,10 @@ #include "x86_mca.h" DEFINE_PER_CPU(cpu_banks_t, mce_banks_owned); +DEFINE_PER_CPU(cpu_banks_t, no_cmci_banks); +int cmci_support = 0; static int nr_intel_ext_msrs = 0; -static int cmci_support = 0; static int firstbank; #ifdef CONFIG_X86_MCE_THERMAL @@ -548,7 +549,6 @@ static void intel_machine_check(struct c } static DEFINE_SPINLOCK(cmci_discover_lock); -static DEFINE_PER_CPU(cpu_banks_t, no_cmci_banks); /* * Discover bank sharing using the algorithm recommended in the SDM. diff -r 5a60eb7fad79 -r 1a7457bb1fdf xen/arch/x86/cpu/mcheck/non-fatal.c --- a/xen/arch/x86/cpu/mcheck/non-fatal.c Thu Apr 02 14:17:19 2009 +0100 +++ b/xen/arch/x86/cpu/mcheck/non-fatal.c Mon Apr 06 13:46:11 2009 +0100 @@ -22,7 +22,7 @@ #include "mce.h" -static cpu_banks_t bankmask; +DEFINE_PER_CPU(cpu_banks_t, poll_bankmask); static struct timer mce_timer; #define MCE_PERIOD MILLISECS(8000) @@ -39,7 +39,7 @@ static void mce_checkregs (void *info) struct mca_summary bs; static uint64_t dumpcount = 0; - mctc = mcheck_mca_logout(MCA_POLLER, bankmask, &bs); + mctc = mcheck_mca_logout(MCA_POLLER, __get_cpu_var(poll_bankmask), &bs); if (bs.errcnt && mctc != NULL) { adjust++; @@ -94,10 +94,6 @@ static int __init init_nonfatal_mce_chec if (!mce_available(c)) return -ENODEV; - memcpy(&bankmask, &mca_allbanks, sizeof (cpu_banks_t)); - if (mce_firstbank(c) == 1) - clear_bit(0, bankmask); - /* * Check for non-fatal errors every MCE_RATE s */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |