Browse Source

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>
Paul E. McKenney 16 năm trước cách đây
mục cha
commit
4d084617fb
1 tập tin đã thay đổi với 4 bổ sung4 xóa
  1. 4 4
      arch/sparc64/kernel/smp.c

+ 4 - 4
arch/sparc64/kernel/smp.c

@@ -1303,10 +1303,6 @@ int __cpu_disable(void)
 	c->core_id = 0;
 	c->core_id = 0;
 	c->proc_id = -1;
 	c->proc_id = -1;
 
 
-	ipi_call_lock();
-	cpu_clear(cpu, cpu_online_map);
-	ipi_call_unlock();
-
 	smp_wmb();
 	smp_wmb();
 
 
 	/* Make sure no interrupts point to this cpu.  */
 	/* Make sure no interrupts point to this cpu.  */
@@ -1316,6 +1312,10 @@ int __cpu_disable(void)
 	mdelay(1);
 	mdelay(1);
 	local_irq_disable();
 	local_irq_disable();
 
 
+	ipi_call_lock();
+	cpu_clear(cpu, cpu_online_map);
+	ipi_call_unlock();
+
 	return 0;
 	return 0;
 }
 }