diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
| -rw-r--r-- | arch/arm/kernel/smp.c | 28 | 
1 files changed, 17 insertions, 11 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index addbbe8028c..f6a4d32b042 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -510,10 +510,6 @@ static void ipi_cpu_stop(unsigned int cpu)  	local_fiq_disable();  	local_irq_disable(); -#ifdef CONFIG_HOTPLUG_CPU -	platform_cpu_kill(cpu); -#endif -  	while (1)  		cpu_relax();  } @@ -576,17 +572,25 @@ void smp_send_reschedule(int cpu)  	smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE);  } +#ifdef CONFIG_HOTPLUG_CPU +static void smp_kill_cpus(cpumask_t *mask) +{ +	unsigned int cpu; +	for_each_cpu(cpu, mask) +		platform_cpu_kill(cpu); +} +#else +static void smp_kill_cpus(cpumask_t *mask) { } +#endif +  void smp_send_stop(void)  {  	unsigned long timeout; +	struct cpumask mask; -	if (num_online_cpus() > 1) { -		struct cpumask mask; -		cpumask_copy(&mask, cpu_online_mask); -		cpumask_clear_cpu(smp_processor_id(), &mask); - -		smp_cross_call(&mask, IPI_CPU_STOP); -	} +	cpumask_copy(&mask, cpu_online_mask); +	cpumask_clear_cpu(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; @@ -595,6 +599,8 @@ void smp_send_stop(void)  	if (num_online_cpus() > 1)  		pr_warning("SMP: failed to stop secondary CPUs\n"); + +	smp_kill_cpus(&mask);  }  /*  |