diff options
-rw-r--r-- | arch/arm/kernel/smp.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 1de3e13a42a1..64f2d198c764 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -575,10 +575,22 @@ void smp_send_reschedule(int cpu) | |||
575 | 575 | ||
576 | void smp_send_stop(void) | 576 | void smp_send_stop(void) |
577 | { | 577 | { |
578 | cpumask_t mask = cpu_online_map; | 578 | unsigned long timeout; |
579 | cpu_clear(smp_processor_id(), mask); | 579 | |
580 | if (!cpus_empty(mask)) | 580 | if (num_online_cpus() > 1) { |
581 | cpumask_t mask = cpu_online_map; | ||
582 | cpu_clear(smp_processor_id(), mask); | ||
583 | |||
581 | smp_cross_call(&mask, IPI_CPU_STOP); | 584 | smp_cross_call(&mask, IPI_CPU_STOP); |
585 | } | ||
586 | |||
587 | /* Wait up to one second for other CPUs to stop */ | ||
588 | timeout = USEC_PER_SEC; | ||
589 | while (num_online_cpus() > 1 && timeout--) | ||
590 | udelay(1); | ||
591 | |||
592 | if (num_online_cpus() > 1) | ||
593 | pr_warning("SMP: failed to stop secondary CPUs\n"); | ||
582 | } | 594 | } |
583 | 595 | ||
584 | /* | 596 | /* |