|
@@ -428,34 +428,27 @@ void smp_stop_cpu(void)
|
|
|
* This is the main routine where commands issued by other
|
|
|
* cpus are handled.
|
|
|
*/
|
|
|
-static void do_ext_call_interrupt(struct ext_code ext_code,
|
|
|
- unsigned int param32, unsigned long param64)
|
|
|
+static void smp_handle_ext_call(void)
|
|
|
{
|
|
|
unsigned long bits;
|
|
|
- int cpu;
|
|
|
-
|
|
|
- cpu = smp_processor_id();
|
|
|
- if (ext_code.code == 0x1202)
|
|
|
- inc_irq_stat(IRQEXT_EXC);
|
|
|
- else
|
|
|
- inc_irq_stat(IRQEXT_EMS);
|
|
|
- /*
|
|
|
- * handle bit signal external calls
|
|
|
- */
|
|
|
- bits = xchg(&pcpu_devices[cpu].ec_mask, 0);
|
|
|
|
|
|
+ /* handle bit signal external calls */
|
|
|
+ bits = xchg(&pcpu_devices[smp_processor_id()].ec_mask, 0);
|
|
|
if (test_bit(ec_stop_cpu, &bits))
|
|
|
smp_stop_cpu();
|
|
|
-
|
|
|
if (test_bit(ec_schedule, &bits))
|
|
|
scheduler_ipi();
|
|
|
-
|
|
|
if (test_bit(ec_call_function, &bits))
|
|
|
generic_smp_call_function_interrupt();
|
|
|
-
|
|
|
if (test_bit(ec_call_function_single, &bits))
|
|
|
generic_smp_call_function_single_interrupt();
|
|
|
+}
|
|
|
|
|
|
+static void do_ext_call_interrupt(struct ext_code ext_code,
|
|
|
+ unsigned int param32, unsigned long param64)
|
|
|
+{
|
|
|
+ inc_irq_stat(ext_code.code == 0x1202 ? IRQEXT_EXC : IRQEXT_EMS);
|
|
|
+ smp_handle_ext_call();
|
|
|
}
|
|
|
|
|
|
void arch_send_call_function_ipi_mask(const struct cpumask *mask)
|
|
@@ -760,6 +753,8 @@ int __cpu_disable(void)
|
|
|
{
|
|
|
unsigned long cregs[16];
|
|
|
|
|
|
+ /* Handle possible pending IPIs */
|
|
|
+ smp_handle_ext_call();
|
|
|
set_cpu_online(smp_processor_id(), false);
|
|
|
/* Disable pseudo page faults on this cpu. */
|
|
|
pfault_fini();
|