aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2013-04-20 09:27:08 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2013-04-22 14:16:04 -0400
commitff442c51f6543378cf23107c75b7949dc64a9119 (patch)
tree7c3cf3031f0bb0b8f0c9e8a170d17922b3bd1926
parentce831b38ca4920739a7a5b0c73b921da41f03718 (diff)
nohz: Re-evaluate the tick from the scheduler IPI
The scheduler IPI is used by the scheduler to kick full dynticks CPUs asynchronously when more than one task are running or when a new timer list timer is enqueued. This way the destination CPU can decide to restart the tick to handle this new situation. Now let's call that kick in the scheduler IPI. (Reusing the scheduler IPI rather than implementing a new IPI was suggested by Peter Zijlstra a while ago) Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Chris Metcalf <cmetcalf@tilera.com> Cc: Christoph Lameter <cl@linux.com> Cc: Geoff Levand <geoff@infradead.org> Cc: Gilad Ben Yossef <gilad@benyossef.com> Cc: Hakan Akkan <hakanakkan@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Kevin Hilman <khilman@linaro.org> Cc: Li Zhong <zhong@linux.vnet.ibm.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Paul Gortmaker <paul.gortmaker@windriver.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--include/linux/tick.h2
-rw-r--r--kernel/sched/core.c4
-rw-r--r--kernel/time/tick-sched.c2
3 files changed, 6 insertions, 2 deletions
diff --git a/include/linux/tick.h b/include/linux/tick.h
index d290168335bc..e31e67623ea1 100644
--- a/include/linux/tick.h
+++ b/include/linux/tick.h
@@ -160,11 +160,13 @@ static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }
160#ifdef CONFIG_NO_HZ_FULL 160#ifdef CONFIG_NO_HZ_FULL
161extern void tick_nohz_init(void); 161extern void tick_nohz_init(void);
162extern int tick_nohz_full_cpu(int cpu); 162extern int tick_nohz_full_cpu(int cpu);
163extern void tick_nohz_full_check(void);
163extern void tick_nohz_full_kick(void); 164extern void tick_nohz_full_kick(void);
164extern void tick_nohz_full_kick_all(void); 165extern void tick_nohz_full_kick_all(void);
165#else 166#else
166static inline void tick_nohz_init(void) { } 167static inline void tick_nohz_init(void) { }
167static inline int tick_nohz_full_cpu(int cpu) { return 0; } 168static inline int tick_nohz_full_cpu(int cpu) { return 0; }
169static inline void tick_nohz_full_check(void) { }
168static inline void tick_nohz_full_kick(void) { } 170static inline void tick_nohz_full_kick(void) { }
169static inline void tick_nohz_full_kick_all(void) { } 171static inline void tick_nohz_full_kick_all(void) { }
170#endif 172#endif
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 69f71335984f..9ad35005f1cb 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1398,7 +1398,8 @@ static void sched_ttwu_pending(void)
1398 1398
1399void scheduler_ipi(void) 1399void scheduler_ipi(void)
1400{ 1400{
1401 if (llist_empty(&this_rq()->wake_list) && !got_nohz_idle_kick()) 1401 if (llist_empty(&this_rq()->wake_list) && !got_nohz_idle_kick()
1402 && !tick_nohz_full_cpu(smp_processor_id()))
1402 return; 1403 return;
1403 1404
1404 /* 1405 /*
@@ -1415,6 +1416,7 @@ void scheduler_ipi(void)
1415 * somewhat pessimize the simple resched case. 1416 * somewhat pessimize the simple resched case.
1416 */ 1417 */
1417 irq_enter(); 1418 irq_enter();
1419 tick_nohz_full_check();
1418 sched_ttwu_pending(); 1420 sched_ttwu_pending();
1419 1421
1420 /* 1422 /*
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 884a9f302a06..4d74a68b2c34 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -151,7 +151,7 @@ bool have_nohz_full_mask;
151 * Re-evaluate the need for the tick on the current CPU 151 * Re-evaluate the need for the tick on the current CPU
152 * and restart it if necessary. 152 * and restart it if necessary.
153 */ 153 */
154static void tick_nohz_full_check(void) 154void tick_nohz_full_check(void)
155{ 155{
156 /* 156 /*
157 * STUB for now, will be filled with the full tick stop/restart 157 * STUB for now, will be filled with the full tick stop/restart