aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2008-08-31 14:06:30 -0400
committerTony Luck <tony.luck@intel.com>2008-09-10 13:52:42 -0400
commite7b140365b86aaf94374214c6f4e6decbee2eb0a (patch)
tree6467805ada12be5cd1d5136869bf1f031f441999 /arch
parent6bf6a1a49377c32a02939ec835553703994f3e41 (diff)
[IA64] prevent ia64 from invoking irq handlers on offline CPUs
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>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/kernel/smpboot.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c
index bcea81e432fd..d8f05e504fbf 100644
--- a/arch/ia64/kernel/smpboot.c
+++ b/arch/ia64/kernel/smpboot.c
@@ -741,16 +741,14 @@ int __cpu_disable(void)
741 return -EBUSY; 741 return -EBUSY;
742 } 742 }
743 743
744 cpu_clear(cpu, cpu_online_map);
745
746 if (migrate_platform_irqs(cpu)) { 744 if (migrate_platform_irqs(cpu)) {
747 cpu_set(cpu, cpu_online_map); 745 cpu_set(cpu, cpu_online_map);
748 return (-EBUSY); 746 return (-EBUSY);
749 } 747 }
750 748
751 remove_siblinginfo(cpu); 749 remove_siblinginfo(cpu);
752 cpu_clear(cpu, cpu_online_map);
753 fixup_irqs(); 750 fixup_irqs();
751 cpu_clear(cpu, cpu_online_map);
754 local_flush_tlb_all(); 752 local_flush_tlb_all();
755 cpu_clear(cpu, cpu_callin_map); 753 cpu_clear(cpu, cpu_callin_map);
756 return 0; 754 return 0;