diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2008-09-03 05:15:30 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-09-03 05:15:30 -0400 |
| commit | 4d084617fb0d025c42c242362d1f27d337e2d407 (patch) | |
| tree | 8bc8a49447713d712aa0f66dd5c9c1e6d44a33b6 | |
| parent | e5bd1c3fdd06b6c0fa6dfb98ce31cea1820ce4e9 (diff) | |
sparc64: Prevent sparc64 from invoking irq handlers on offline CPUs
Make sparc64 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.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 0712a445f98e..2be166c544ca 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -1303,10 +1303,6 @@ int __cpu_disable(void) | |||
| 1303 | c->core_id = 0; | 1303 | c->core_id = 0; |
| 1304 | c->proc_id = -1; | 1304 | c->proc_id = -1; |
| 1305 | 1305 | ||
| 1306 | ipi_call_lock(); | ||
| 1307 | cpu_clear(cpu, cpu_online_map); | ||
| 1308 | ipi_call_unlock(); | ||
| 1309 | |||
| 1310 | smp_wmb(); | 1306 | smp_wmb(); |
| 1311 | 1307 | ||
| 1312 | /* Make sure no interrupts point to this cpu. */ | 1308 | /* Make sure no interrupts point to this cpu. */ |
| @@ -1316,6 +1312,10 @@ int __cpu_disable(void) | |||
| 1316 | mdelay(1); | 1312 | mdelay(1); |
| 1317 | local_irq_disable(); | 1313 | local_irq_disable(); |
| 1318 | 1314 | ||
| 1315 | ipi_call_lock(); | ||
| 1316 | cpu_clear(cpu, cpu_online_map); | ||
| 1317 | ipi_call_unlock(); | ||
| 1318 | |||
| 1319 | return 0; | 1319 | return 0; |
| 1320 | } | 1320 | } |
| 1321 | 1321 | ||
