diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
| -rw-r--r-- | arch/arm/kernel/smp.c | 24 | 
1 files changed, 10 insertions, 14 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 8f8cce2c46c..addbbe8028c 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -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. @@ -354,7 +349,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  		 * re-initialize the map in platform_smp_prepare_cpus() if  		 * present != possible (e.g. physical hotplug).  		 */ -		init_cpu_present(&cpu_possible_map); +		init_cpu_present(cpu_possible_mask);  		/*  		 * Initialise the SCU if there are more than one CPU @@ -586,8 +581,9 @@ void smp_send_stop(void)  	unsigned long timeout;  	if (num_online_cpus() > 1) { -		cpumask_t mask = cpu_online_map; -		cpu_clear(smp_processor_id(), mask); +		struct cpumask mask; +		cpumask_copy(&mask, cpu_online_mask); +		cpumask_clear_cpu(smp_processor_id(), &mask);  		smp_cross_call(&mask, IPI_CPU_STOP);  	}  |