diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-02-10 09:18:11 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-02-10 09:18:11 +0000 |
commit | 948593955a433efb249034849be0313e34acfbfa (patch) | |
tree | 2ae1c12521b8f0476b50992cfd3357f192d50101 | |
parent | 8d835167c276055389215d4cabdb20bcb786146f (diff) | |
download | xen-948593955a433efb249034849be0313e34acfbfa.tar.gz xen-948593955a433efb249034849be0313e34acfbfa.tar.bz2 xen-948593955a433efb249034849be0313e34acfbfa.zip |
x86: MCE fixes
- fill_vmsr_data() leaked a domain reference; since the caller already
obtained one, there's no need to obtain another one here
- intel_UCR_handler() could call put_domain() with a NULL pointer
- mcheck_mca_logout() updated a local data structure that wasn't used
after the update
Signed-off-by: Jan Beulich <jbeulich@novell.com>
-rw-r--r-- | xen/arch/x86/cpu/mcheck/mce.c | 12 | ||||
-rw-r--r-- | xen/arch/x86/cpu/mcheck/mce_intel.c | 18 |
2 files changed, 13 insertions, 17 deletions
diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c index c1b5983c43..d5b404aba6 100644 --- a/xen/arch/x86/cpu/mcheck/mce.c +++ b/xen/arch/x86/cpu/mcheck/mce.c @@ -300,13 +300,15 @@ mctelem_cookie_t mcheck_mca_logout(enum mca_source who, cpu_banks_t bankmask, if (mci != NULL && errcnt > 0) { x86_mcinfo_lookup(mic, mci, MC_TYPE_GLOBAL); - mig = (struct mcinfo_global *)mic; - if (pcc) - mcg.mc_flags |= MC_FLAG_UNCORRECTABLE; + mig = container_of(mic, struct mcinfo_global, common); + if (mic == NULL) + ; + else if (pcc) + mig->mc_flags |= MC_FLAG_UNCORRECTABLE; else if (uc) - mcg.mc_flags |= MC_FLAG_RECOVERABLE; + mig->mc_flags |= MC_FLAG_RECOVERABLE; else - mcg.mc_flags |= MC_FLAG_CORRECTABLE; + mig->mc_flags |= MC_FLAG_CORRECTABLE; } diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c index 310bae12c1..be44dcf71c 100644 --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -225,22 +225,13 @@ static struct bank_entry* alloc_bank_entry(void) { for vMCE# MSRs virtualization */ -static int fill_vmsr_data(struct mcinfo_bank *mc_bank, +static int fill_vmsr_data(struct mcinfo_bank *mc_bank, struct domain *d, uint64_t gstatus) { - struct domain *d; struct bank_entry *entry; /* This error bank impacts one domain, we need to fill domain related * data for vMCE MSRs virtualization and vMCE# injection */ if (mc_bank->mc_domid != (uint16_t)~0) { - d = get_domain_by_id(mc_bank->mc_domid); - - /* Not impact a valid domain, skip this error of the bank */ - if (!d) { - mce_printk(MCE_QUIET, "MCE: Not found valid impacted DOM\n"); - return 0; - } - /* For HVM guest, Only when first vMCE is consumed by HVM guest successfully, * will we generete another node and inject another vMCE */ @@ -365,15 +356,18 @@ static void intel_UCR_handler(struct mcinfo_bank *bank, if ( mca_ctl_conflict(bank, d) ) { /* Guest has different MCE ctl with hypervisor */ - put_domain(d); + if ( d ) + put_domain(d); return; } + ASSERT(d); gfn = get_gpfn_from_mfn((bank->mc_addr) >> PAGE_SHIFT); bank->mc_addr = gfn << PAGE_SHIFT | (bank->mc_addr & (PAGE_SIZE -1 )); - if (fill_vmsr_data(bank, global->mc_gstatus) == -1) + if ( fill_vmsr_data(bank, d, + global->mc_gstatus) == -1 ) { mce_printk(MCE_QUIET, "Fill vMCE# data for DOM%d " "failed\n", result->owner); |