diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
| -rw-r--r-- | arch/arm/kernel/smp.c | 17 | 
1 files changed, 12 insertions, 5 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index b8c3d0f689d..40dc74f2b27 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -429,7 +429,11 @@ static void smp_timer_broadcast(const struct cpumask *mask)  {  	send_ipi_message(mask, IPI_TIMER);  } +#else +#define smp_timer_broadcast	NULL +#endif +#ifndef CONFIG_LOCAL_TIMERS  static void broadcast_timer_set_mode(enum clock_event_mode mode,  	struct clock_event_device *evt)  { @@ -444,7 +448,6 @@ static void local_timer_setup(struct clock_event_device *evt)  	evt->rating	= 400;  	evt->mult	= 1;  	evt->set_mode	= broadcast_timer_set_mode; -	evt->broadcast	= smp_timer_broadcast;  	clockevents_register_device(evt);  } @@ -456,6 +459,7 @@ void __cpuinit percpu_timer_setup(void)  	struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu);  	evt->cpumask = cpumask_of(cpu); +	evt->broadcast = smp_timer_broadcast;  	local_timer_setup(evt);  } @@ -467,10 +471,13 @@ static DEFINE_SPINLOCK(stop_lock);   */  static void ipi_cpu_stop(unsigned int cpu)  { -	spin_lock(&stop_lock); -	printk(KERN_CRIT "CPU%u: stopping\n", cpu); -	dump_stack(); -	spin_unlock(&stop_lock); +	if (system_state == SYSTEM_BOOTING || +	    system_state == SYSTEM_RUNNING) { +		spin_lock(&stop_lock); +		printk(KERN_CRIT "CPU%u: stopping\n", cpu); +		dump_stack(); +		spin_unlock(&stop_lock); +	}  	set_cpu_online(cpu, false);  |