[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] x86: Fixup IRQs when CPUs go down during shutdown
>>> On 02.12.15 at 14:46, <ross.lagerwall@xxxxxxxxxx> wrote: > Commit fc0c3fa2ad5c ("x86/IO-APIC: fix setup of Xen internally used IRQs > (take 2)") introduced a regression on some hardware where Xen would hang > during shutdown, repeating the following message: > APIC error on CPU0: 08(08), Receive accept error > > This appears to be because an interrupt (in this case from the serial > console) destined for a CPU other than the boot CPU is left unhandled so > an APIC error on CPU 0 is generated instead. > > To fix this, before taking down the non-boot CPUs, call fixup_irqs() > with a CPU mask of only the boot CPU to reset the IRQ affinities > correctly. > > Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> > --- Even though in this case interested people may know, missing info on changes from previous version here. > +/* CPU(s) have been removed from mask. Re-set irq affinities. */ > +void fixup_irqs(const cpumask_t *mask, bool_t verbose) The comment doesn't match reality. And I wonder whether it wouldn't be reasonable to imply "verbose" (either from mask equaling &cpu_online_map, or by introducing SYS_STATE_shutdown and/or SYS_STATE_reboot). > @@ -2385,16 +2382,27 @@ void fixup_irqs(void) > > spin_unlock(&desc->lock); > > - if ( break_affinity && set_affinity ) > - printk("Broke affinity for irq %i\n", irq); > - else if ( !set_affinity ) > - printk("Cannot set affinity for irq %i\n", irq); > + if ( verbose ) > + { > + if ( break_affinity && set_affinity ) > + printk("Broke affinity for irq %i\n", irq); > + else if ( !set_affinity ) > + printk("Cannot set affinity for irq %i\n", irq); > + } How about if ( !verbose ) continue; limiting churn on code? > --- a/xen/arch/x86/smp.c > +++ b/xen/arch/x86/smp.c > @@ -286,6 +286,7 @@ void __stop_this_cpu(void) > > static void stop_this_cpu(void *dummy) > { > + fixup_eoi(); > __stop_this_cpu(); Is this really needed during shutdown? > @@ -298,6 +299,13 @@ static void stop_this_cpu(void *dummy) > void smp_send_stop(void) > { > int timeout = 10; > + cpumask_t online; > + > + cpumask_clear(&online); > + cpumask_set_cpu(smp_processor_id(), &online); That's what we have cpumask_of() for. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |