|
@@ -510,10 +510,6 @@ static void ipi_cpu_stop(unsigned int cpu)
|
|
|
local_fiq_disable();
|
|
|
local_irq_disable();
|
|
|
|
|
|
-#ifdef CONFIG_HOTPLUG_CPU
|
|
|
- platform_cpu_kill(cpu);
|
|
|
-#endif
|
|
|
-
|
|
|
while (1)
|
|
|
cpu_relax();
|
|
|
}
|
|
@@ -576,17 +572,25 @@ void smp_send_reschedule(int cpu)
|
|
|
smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
|
+static void smp_kill_cpus(cpumask_t *mask)
|
|
|
+{
|
|
|
+ unsigned int cpu;
|
|
|
+ for_each_cpu(cpu, mask)
|
|
|
+ platform_cpu_kill(cpu);
|
|
|
+}
|
|
|
+#else
|
|
|
+static void smp_kill_cpus(cpumask_t *mask) { }
|
|
|
+#endif
|
|
|
+
|
|
|
void smp_send_stop(void)
|
|
|
{
|
|
|
unsigned long timeout;
|
|
|
+ struct cpumask mask;
|
|
|
|
|
|
- if (num_online_cpus() > 1) {
|
|
|
- struct cpumask mask;
|
|
|
- cpumask_copy(&mask, cpu_online_mask);
|
|
|
- cpumask_clear_cpu(smp_processor_id(), &mask);
|
|
|
-
|
|
|
- smp_cross_call(&mask, IPI_CPU_STOP);
|
|
|
- }
|
|
|
+ cpumask_copy(&mask, cpu_online_mask);
|
|
|
+ cpumask_clear_cpu(smp_processor_id(), &mask);
|
|
|
+ smp_cross_call(&mask, IPI_CPU_STOP);
|
|
|
|
|
|
/* Wait up to one second for other CPUs to stop */
|
|
|
timeout = USEC_PER_SEC;
|
|
@@ -595,6 +599,8 @@ void smp_send_stop(void)
|
|
|
|
|
|
if (num_online_cpus() > 1)
|
|
|
pr_warning("SMP: failed to stop secondary CPUs\n");
|
|
|
+
|
|
|
+ smp_kill_cpus(&mask);
|
|
|
}
|
|
|
|
|
|
/*
|