[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86, mce: Control Machine Check Log output verbosity
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1253871902 -3600 # Node ID c7ee30ba186d170ef09620b86731f8387544445f # Parent 0f8376078dc145b465a1929af10e7f576375d8a5 x86, mce: Control Machine Check Log output verbosity This small patch is for controlling machine check related Xen log output. When set mce_verbosity=verbose in command line, all mce related logs will be printed. Otherwise, those logs will be eliminated. Signed-off-by: Liping Ke <liping.ke@xxxxxxxxx> --- xen/arch/x86/cpu/mcheck/mce.c | 55 +++++++++++++++----------- xen/arch/x86/cpu/mcheck/mce.h | 15 +++++++ xen/arch/x86/cpu/mcheck/mce_intel.c | 76 ++++++++++++++++++------------------ 3 files changed, 86 insertions(+), 60 deletions(-) diff -r 0f8376078dc1 -r c7ee30ba186d xen/arch/x86/cpu/mcheck/mce.c --- a/xen/arch/x86/cpu/mcheck/mce.c Wed Sep 23 18:19:30 2009 +0100 +++ b/xen/arch/x86/cpu/mcheck/mce.c Fri Sep 25 10:45:02 2009 +0100 @@ -22,10 +22,10 @@ #include "mce.h" -int mce_disabled = 0; +int mce_disabled; invbool_param("mce", mce_disabled); -int is_mc_panic = 0; +int is_mc_panic; unsigned int nr_mce_banks; static uint64_t g_mcg_cap; @@ -48,6 +48,17 @@ static int x86_mcerr(const char *msg, in #endif cpu_banks_t mca_allbanks; + +int mce_verbosity; +static void __init mce_set_verbosity(char *str) +{ + if (strcmp("verbose", str) == 0) + mce_verbosity = MCE_VERBOSE; + else + printk(KERN_DEBUG "Machine Check verbosity level %s not recognised" + "use mce_verbosity=verbose", str); +} +custom_param("mce_verbosity", mce_set_verbosity); /* Handle unconfigured int18 (should never happen) */ static void unexpected_machine_check(struct cpu_user_regs *regs, long error_code) @@ -687,24 +698,24 @@ int mce_rdmsr(uint32_t msr, uint64_t *va case MSR_IA32_MCG_STATUS: *val = d->arch.vmca_msrs.mcg_status; if (*val) - gdprintk(XENLOG_DEBUG, + mce_printk(MCE_VERBOSE, "MCE: rdmsr MCG_STATUS 0x%"PRIx64"\n", *val); break; case MSR_IA32_MCG_CAP: *val = d->arch.vmca_msrs.mcg_cap; - gdprintk(XENLOG_DEBUG, "MCE: rdmsr MCG_CAP 0x%"PRIx64"\n", + mce_printk(MCE_VERBOSE, "MCE: rdmsr MCG_CAP 0x%"PRIx64"\n", *val); break; case MSR_IA32_MCG_CTL: *val = d->arch.vmca_msrs.mcg_ctl; - gdprintk(XENLOG_DEBUG, "MCE: rdmsr MCG_CTL 0x%"PRIx64"\n", + mce_printk(MCE_VERBOSE, "MCE: rdmsr MCG_CTL 0x%"PRIx64"\n", *val); break; case MSR_IA32_MC0_CTL ... MSR_IA32_MC0_CTL + 4 * MAX_NR_BANKS - 1: bank = (msr - MSR_IA32_MC0_CTL) / 4; if ( bank >= (d->arch.vmca_msrs.mcg_cap & MCG_CAP_COUNT) ) { - gdprintk(XENLOG_WARNING, "MCE: bank %u does not exist\n", bank); + mce_printk(MCE_QUIET, "MCE: bank %u does not exist\n", bank); ret = -1; break; } @@ -712,7 +723,7 @@ int mce_rdmsr(uint32_t msr, uint64_t *va { case MSR_IA32_MC0_CTL: *val = d->arch.vmca_msrs.mci_ctl[bank]; - gdprintk(XENLOG_DEBUG, "MCE: rdmsr MC%u_CTL 0x%"PRIx64"\n", + mce_printk(MCE_VERBOSE, "MCE: rdmsr MC%u_CTL 0x%"PRIx64"\n", bank, *val); break; case MSR_IA32_MC0_STATUS: @@ -723,7 +734,7 @@ int mce_rdmsr(uint32_t msr, uint64_t *va struct bank_entry, list); if (entry->bank == bank) { *val = entry->mci_status; - gdprintk(XENLOG_DEBUG, + mce_printk(MCE_VERBOSE, "MCE: rd MC%u_STATUS in vMCE# context " "value 0x%"PRIx64"\n", bank, *val); } @@ -739,7 +750,7 @@ int mce_rdmsr(uint32_t msr, uint64_t *va if ( entry->bank == bank ) { *val = entry->mci_addr; - gdprintk(XENLOG_DEBUG, + mce_printk(MCE_VERBOSE, "MCE: rdmsr MC%u_ADDR in vMCE# context " "0x%"PRIx64"\n", bank, *val); } @@ -753,7 +764,7 @@ int mce_rdmsr(uint32_t msr, uint64_t *va if ( entry->bank == bank ) { *val = entry->mci_misc; - gdprintk(XENLOG_DEBUG, + mce_printk(MCE_VERBOSE, "MCE: rd MC%u_MISC in vMCE# context " "0x%"PRIx64"\n", bank, *val); } @@ -795,7 +806,7 @@ int mce_wrmsr(u32 msr, u64 val) case MSR_IA32_MCG_CTL: if ( val && (val + 1) ) { - gdprintk(XENLOG_WARNING, "MCE: val \"%"PRIx64"\" written " + mce_printk(MCE_QUIET, "MCE: val \"%"PRIx64"\" written " "to MCG_CTL should be all 0s or 1s\n", val); ret = -1; break; @@ -804,7 +815,7 @@ int mce_wrmsr(u32 msr, u64 val) break; case MSR_IA32_MCG_STATUS: d->arch.vmca_msrs.mcg_status = val; - gdprintk(XENLOG_DEBUG, "MCE: wrmsr MCG_STATUS %"PRIx64"\n", val); + mce_printk(MCE_VERBOSE, "MCE: wrmsr MCG_STATUS %"PRIx64"\n", val); /* For HVM guest, this is the point for deleting vMCE injection node */ if ( d->is_hvm && (d->arch.vmca_msrs.nr_injection > 0) ) { @@ -814,29 +825,29 @@ int mce_wrmsr(u32 msr, u64 val) entry = list_entry(d->arch.vmca_msrs.impact_header.next, struct bank_entry, list); if ( entry->mci_status & MCi_STATUS_VAL ) - gdprintk(XENLOG_ERR, "MCE: MCi_STATUS MSR should have " + mce_printk(MCE_QUIET, "MCE: MCi_STATUS MSR should have " "been cleared before write MCG_STATUS MSR\n"); - gdprintk(XENLOG_DEBUG, "MCE: Delete HVM last injection " + mce_printk(MCE_QUIET, "MCE: Delete HVM last injection " "Node, nr_injection %u\n", d->arch.vmca_msrs.nr_injection); list_del(&entry->list); xfree(entry); } else - gdprintk(XENLOG_WARNING, "MCE: Not found HVM guest" + mce_printk(MCE_QUIET, "MCE: Not found HVM guest" " last injection Node, something Wrong!\n"); } break; case MSR_IA32_MCG_CAP: - gdprintk(XENLOG_WARNING, "MCE: MCG_CAP is read-only\n"); + mce_printk(MCE_QUIET, "MCE: MCG_CAP is read-only\n"); ret = -1; break; case MSR_IA32_MC0_CTL ... MSR_IA32_MC0_CTL + 4 * MAX_NR_BANKS - 1: bank = (msr - MSR_IA32_MC0_CTL) / 4; if ( bank >= (d->arch.vmca_msrs.mcg_cap & MCG_CAP_COUNT) ) { - gdprintk(XENLOG_WARNING, "MCE: bank %u does not exist\n", bank); + mce_printk(MCE_QUIET, "MCE: bank %u does not exist\n", bank); ret = -1; break; } @@ -845,7 +856,7 @@ int mce_wrmsr(u32 msr, u64 val) case MSR_IA32_MC0_CTL: if ( val && (val + 1) ) { - gdprintk(XENLOG_WARNING, "MCE: val written to MC%u_CTL " + mce_printk(MCE_QUIET, "MCE: val written to MC%u_CTL " "should be all 0s or 1s (is %"PRIx64")\n", bank, val); ret = -1; @@ -865,20 +876,20 @@ int mce_wrmsr(u32 msr, u64 val) struct bank_entry, list); if ( entry->bank == bank ) entry->mci_status = val; - gdprintk(XENLOG_DEBUG, + mce_printk(MCE_VERBOSE, "MCE: wr MC%u_STATUS %"PRIx64" in vMCE#\n", bank, val); } else - gdprintk(XENLOG_DEBUG, + mce_printk(MCE_VERBOSE, "MCE: wr MC%u_STATUS %"PRIx64"\n", bank, val); break; case MSR_IA32_MC0_ADDR: - gdprintk(XENLOG_WARNING, "MCE: MC%u_ADDR is read-only\n", bank); + mce_printk(MCE_QUIET, "MCE: MC%u_ADDR is read-only\n", bank); ret = -1; break; case MSR_IA32_MC0_MISC: - gdprintk(XENLOG_WARNING, "MCE: MC%u_MISC is read-only\n", bank); + mce_printk(MCE_QUIET, "MCE: MC%u_MISC is read-only\n", bank); ret = -1; break; } diff -r 0f8376078dc1 -r c7ee30ba186d xen/arch/x86/cpu/mcheck/mce.h --- a/xen/arch/x86/cpu/mcheck/mce.h Wed Sep 23 18:19:30 2009 +0100 +++ b/xen/arch/x86/cpu/mcheck/mce.h Fri Sep 25 10:45:02 2009 +0100 @@ -11,6 +11,21 @@ #include "x86_mca.h" #include "mctelem.h" + +#define MCE_QUIET 0 +#define MCE_VERBOSE 1 + +extern int mce_verbosity; +/* Define the default level of machine check related print. + * When set mce_verbosity=verbose, all mce debug information + * will be printed, otherwise, those information will not be + * printed. + */ +#define mce_printk(v, s, a...) do { \ + if ((v) <= mce_verbosity) \ + printk(s, ##a); \ + } while (0) + /* Init functions */ int amd_k7_mcheck_init(struct cpuinfo_x86 *c); diff -r 0f8376078dc1 -r c7ee30ba186d xen/arch/x86/cpu/mcheck/mce_intel.c --- a/xen/arch/x86/cpu/mcheck/mce_intel.c Wed Sep 23 18:19:30 2009 +0100 +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c Fri Sep 25 10:45:02 2009 +0100 @@ -238,7 +238,7 @@ static int fill_vmsr_data(struct mcinfo_ /* Not impact a valid domain, skip this error of the bank */ if (!d) { - printk(KERN_DEBUG "MCE: Not found valid impacted DOM\n"); + mce_printk(MCE_QUIET, "MCE: Not found valid impacted DOM\n"); return 0; } @@ -247,7 +247,7 @@ static int fill_vmsr_data(struct mcinfo_ */ if ( (d->is_hvm) && (d->arch.vmca_msrs.nr_injection > 0) ) { - printk(KERN_DEBUG "MCE: HVM guest has not handled previous" + mce_printk(MCE_QUIET, "MCE: HVM guest has not handled previous" " vMCE yet!\n"); return -1; } @@ -269,7 +269,7 @@ static int fill_vmsr_data(struct mcinfo_ d->arch.vmca_msrs.nr_injection++; spin_unlock(&d->arch.vmca_msrs.lock); - printk(KERN_DEBUG "MCE: Found error @[BANK%d " + mce_printk(MCE_VERBOSE,"MCE: Found error @[BANK%d " "status %"PRIx64" addr %"PRIx64" domid %d]\n ", mc_bank->mc_bank, mc_bank->mc_status, mc_bank->mc_addr, mc_bank->mc_domid); @@ -289,14 +289,14 @@ static int inject_mce(struct domain *d) { if (d->is_hvm) { - printk(KERN_DEBUG "MCE: inject vMCE to HVM DOM %d\n", + mce_printk(MCE_VERBOSE, "MCE: inject vMCE to HVM DOM %d\n", d->domain_id); vcpu_kick(d->vcpu[0]); } /* PV guest including DOM0 */ else { - printk(KERN_DEBUG "MCE: inject vMCE to PV DOM%d\n", + mce_printk(MCE_VERBOSE, "MCE: inject vMCE to PV DOM%d\n", d->domain_id); if (guest_has_trap_callback (d, 0, TRAP_machine_check)) @@ -305,14 +305,14 @@ static int inject_mce(struct domain *d) d->vcpu[0]->cpu_affinity; cpus_clear(affinity); cpu_set(cpu, affinity); - printk(KERN_DEBUG "MCE: CPU%d set affinity, old %d\n", cpu, + mce_printk(MCE_VERBOSE, "MCE: CPU%d set affinity, old %d\n", cpu, d->vcpu[0]->processor); vcpu_set_affinity(d->vcpu[0], &affinity); vcpu_kick(d->vcpu[0]); } else { - printk(KERN_DEBUG "MCE: Kill PV guest with No MCE handler\n"); + mce_printk(MCE_VERBOSE, "MCE: Kill PV guest with No MCE handler\n"); domain_crash(d); } } @@ -322,7 +322,7 @@ static int inject_mce(struct domain *d) * in this case, inject fail. [We can't lose this vMCE for * the mce node's consistency]. */ - printk(KERN_DEBUG "There's a pending vMCE waiting to be injected " + mce_printk(MCE_QUIET, "There's a pending vMCE waiting to be injected " " to this DOM%d!\n", d->domain_id); return -1; } @@ -338,7 +338,7 @@ void intel_UCR_handler(struct mcinfo_ban unsigned long mfn, gfn; uint32_t status; - printk(KERN_DEBUG "MCE: Enter UCR recovery action\n"); + mce_printk(MCE_VERBOSE, "MCE: Enter UCR recovery action\n"); result->result = MCA_NEED_RESET; if (bank->mc_addr != 0) { mfn = bank->mc_addr >> PAGE_SHIFT; @@ -351,7 +351,7 @@ void intel_UCR_handler(struct mcinfo_ban if (status & PG_OFFLINE_OWNED) { result->result |= MCA_OWNER; result->owner = status >> PG_OFFLINE_OWNER_SHIFT; - printk(KERN_DEBUG "MCE: This error page is ownded" + mce_printk(MCE_QUIET, "MCE: This error page is ownded" " by DOM %d\n", result->owner); /* Fill vMCE# injection and vMCE# MSR virtualization " * "related data */ @@ -364,7 +364,7 @@ void intel_UCR_handler(struct mcinfo_ban gfn << PAGE_SHIFT | (bank->mc_addr & PAGE_MASK); if (fill_vmsr_data(bank, global->mc_gstatus) == -1) { - printk(KERN_DEBUG "Fill vMCE# data for DOM%d " + mce_printk(MCE_QUIET, "Fill vMCE# data for DOM%d " "failed\n", result->owner); domain_crash(d); return; @@ -372,7 +372,7 @@ void intel_UCR_handler(struct mcinfo_ban /* We will inject vMCE to DOMU*/ if ( inject_mce(d) < 0 ) { - printk(KERN_DEBUG "inject vMCE to DOM%d" + mce_printk(MCE_QUIET, "inject vMCE to DOM%d" " failed\n", d->domain_id); domain_crash(d); return; @@ -452,11 +452,11 @@ static int mce_action(mctelem_cookie_t m mc_panic("MCE: Software recovery failed for the UCR " "error\n"); else if (mca_res.result == MCA_RECOVERED) - printk(KERN_DEBUG "MCE: The UCR error is succesfully " - "recovered by software!\n"); + mce_printk(MCE_VERBOSE, "MCE: The UCR error is" + "successfully recovered by software!\n"); else if (mca_res.result == MCA_NO_ACTION) - printk(KERN_DEBUG "MCE: Overwrite SRAO error can't execute " - "recover action, RIPV=1, let it be.\n"); + mce_printk(MCE_VERBOSE, "MCE: Overwrite SRAO error can't" + "do recover action, RIPV=1, let it be.\n"); break; } } @@ -464,8 +464,8 @@ static int mce_action(mctelem_cookie_t m * in MCA Handler */ if ( i >= INTEL_MAX_RECOVERY ) - printk(KERN_DEBUG "MCE: No software recovery action found for " - "this SRAO error\n"); + mce_printk(MCE_VERBOSE, "MCE: No software recovery action" + " found for this SRAO error\n"); } return 1; @@ -477,7 +477,7 @@ static void mce_softirq(void) int cpu = smp_processor_id(); unsigned int workcpu; - printk(KERN_DEBUG "CPU%d enter softirq\n", cpu); + mce_printk(MCE_VERBOSE, "CPU%d enter softirq\n", cpu); mce_barrier_enter(&mce_inside_bar); @@ -500,7 +500,7 @@ static void mce_softirq(void) /* We choose severity_cpu for further processing */ if (atomic_read(&severity_cpu) == cpu) { - printk(KERN_DEBUG "CPU%d handling errors\n", cpu); + mce_printk(MCE_VERBOSE, "CPU%d handling errors\n", cpu); /* Step1: Fill DOM0 LOG buffer, vMCE injection buffer and * vMCE MSRs virtualization buffer @@ -511,7 +511,7 @@ static void mce_softirq(void) /* Step2: Send Log to DOM0 through vIRQ */ if (dom0 && guest_enabled_event(dom0->vcpu[0], VIRQ_MCA)) { - printk(KERN_DEBUG "MCE: send MCE# to DOM0 through virq\n"); + mce_printk(MCE_VERBOSE, "MCE: send MCE# to DOM0 through virq\n"); send_guest_global_virq(dom0, VIRQ_MCA); } } @@ -669,7 +669,7 @@ static void intel_machine_check(struct c } atomic_set(&found_error, 1); - printk(KERN_DEBUG "MCE: clear_bank map %lx on CPU%d\n", + mce_printk(MCE_VERBOSE, "MCE: clear_bank map %lx on CPU%d\n", *((unsigned long*)clear_bank), smp_processor_id()); mcheck_mca_clearbanks(clear_bank); /* Print MCE error */ @@ -696,13 +696,13 @@ static void intel_machine_check(struct c /* Clear error finding flags after all cpus finishes above judgement */ mce_barrier_enter(&mce_trap_bar); if (atomic_read(&found_error)) { - printk(KERN_DEBUG "MCE: Choose one CPU " + mce_printk(MCE_VERBOSE, "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) { - printk(KERN_DEBUG "MCE: Clear MCIP@ last step"); + mce_printk(MCE_VERBOSE, "MCE: Clear MCIP@ last step"); mca_wrmsrl(MSR_IA32_MCG_STATUS, gstatus & ~MCG_STATUS_MCIP); } mce_barrier_exit(&mce_trap_bar); @@ -778,7 +778,7 @@ static int intel_recoverable_scan(u64 st else if ( ser_support && !(status & MCi_STATUS_OVER) && !(status & MCi_STATUS_PCC) && (status & MCi_STATUS_S) && (status & MCi_STATUS_AR) ) { - printk(KERN_DEBUG "MCE: No SRAR error defined currently.\n"); + mce_printk(MCE_VERBOSE, "MCE: No SRAR error defined currently.\n"); return 0; } /* SRAO error */ @@ -831,7 +831,7 @@ static void cmci_discover(void) mctelem_cookie_t mctc; struct mca_summary bs; - printk(KERN_DEBUG "CMCI: find owner on CPU%d\n", smp_processor_id()); + mce_printk(MCE_VERBOSE, "CMCI: find owner on CPU%d\n", smp_processor_id()); spin_lock_irqsave(&cmci_discover_lock, flags); @@ -861,9 +861,9 @@ static void cmci_discover(void) } else if (mctc != NULL) mctelem_dismiss(mctc); - printk(KERN_DEBUG "CMCI: CPU%d owner_map[%lx], no_cmci_map[%lx]\n", - smp_processor_id(), - *((unsigned long *)__get_cpu_var(mce_banks_owned)), + mce_printk(MCE_VERBOSE, "CMCI: CPU%d owner_map[%lx], no_cmci_map[%lx]\n", + smp_processor_id(), + *((unsigned long *)__get_cpu_var(mce_banks_owned)), *((unsigned long *)__get_cpu_var(no_cmci_banks))); } @@ -904,7 +904,7 @@ static void clear_cmci(void) if (!cmci_support || mce_disabled == 1) return; - printk(KERN_DEBUG "CMCI: clear_cmci support on CPU%d\n", + mce_printk(MCE_VERBOSE, "CMCI: clear_cmci support on CPU%d\n", smp_processor_id()); for (i = 0; i < nr_mce_banks; i++) { @@ -933,14 +933,14 @@ static void intel_init_cmci(struct cpuin int cpu = smp_processor_id(); if (!mce_available(c) || !cmci_support) { - printk(KERN_DEBUG "CMCI: CPU%d has no CMCI support\n", cpu); + mce_printk(MCE_QUIET, "CMCI: CPU%d has no CMCI support\n", cpu); return; } apic = apic_read(APIC_CMCI); if ( apic & APIC_VECTOR_MASK ) { - printk(KERN_WARNING "CPU%d CMCI LVT vector (%#x) already installed\n", + mce_printk(MCE_QUIET, "CPU%d CMCI LVT vector (%#x) already installed\n", cpu, ( apic & APIC_VECTOR_MASK )); return; } @@ -968,7 +968,7 @@ fastcall void smp_cmci_interrupt(struct if (bs.errcnt && mctc != NULL) { if (guest_enabled_event(dom0->vcpu[0], VIRQ_MCA)) { mctelem_commit(mctc); - printk(KERN_DEBUG "CMCI: send CMCI to DOM0 through virq\n"); + mce_printk(MCE_VERBOSE, "CMCI: send CMCI to DOM0 through virq\n"); send_guest_global_virq(dom0, VIRQ_MCA); } else { x86_mcinfo_dump(mctelem_dataptr(mctc)); @@ -1004,7 +1004,7 @@ static void _mce_cap_init(struct cpuinfo if (l & MCG_EXT_P) { nr_intel_ext_msrs = (l >> MCG_EXT_CNT) & 0xff; - printk (KERN_INFO "CPU%d: Intel Extended MCE MSRs (%d) available\n", + mce_printk (MCE_QUIET, "CPU%d: Intel Extended MCE MSRs (%d) available\n", smp_processor_id(), nr_intel_ext_msrs); } firstbank = mce_firstbank(c); @@ -1045,7 +1045,7 @@ static void mce_init(void) if (!(l | h)) { /* if ctl is 0, this bank is never initialized */ - printk(KERN_DEBUG "mce_init: init bank%d\n", i); + mce_printk(MCE_VERBOSE, "mce_init: init bank%d\n", i); wrmsr (MSR_IA32_MC0_CTL + 4*i, 0xffffffff, 0xffffffff); wrmsr (MSR_IA32_MC0_STATUS + 4*i, 0x0, 0x0); } @@ -1058,7 +1058,7 @@ int intel_mcheck_init(struct cpuinfo_x86 int intel_mcheck_init(struct cpuinfo_x86 *c) { _mce_cap_init(c); - printk (KERN_INFO "Intel machine check reporting enabled on CPU#%d.\n", + mce_printk(MCE_QUIET, "Intel machine check reporting enabled on CPU#%d.\n", smp_processor_id()); /* machine check is available */ @@ -1082,7 +1082,7 @@ int intel_mce_wrmsr(uint32_t msr, uint64 switch ( msr ) { case MSR_IA32_MC0_CTL2 ... MSR_IA32_MC0_CTL2 + MAX_NR_BANKS - 1: - gdprintk(XENLOG_WARNING, "We have disabled CMCI capability, " + mce_printk(MCE_QUIET, "We have disabled CMCI capability, " "Guest should not write this MSR!\n"); break; default: @@ -1100,7 +1100,7 @@ int intel_mce_rdmsr(uint32_t msr, uint64 switch ( msr ) { case MSR_IA32_MC0_CTL2 ... MSR_IA32_MC0_CTL2 + MAX_NR_BANKS - 1: - gdprintk(XENLOG_WARNING, "We have disabled CMCI capability, " + mce_printk(MCE_QUIET, "We have disabled CMCI capability, " "Guest should not read this MSR!\n"); break; default: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |