From 6c9c4f2d1033aba201406f5854f1837ef9e94c4c Mon Sep 17 00:00:00 2001 From: Russell King Date: Thu, 2 Dec 2010 09:53:54 +0000 Subject: [PATCH] --- yaml --- r: 225877 b: refs/heads/master c: 28e18293cf0f8d23a0950d7b1d2212d11af494dc h: refs/heads/master i: 225875: 6a826e1602e4a202727a742c795f101511d4e2d1 v: v3 --- [refs] | 2 +- trunk/arch/arm/kernel/smp.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index b0af51bbeb73..b54527f4d367 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0eb0511d176534674600a1986c3c766756288908 +refs/heads/master: 28e18293cf0f8d23a0950d7b1d2212d11af494dc diff --git a/trunk/arch/arm/kernel/smp.c b/trunk/arch/arm/kernel/smp.c index 1de3e13a42a1..64f2d198c764 100644 --- a/trunk/arch/arm/kernel/smp.c +++ b/trunk/arch/arm/kernel/smp.c @@ -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"); } /*