diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2015-03-31 20:49:02 +0530 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2015-04-02 17:46:21 +0200 | 
| commit | 3650b57fdf208bc0e36cbe7b5e0744bd0e0cf34d (patch) | |
| tree | e62223fe5b72899adc985709b716587e404cc61b /kernel/time | |
| parent | 8def906044c02edcedac79aa3d6310ab4d90c4d8 (diff) | |
timer: Further simplify the SMP and HOTPLUG logic
Remove one CONFIG_HOTPLUG_CPU #ifdef in trade for introducing one
CONFIG_SMP #ifdef.
The CONFIG_SMP ifdef avoids declaring the per-CPU __tvec_bases storage
on UP systems since they already have boot_tvec_bases.
Also (re)add a runtime check on the base alignment -- for the paranoid
amongst us :-)
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/fdd2d35e169bdc554ffa3fe77f77716298c75ada.1427814611.git.viresh.kumar@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/timer.c | 23 | 
1 files changed, 15 insertions, 8 deletions
| diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 1feb9c7035c0..2ece3aa5069c 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -101,7 +101,6 @@ struct tvec_base {   */  struct tvec_base boot_tvec_bases;  EXPORT_SYMBOL(boot_tvec_bases); -static DEFINE_PER_CPU(struct tvec_base, __tvec_bases);  static DEFINE_PER_CPU(struct tvec_base *, tvec_bases) = &boot_tvec_bases; @@ -1038,6 +1037,8 @@ int try_to_del_timer_sync(struct timer_list *timer)  EXPORT_SYMBOL(try_to_del_timer_sync);  #ifdef CONFIG_SMP +static DEFINE_PER_CPU(struct tvec_base, __tvec_bases); +  /**   * del_timer_sync - deactivate a timer and wait for the handler to finish.   * @timer: the timer to be deactivated @@ -1591,12 +1592,10 @@ static void migrate_timers(int cpu)  	spin_unlock_irq(&new_base->lock);  	put_cpu_var(tvec_bases);  } -#endif /* CONFIG_HOTPLUG_CPU */  static int timer_cpu_notify(struct notifier_block *self,  				unsigned long action, void *hcpu)  { -#ifdef CONFIG_HOTPLUG_CPU  	switch (action) {  	case CPU_DEAD:  	case CPU_DEAD_FROZEN: @@ -1605,18 +1604,24 @@ static int timer_cpu_notify(struct notifier_block *self,  	default:  		break;  	} -#endif +  	return NOTIFY_OK;  } -static struct notifier_block timers_nb = { -	.notifier_call	= timer_cpu_notify, -}; +static inline void timer_register_cpu_notifier(void) +{ +	cpu_notifier(timer_cpu_notify, 0); +} +#else +static inline void timer_register_cpu_notifier(void) { } +#endif /* CONFIG_HOTPLUG_CPU */  static void __init init_timer_cpu(struct tvec_base *base, int cpu)  {  	int j; +	BUG_ON(base != tbase_get_base(base)); +  	base->cpu = cpu;  	per_cpu(tvec_bases, cpu) = base;  	spin_lock_init(&base->lock); @@ -1643,8 +1648,10 @@ static void __init init_timer_cpus(void)  	for_each_possible_cpu(cpu) {  		if (cpu == local_cpu)  			base = &boot_tvec_bases; +#ifdef CONFIG_SMP  		else  			base = per_cpu_ptr(&__tvec_bases, cpu); +#endif  		init_timer_cpu(base, cpu);  	} @@ -1657,7 +1664,7 @@ void __init init_timers(void)  	init_timer_cpus();  	init_timer_stats(); -	register_cpu_notifier(&timers_nb); +	timer_register_cpu_notifier();  	open_softirq(TIMER_SOFTIRQ, run_timer_softirq);  } | 
