[IA64] prevent ia64 from invoking irq handlers on offline CPUs
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Sun, 31 Aug 2008 18:06:30 +0000 (11:06 -0700)
committerTony Luck <tony.luck@intel.com>
Wed, 10 Sep 2008 17:52:42 +0000 (10:52 -0700)
Make ia64 refrain from clearing a given to-be-offlined CPU's bit in the
cpu_online_mask until it has processed pending irqs.  This change
prevents other CPUs from being blindsided by an apparently offline CPU
nevertheless changing globally visible state.  Also remove the existing
redundant cpu_clear(cpu, cpu_online_map).

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/kernel/smpboot.c

index bcea81e432fd79c6b9aa08407367e523cc0f41bd..d8f05e504fbf039bb85fa946c40e6ff01349d26b 100644 (file)
@@ -741,16 +741,14 @@ int __cpu_disable(void)
                        return -EBUSY;
        }
 
-       cpu_clear(cpu, cpu_online_map);
-
        if (migrate_platform_irqs(cpu)) {
                cpu_set(cpu, cpu_online_map);
                return (-EBUSY);
        }
 
        remove_siblinginfo(cpu);
-       cpu_clear(cpu, cpu_online_map);
        fixup_irqs();
+       cpu_clear(cpu, cpu_online_map);
        local_flush_tlb_all();
        cpu_clear(cpu, cpu_callin_map);
        return 0;