]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge branch 'timers/nohz-v3' of git://git.kernel.org/pub/scm/linux/kernel/git/freder...
authorIngo Molnar <mingo@kernel.org>
Wed, 14 Aug 2013 15:58:56 +0000 (17:58 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 14 Aug 2013 15:58:56 +0000 (17:58 +0200)
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 <mingo@kernel.org>
1  2 
include/linux/tick.h
kernel/time/tick-sched.c

index 62bd8b72873c0bed1702d41a2a8982831d01564b,a7ef1d6fceb60feaf5fdf6caf08abc78cab77d51..5128d33bbb39cd5aa13a080d765c114dd40ede1b
@@@ -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
Simple merge