diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2009-09-29 08:25:16 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-11-05 01:53:53 -0500 |
commit | 3c5d92a0cfb5103c0d5ab74d4ae6373d3af38148 (patch) | |
tree | c8b50351568601428b6f9396ebfdd65e486b3097 /kernel/time | |
parent | eed3b9cf3fe3fcc7a50238dfcab63a63914e8f42 (diff) |
nohz: Introduce arch_needs_cpu
Allow the architecture to request a normal jiffy tick when the system
goes idle and tick_nohz_stop_sched_tick is called . On s390 the hook is
used to prevent the system going fully idle if there has been an
interrupt other than a clock comparator interrupt since the last wakeup.
On s390 the HiperSockets response time for 1 connection ping-pong goes
down from 42 to 34 microseconds. The CPU cost decreases by 27%.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
LKML-Reference: <20090929122533.402715150@de.ibm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/tick-sched.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 7378e2c71ca6..3840f6dff7eb 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -264,12 +264,15 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
264 | last_jiffies = jiffies; | 264 | last_jiffies = jiffies; |
265 | } while (read_seqretry(&xtime_lock, seq)); | 265 | } while (read_seqretry(&xtime_lock, seq)); |
266 | 266 | ||
267 | /* Get the next timer wheel timer */ | 267 | if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || |
268 | next_jiffies = get_next_timer_interrupt(last_jiffies); | 268 | arch_needs_cpu(cpu)) { |
269 | delta_jiffies = next_jiffies - last_jiffies; | 269 | next_jiffies = last_jiffies + 1; |
270 | |||
271 | if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu)) | ||
272 | delta_jiffies = 1; | 270 | delta_jiffies = 1; |
271 | } else { | ||
272 | /* Get the next timer wheel timer */ | ||
273 | next_jiffies = get_next_timer_interrupt(last_jiffies); | ||
274 | delta_jiffies = next_jiffies - last_jiffies; | ||
275 | } | ||
273 | /* | 276 | /* |
274 | * Do not stop the tick, if we are only one off | 277 | * Do not stop the tick, if we are only one off |
275 | * or if the cpu is required for rcu | 278 | * or if the cpu is required for rcu |