diff -r 6b73078a4403 xen/arch/x86/cpu/mcheck/amd_k8.c --- a/xen/arch/x86/cpu/mcheck/amd_k8.c Fri Oct 12 14:38:20 2012 +0200 +++ b/xen/arch/x86/cpu/mcheck/amd_k8.c Fri Oct 12 15:20:08 2012 +0200 @@ -72,7 +72,31 @@ /* Machine Check Handler for AMD K8 family series */ static void k8_machine_check(struct cpu_user_regs *regs, long error_code) { - mcheck_cmn_handler(regs, error_code, mca_allbanks, NULL); + mcheck_cmn_handler(regs, error_code, mca_allbanks, + __get_cpu_var(mce_clear_banks)); +} + +static int k8_need_clearbank_scan(enum mca_source who, uint64_t status) +{ + switch (who) { + case MCA_MCE_SCAN: + case MCA_MCE_HANDLER: + break; + default: + return 1; + } + + /* For fatal error, it shouldn't be cleared so that sticky bank + * have chance to be handled after reboot by polling. + */ + if ( (status & MCi_STATUS_UC) && (status & MCi_STATUS_PCC) ) + return 0; + /* Spurious need clear bank */ + if ( !(status & MCi_STATUS_OVER) + && (status & MCi_STATUS_UC) && !(status & MCi_STATUS_EN)) + return 1; + + return 1; } /* AMD K8 machine check */ @@ -85,6 +109,7 @@ enum mcheck_type amd_k8_mcheck_init(stru mce_handler_init(); x86_mce_vector_register(k8_machine_check); + mce_need_clearbank_register(k8_need_clearbank_scan); for (i = 0; i < nr_mce_banks; i++) { if (quirkflag == MCEQUIRK_K8_GART && i == 4) { diff -r 6b73078a4403 xen/arch/x86/cpu/mcheck/mce.c --- a/xen/arch/x86/cpu/mcheck/mce.c Fri Oct 12 14:38:20 2012 +0200 +++ b/xen/arch/x86/cpu/mcheck/mce.c Fri Oct 12 15:20:08 2012 +0200 @@ -35,6 +35,10 @@ bool_t is_mc_panic; unsigned int __read_mostly nr_mce_banks; unsigned int __read_mostly firstbank; +DEFINE_PER_CPU(struct mca_banks *, poll_bankmask); +DEFINE_PER_CPU(struct mca_banks *, no_cmci_banks); +DEFINE_PER_CPU(struct mca_banks *, mce_clear_banks); + static void intpose_init(void); static void mcinfo_clear(struct mc_info *); struct mca_banks *mca_allbanks; diff -r 6b73078a4403 xen/arch/x86/cpu/mcheck/mce.h --- a/xen/arch/x86/cpu/mcheck/mce.h Fri Oct 12 14:38:20 2012 +0200 +++ b/xen/arch/x86/cpu/mcheck/mce.h Fri Oct 12 15:20:08 2012 +0200 @@ -122,6 +122,7 @@ struct mca_summary { DECLARE_PER_CPU(struct mca_banks *, poll_bankmask); DECLARE_PER_CPU(struct mca_banks *, no_cmci_banks); +DECLARE_PER_CPU(struct mca_banks *, mce_clear_banks); extern bool_t cmci_support; extern bool_t is_mc_panic; diff -r 6b73078a4403 xen/arch/x86/cpu/mcheck/mce_intel.c --- a/xen/arch/x86/cpu/mcheck/mce_intel.c Fri Oct 12 14:38:20 2012 +0200 +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c Fri Oct 12 15:20:08 2012 +0200 @@ -21,9 +21,7 @@ #include "vmce.h" #include "mcaction.h" -DEFINE_PER_CPU(struct mca_banks *, mce_banks_owned); -DEFINE_PER_CPU(struct mca_banks *, no_cmci_banks); -DEFINE_PER_CPU(struct mca_banks *, mce_clear_banks); +static DEFINE_PER_CPU(struct mca_banks *, mce_banks_owned); bool_t __read_mostly cmci_support = 0; static bool_t __read_mostly ser_support = 0; static bool_t __read_mostly mce_force_broadcast; diff -r 6b73078a4403 xen/arch/x86/cpu/mcheck/mctelem.h --- a/xen/arch/x86/cpu/mcheck/mctelem.h Fri Oct 12 14:38:20 2012 +0200 +++ b/xen/arch/x86/cpu/mcheck/mctelem.h Fri Oct 12 15:20:08 2012 +0200 @@ -23,7 +23,7 @@ * urgent uses, intended for use from machine check exception handlers, * and non-urgent uses intended for use from error pollers. * Associated with each logout entry of whatever class is a data area - * sized per the single argument to mctelem_init. mcelem_init should be + * sized per the single argument to mctelem_init. mctelem_init should be * called from MCA init code before anybody has the chance to change the * machine check vector with mcheck_mca_logout or to use mcheck_mca_logout. * @@ -45,7 +45,7 @@ * which will return a cookie referencing the oldest (first committed) * entry of the requested class. Access the associated data using * mctelem_dataptr and when finished use mctelem_consume_oldest_end - in the - * begin .. end bracket you are guaranteed that the entry canot be freed + * begin .. end bracket you are guaranteed that the entry cannot be freed * even if it is ack'd elsewhere). Once the ultimate consumer of the * telemetry has processed it to stable storage it should acknowledge * the telemetry quoting the cookie id, at which point we will free diff -r 6b73078a4403 xen/arch/x86/cpu/mcheck/non-fatal.c --- a/xen/arch/x86/cpu/mcheck/non-fatal.c Fri Oct 12 14:38:20 2012 +0200 +++ b/xen/arch/x86/cpu/mcheck/non-fatal.c Fri Oct 12 15:20:08 2012 +0200 @@ -23,7 +23,6 @@ #include "mce.h" #include "vmce.h" -DEFINE_PER_CPU(struct mca_banks *, poll_bankmask); static struct timer mce_timer; #define MCE_PERIOD MILLISECS(8000)