From: Ingo Molnar Date: Wed, 14 Aug 2013 15:58:56 +0000 (+0200) Subject: Merge branch 'timers/nohz-v3' of git://git.kernel.org/pub/scm/linux/kernel/git/freder... X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=6f1d657668ac3041b65265d3653d7e9172a0d603;p=linux.git Merge branch 'timers/nohz-v3' of git://git./linux/kernel/git/frederic/linux-dynticks into timers/nohz Pull nohz improvements from Frederic Weisbecker: " It mostly contains fixes and full dynticks off-case optimizations. I believe that distros want to enable this feature so it seems important to optimize the case where the "nohz_full=" parameter is empty. ie: I'm trying to remove any performance regression that comes with NO_HZ_FULL=y when the feature is not used. This patchset improves the current situation a lot (off-case appears to be around 11% faster with hackbench, although I guess it may vary depending on the configuration but it should be significantly faster in any case) now there is still some work to do: I can still observe a remaining loss of 1.6% throughput seen with hackbench compared to CONFIG_NO_HZ_FULL=n. " Signed-off-by: Ingo Molnar --- 6f1d657668ac3041b65265d3653d7e9172a0d603 diff --cc include/linux/tick.h index 62bd8b72873c0,a7ef1d6fceb60..5128d33bbb39c --- a/include/linux/tick.h +++ b/include/linux/tick.h @@@ -158,20 -160,57 +160,51 @@@ static inline u64 get_cpu_iowait_time_u # endif /* !CONFIG_NO_HZ_COMMON */ #ifdef CONFIG_NO_HZ_FULL + extern bool tick_nohz_full_running; + extern cpumask_var_t tick_nohz_full_mask; + + static inline bool tick_nohz_full_enabled(void) + { + if (!static_key_false(&context_tracking_enabled)) + return false; + + return tick_nohz_full_running; + } + + static inline bool tick_nohz_full_cpu(int cpu) + { + if (!tick_nohz_full_enabled()) + return false; + + return cpumask_test_cpu(cpu, tick_nohz_full_mask); + } + extern void tick_nohz_init(void); - extern int tick_nohz_full_cpu(int cpu); - extern void tick_nohz_full_check(void); + extern void __tick_nohz_full_check(void); extern void tick_nohz_full_kick(void); extern void tick_nohz_full_kick_all(void); - extern void tick_nohz_task_switch(struct task_struct *tsk); + extern void __tick_nohz_task_switch(struct task_struct *tsk); #else static inline void tick_nohz_init(void) { } - static inline int tick_nohz_full_cpu(int cpu) { return 0; } - static inline void tick_nohz_full_check(void) { } + static inline bool tick_nohz_full_enabled(void) { return false; } + static inline bool tick_nohz_full_cpu(int cpu) { return false; } + static inline void __tick_nohz_full_check(void) { } static inline void tick_nohz_full_kick(void) { } static inline void tick_nohz_full_kick_all(void) { } - static inline void tick_nohz_task_switch(struct task_struct *tsk) { } + static inline void __tick_nohz_task_switch(struct task_struct *tsk) { } #endif + static inline void tick_nohz_full_check(void) + { + if (tick_nohz_full_enabled()) + __tick_nohz_full_check(); + } + + static inline void tick_nohz_task_switch(struct task_struct *tsk) + { + if (tick_nohz_full_enabled()) + __tick_nohz_task_switch(tsk); + } + -# ifdef CONFIG_CPU_IDLE_GOV_MENU -extern void menu_hrtimer_cancel(void); -# else -static inline void menu_hrtimer_cancel(void) {} -# endif /* CONFIG_CPU_IDLE_GOV_MENU */ - #endif