From: Keir Fraser Date: Wed, 18 Feb 2009 08:59:26 +0000 (+0000) Subject: x86: Fix xen panic when offlining a CPU. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13996^2~15 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5a16f92aee6d10894ce7a1d7d9888323f036fde8;p=xen.git x86: Fix xen panic when offlining a CPU. Also, fix a typo in a message. 'irq' => 'vector' Signed-off-by: Kouya Shimura --- diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index 6c5b6ad395..a0829a05ba 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -1142,6 +1142,8 @@ void fixup_irqs(cpumask_t map) static int warned; irq_guest_action_t *action; struct pending_eoi *peoi; + irq_desc_t *desc; + unsigned long flags; /* Direct all future interrupts away from this CPU. */ for ( vector = 0; vector < NR_VECTORS; vector++ ) @@ -1150,18 +1152,24 @@ void fixup_irqs(cpumask_t map) if ( vector_to_irq(vector) == 2 ) continue; - cpus_and(mask, irq_desc[vector].affinity, map); + desc = &irq_desc[vector]; + + spin_lock_irqsave(&desc->lock, flags); + + cpus_and(mask, desc->affinity, map); if ( any_online_cpu(mask) == NR_CPUS ) { printk("Breaking affinity for vector %u (irq %i)\n", vector, vector_to_irq(vector)); mask = map; } - if ( irq_desc[vector].handler->set_affinity ) - irq_desc[vector].handler->set_affinity(vector, mask); - else if ( irq_desc[vector].action && !(warned++) ) - printk("Cannot set affinity for irq %u (irq %i)\n", + if ( desc->handler->set_affinity ) + desc->handler->set_affinity(vector, mask); + else if ( desc->action && !(warned++) ) + printk("Cannot set affinity for vector %u (irq %i)\n", vector, vector_to_irq(vector)); + + spin_unlock_irqrestore(&desc->lock, flags); } /* Service any interrupts that beat us in the re-direction race. */