Merge tag 'for-linus' of git://github.com/rustyrussell/linux
[~shefty/rdma-dev.git] / arch / arm / kernel / smp.c
index 9a4bdde909ceb39191f641e5aeecbdc9a536cfa6..addbbe8028c29c8789fd730fa784b056065787e5 100644 (file)
@@ -58,6 +58,8 @@ enum ipi_msg_type {
        IPI_CPU_STOP,
 };
 
+static DECLARE_COMPLETION(cpu_running);
+
 int __cpuinit __cpu_up(unsigned int cpu)
 {
        struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu);
@@ -98,20 +100,12 @@ int __cpuinit __cpu_up(unsigned int cpu)
         */
        ret = boot_secondary(cpu, idle);
        if (ret == 0) {
-               unsigned long timeout;
-
                /*
                 * CPU was successfully started, wait for it
                 * to come online or time out.
                 */
-               timeout = jiffies + HZ;
-               while (time_before(jiffies, timeout)) {
-                       if (cpu_online(cpu))
-                               break;
-
-                       udelay(10);
-                       barrier();
-               }
+               wait_for_completion_timeout(&cpu_running,
+                                                msecs_to_jiffies(1000));
 
                if (!cpu_online(cpu)) {
                        pr_crit("CPU%u: failed to come online\n", cpu);
@@ -288,9 +282,10 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
        /*
         * OK, now it's safe to let the boot CPU continue.  Wait for
         * the CPU migration code to notice that the CPU is online
-        * before we continue.
+        * before we continue - which happens after __cpu_up returns.
         */
        set_cpu_online(cpu, true);
+       complete(&cpu_running);
 
        /*
         * Setup the percpu timer for this CPU.