aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/tick.h9
-rw-r--r--kernel/time/tick-sched.c10
2 files changed, 14 insertions, 5 deletions
diff --git a/include/linux/tick.h b/include/linux/tick.h
index b84773cb9f4c..8a4987f2294a 100644
--- a/include/linux/tick.h
+++ b/include/linux/tick.h
@@ -181,7 +181,13 @@ static inline bool tick_nohz_full_cpu(int cpu)
181 181
182extern void tick_nohz_init(void); 182extern void tick_nohz_init(void);
183extern void __tick_nohz_full_check(void); 183extern void __tick_nohz_full_check(void);
184extern void tick_nohz_full_kick(void); 184extern void tick_nohz_full_kick_cpu(int cpu);
185
186static inline void tick_nohz_full_kick(void)
187{
188 tick_nohz_full_kick_cpu(smp_processor_id());
189}
190
185extern void tick_nohz_full_kick_all(void); 191extern void tick_nohz_full_kick_all(void);
186extern void __tick_nohz_task_switch(struct task_struct *tsk); 192extern void __tick_nohz_task_switch(struct task_struct *tsk);
187#else 193#else
@@ -189,6 +195,7 @@ static inline void tick_nohz_init(void) { }
189static inline bool tick_nohz_full_enabled(void) { return false; } 195static inline bool tick_nohz_full_enabled(void) { return false; }
190static inline bool tick_nohz_full_cpu(int cpu) { return false; } 196static inline bool tick_nohz_full_cpu(int cpu) { return false; }
191static inline void __tick_nohz_full_check(void) { } 197static inline void __tick_nohz_full_check(void) { }
198static inline void tick_nohz_full_kick_cpu(int cpu) { }
192static inline void tick_nohz_full_kick(void) { } 199static inline void tick_nohz_full_kick(void) { }
193static inline void tick_nohz_full_kick_all(void) { } 200static inline void tick_nohz_full_kick_all(void) { }
194static inline void __tick_nohz_task_switch(struct task_struct *tsk) { } 201static inline void __tick_nohz_task_switch(struct task_struct *tsk) { }
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 6558b7ac112d..3d63944a3eca 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -224,13 +224,15 @@ static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = {
224}; 224};
225 225
226/* 226/*
227 * Kick the current CPU if it's full dynticks in order to force it to 227 * Kick the CPU if it's full dynticks in order to force it to
228 * re-evaluate its dependency on the tick and restart it if necessary. 228 * re-evaluate its dependency on the tick and restart it if necessary.
229 */ 229 */
230void tick_nohz_full_kick(void) 230void tick_nohz_full_kick_cpu(int cpu)
231{ 231{
232 if (tick_nohz_full_cpu(smp_processor_id())) 232 if (!tick_nohz_full_cpu(cpu))
233 irq_work_queue(&__get_cpu_var(nohz_full_kick_work)); 233 return;
234
235 irq_work_queue_on(&per_cpu(nohz_full_kick_work, cpu), cpu);
234} 236}
235 237
236static void nohz_full_kick_ipi(void *info) 238static void nohz_full_kick_ipi(void *info)