Fix regression. Make hot unlplug of CPU0 work again.
From: Tony Breeds <hidden>
Date: 2007-10-05 03:52:41
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Linus Torvalds
Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline. Also catches a use of irq, when virq should be used (I think that the last one). Signed-off-by: Tony Breeds <redacted> --- Unless there is a problem with this patch, it'd be nice to get it into 2.6.23 :) arch/powerpc/platforms/pseries/xics.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c
index f0b5ff1..2fb8fd0 100644
--- a/arch/powerpc/platforms/pseries/xics.c
+++ b/arch/powerpc/platforms/pseries/xics.c@@ -837,6 +837,15 @@ void xics_migrate_irqs_away(void) /* Allow IPIs again... */ xics_set_cpu_priority(cpu, DEFAULT_PRIORITY); + /* It would be bad to migrate any IRQs to the CPU we're taking down */ + if (default_server == cpu) { + unsigned int new_server = first_cpu(cpu_online_map); + + default_server = get_hard_smp_processor_id(new_server); + printk(KERN_WARNING "%s: default server was %d, reset to %d\n", + __func__, cpu, default_server); + } + for_each_irq(virq) { struct irq_desc *desc; int xics_status[2];
@@ -882,7 +891,7 @@ void xics_migrate_irqs_away(void) /* Reset affinity to all cpus */ desc->chip->set_affinity(virq, CPU_MASK_ALL); - irq_desc[irq].affinity = CPU_MASK_ALL; + irq_desc[virq].affinity = CPU_MASK_ALL; unlock: spin_unlock_irqrestore(&desc->lock, flags); }
Yours Tony linux.conf.au http://linux.conf.au/ || http://lca2008.linux.org.au/ Jan 28 - Feb 02 2008 The Australian Linux Technical Conference!