Commit d13508f9440e46dccac6a2dd48d51a73b2207482

Authored by Frederic Weisbecker
1 parent 460775df46

nohz: Optimize full dynticks's sched hooks with static keys

Scheduler IPIs and task context switches are serious fast path.
Let's try to hide as much as we can the impact of full
dynticks APIs' off case that are called on these sites
through the use of static keys.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Li Zhong <zhong@linux.vnet.ibm.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Kevin Hilman <khilman@linaro.org>

Showing 2 changed files with 20 additions and 8 deletions Side-by-side Diff

include/linux/tick.h
... ... @@ -180,19 +180,31 @@
180 180 }
181 181  
182 182 extern void tick_nohz_init(void);
183   -extern void tick_nohz_full_check(void);
  183 +extern void __tick_nohz_full_check(void);
184 184 extern void tick_nohz_full_kick(void);
185 185 extern void tick_nohz_full_kick_all(void);
186   -extern void tick_nohz_task_switch(struct task_struct *tsk);
  186 +extern void __tick_nohz_task_switch(struct task_struct *tsk);
187 187 #else
188 188 static inline void tick_nohz_init(void) { }
189 189 static inline bool tick_nohz_full_enabled(void) { return false; }
190 190 static inline bool tick_nohz_full_cpu(int cpu) { return false; }
191   -static inline void tick_nohz_full_check(void) { }
  191 +static inline void __tick_nohz_full_check(void) { }
192 192 static inline void tick_nohz_full_kick(void) { }
193 193 static inline void tick_nohz_full_kick_all(void) { }
194   -static inline void tick_nohz_task_switch(struct task_struct *tsk) { }
  194 +static inline void __tick_nohz_task_switch(struct task_struct *tsk) { }
195 195 #endif
  196 +
  197 +static inline void tick_nohz_full_check(void)
  198 +{
  199 + if (tick_nohz_full_enabled())
  200 + __tick_nohz_full_check();
  201 +}
  202 +
  203 +static inline void tick_nohz_task_switch(struct task_struct *tsk)
  204 +{
  205 + if (tick_nohz_full_enabled())
  206 + __tick_nohz_task_switch(tsk);
  207 +}
196 208  
197 209  
198 210 # ifdef CONFIG_CPU_IDLE_GOV_MENU
kernel/time/tick-sched.c
... ... @@ -198,7 +198,7 @@
198 198 * Re-evaluate the need for the tick on the current CPU
199 199 * and restart it if necessary.
200 200 */
201   -void tick_nohz_full_check(void)
  201 +void __tick_nohz_full_check(void)
202 202 {
203 203 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
204 204  
... ... @@ -212,7 +212,7 @@
212 212  
213 213 static void nohz_full_kick_work_func(struct irq_work *work)
214 214 {
215   - tick_nohz_full_check();
  215 + __tick_nohz_full_check();
216 216 }
217 217  
218 218 static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = {
... ... @@ -231,7 +231,7 @@
231 231  
232 232 static void nohz_full_kick_ipi(void *info)
233 233 {
234   - tick_nohz_full_check();
  234 + __tick_nohz_full_check();
235 235 }
236 236  
237 237 /*
... ... @@ -254,7 +254,7 @@
254 254 * It might need the tick due to per task/process properties:
255 255 * perf events, posix cpu timers, ...
256 256 */
257   -void tick_nohz_task_switch(struct task_struct *tsk)
  257 +void __tick_nohz_task_switch(struct task_struct *tsk)
258 258 {
259 259 unsigned long flags;
260 260