|
@@ -575,10 +575,22 @@ void smp_send_reschedule(int cpu)
|
|
|
|
|
|
void smp_send_stop(void)
|
|
|
{
|
|
|
- cpumask_t mask = cpu_online_map;
|
|
|
- cpu_clear(smp_processor_id(), mask);
|
|
|
- if (!cpus_empty(mask))
|
|
|
+ unsigned long timeout;
|
|
|
+
|
|
|
+ if (num_online_cpus() > 1) {
|
|
|
+ cpumask_t mask = cpu_online_map;
|
|
|
+ cpu_clear(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;
|
|
|
+ while (num_online_cpus() > 1 && timeout--)
|
|
|
+ udelay(1);
|
|
|
+
|
|
|
+ if (num_online_cpus() > 1)
|
|
|
+ pr_warning("SMP: failed to stop secondary CPUs\n");
|
|
|
}
|
|
|
|
|
|
/*
|