Skip to content

Commit

Permalink
ARM: SMP: ensure smp_send_stop() waits for CPUs to stop
Browse files Browse the repository at this point in the history
Wait for CPUs to indicate that they've stopped, after sending the
stop IPI, rather than blindly continuing on and hoping that they've
stopped in time.  Print a warning if we fail to stop the other CPUs.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Dec 20, 2010
1 parent 0eb0511 commit 28e1829
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions arch/arm/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}

/*
Expand Down

0 comments on commit 28e1829

Please sign in to comment.