blob: 686da821d376b01dd21d379bfd8baf39d6b106f1 [file] [log] [blame]
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -08001/*
2 * linux/kernel/time/tick-sched.c
3 *
4 * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
5 * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
6 * Copyright(C) 2006-2007 Timesys Corp., Thomas Gleixner
7 *
8 * No idle tick implementation for low and high resolution timers
9 *
10 * Started by: Thomas Gleixner and Ingo Molnar
11 *
Pavel Machekb10db7f2008-01-30 13:30:00 +010012 * Distribute under GPLv2.
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -080013 */
14#include <linux/cpu.h>
15#include <linux/err.h>
16#include <linux/hrtimer.h>
17#include <linux/interrupt.h>
18#include <linux/kernel_stat.h>
19#include <linux/percpu.h>
20#include <linux/profile.h>
21#include <linux/sched.h>
22#include <linux/tick.h>
23
David S. Miller9e203bc2007-02-24 22:10:13 -080024#include <asm/irq_regs.h>
25
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -080026#include "tick-internal.h"
27
28/*
29 * Per cpu nohz control structure
30 */
31static DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched);
32
33/*
34 * The time, when the last jiffy update happened. Protected by xtime_lock.
35 */
36static ktime_t last_jiffies_update;
37
Ingo Molnar289f4802007-02-16 01:28:15 -080038struct tick_sched *tick_get_tick_sched(int cpu)
39{
40 return &per_cpu(tick_cpu_sched, cpu);
41}
42
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -080043/*
44 * Must be called with interrupts disabled !
45 */
46static void tick_do_update_jiffies64(ktime_t now)
47{
48 unsigned long ticks = 0;
49 ktime_t delta;
50
51 /* Reevalute with xtime_lock held */
52 write_seqlock(&xtime_lock);
53
54 delta = ktime_sub(now, last_jiffies_update);
55 if (delta.tv64 >= tick_period.tv64) {
56
57 delta = ktime_sub(delta, tick_period);
58 last_jiffies_update = ktime_add(last_jiffies_update,
59 tick_period);
60
61 /* Slow path for long timeouts */
62 if (unlikely(delta.tv64 >= tick_period.tv64)) {
63 s64 incr = ktime_to_ns(tick_period);
64
65 ticks = ktime_divns(delta, incr);
66
67 last_jiffies_update = ktime_add_ns(last_jiffies_update,
68 incr * ticks);
69 }
70 do_timer(++ticks);
71 }
72 write_sequnlock(&xtime_lock);
73}
74
75/*
76 * Initialize and return retrieve the jiffies update.
77 */
78static ktime_t tick_init_jiffy_update(void)
79{
80 ktime_t period;
81
82 write_seqlock(&xtime_lock);
83 /* Did we start the jiffies update yet ? */
84 if (last_jiffies_update.tv64 == 0)
85 last_jiffies_update = tick_next_period;
86 period = last_jiffies_update;
87 write_sequnlock(&xtime_lock);
88 return period;
89}
90
91/*
92 * NOHZ - aka dynamic tick functionality
93 */
94#ifdef CONFIG_NO_HZ
95/*
96 * NO HZ enabled ?
97 */
98static int tick_nohz_enabled __read_mostly = 1;
99
100/*
101 * Enable / Disable tickless mode
102 */
103static int __init setup_tick_nohz(char *str)
104{
105 if (!strcmp(str, "off"))
106 tick_nohz_enabled = 0;
107 else if (!strcmp(str, "on"))
108 tick_nohz_enabled = 1;
109 else
110 return 0;
111 return 1;
112}
113
114__setup("nohz=", setup_tick_nohz);
115
116/**
117 * tick_nohz_update_jiffies - update jiffies when idle was interrupted
118 *
119 * Called from interrupt entry when the CPU was idle
120 *
121 * In case the sched_tick was stopped on this CPU, we have to check if jiffies
122 * must be updated. Otherwise an interrupt handler could use a stale jiffy
123 * value. We do this unconditionally on any cpu, as we don't know whether the
124 * cpu, which has the update task assigned is in a long sleep.
125 */
126void tick_nohz_update_jiffies(void)
127{
128 int cpu = smp_processor_id();
129 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
130 unsigned long flags;
131 ktime_t now;
132
133 if (!ts->tick_stopped)
134 return;
135
Thomas Gleixnerd3938202007-11-28 15:52:56 +0100136 touch_softlockup_watchdog();
137
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800138 cpu_clear(cpu, nohz_cpu_mask);
139 now = ktime_get();
Thomas Gleixner5df7fa12008-02-01 17:45:14 +0100140 ts->idle_waketime = now;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800141
142 local_irq_save(flags);
143 tick_do_update_jiffies64(now);
144 local_irq_restore(flags);
145}
146
Venki Pallipadi6378ddb2008-01-30 13:30:04 +0100147void tick_nohz_stop_idle(int cpu)
148{
149 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
150
151 if (ts->idle_active) {
152 ktime_t now, delta;
153 now = ktime_get();
154 delta = ktime_sub(now, ts->idle_entrytime);
155 ts->idle_lastupdate = now;
156 ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta);
157 ts->idle_active = 0;
158 }
159}
160
161static ktime_t tick_nohz_start_idle(int cpu)
162{
163 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
164 ktime_t now, delta;
165
166 now = ktime_get();
167 if (ts->idle_active) {
168 delta = ktime_sub(now, ts->idle_entrytime);
169 ts->idle_lastupdate = now;
170 ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta);
171 }
172 ts->idle_entrytime = now;
173 ts->idle_active = 1;
174 return now;
175}
176
177u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time)
178{
179 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
180
181 *last_update_time = ktime_to_us(ts->idle_lastupdate);
182 return ktime_to_us(ts->idle_sleeptime);
183}
184
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800185/**
186 * tick_nohz_stop_sched_tick - stop the idle tick from the idle task
187 *
188 * When the next event is more than a tick into the future, stop the idle tick
189 * Called either from the idle loop or from irq_exit() when an idle period was
190 * just interrupted by an interrupt which did not cause a reschedule.
191 */
192void tick_nohz_stop_sched_tick(void)
193{
194 unsigned long seq, last_jiffies, next_jiffies, delta_jiffies, flags;
Peter Zijlstra48d5e252008-01-25 21:08:31 +0100195 unsigned long rt_jiffies;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800196 struct tick_sched *ts;
Venki Pallipadi6378ddb2008-01-30 13:30:04 +0100197 ktime_t last_update, expires, now;
Len Brown4f86d3a2007-10-03 18:58:00 -0400198 struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800199 int cpu;
200
201 local_irq_save(flags);
202
203 cpu = smp_processor_id();
Venki Pallipadi6378ddb2008-01-30 13:30:04 +0100204 now = tick_nohz_start_idle(cpu);
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800205 ts = &per_cpu(tick_cpu_sched, cpu);
206
Thomas Gleixner5e41d0d2007-09-16 15:36:43 +0200207 /*
208 * If this cpu is offline and it is the one which updates
209 * jiffies, then give up the assignment and let it be taken by
210 * the cpu which runs the tick timer next. If we don't drop
211 * this here the jiffies might be stale and do_timer() never
212 * invoked.
213 */
214 if (unlikely(!cpu_online(cpu))) {
215 if (cpu == tick_do_timer_cpu)
216 tick_do_timer_cpu = -1;
217 }
218
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800219 if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
220 goto end;
221
222 if (need_resched())
223 goto end;
224
225 cpu = smp_processor_id();
Thomas Gleixner35282312007-05-23 13:57:37 -0700226 if (unlikely(local_softirq_pending())) {
227 static int ratelimit;
228
229 if (ratelimit < 10) {
230 printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n",
231 local_softirq_pending());
232 ratelimit++;
233 }
234 }
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800235
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800236 ts->idle_calls++;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800237 /* Read jiffies and the time when jiffies were updated last */
238 do {
239 seq = read_seqbegin(&xtime_lock);
240 last_update = last_jiffies_update;
241 last_jiffies = jiffies;
242 } while (read_seqretry(&xtime_lock, seq));
243
244 /* Get the next timer wheel timer */
245 next_jiffies = get_next_timer_interrupt(last_jiffies);
246 delta_jiffies = next_jiffies - last_jiffies;
247
Peter Zijlstra48d5e252008-01-25 21:08:31 +0100248 rt_jiffies = rt_needs_cpu(cpu);
249 if (rt_jiffies && rt_jiffies < delta_jiffies)
250 delta_jiffies = rt_jiffies;
251
Ingo Molnar6ba9b342007-02-19 18:11:56 +0000252 if (rcu_needs_cpu(cpu))
253 delta_jiffies = 1;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800254 /*
255 * Do not stop the tick, if we are only one off
256 * or if the cpu is required for rcu
257 */
Ingo Molnar6ba9b342007-02-19 18:11:56 +0000258 if (!ts->tick_stopped && delta_jiffies == 1)
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800259 goto out;
260
261 /* Schedule the tick, if we are at least one jiffie off */
262 if ((long)delta_jiffies >= 1) {
263
Ingo Molnar6ba9b342007-02-19 18:11:56 +0000264 if (delta_jiffies > 1)
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800265 cpu_set(cpu, nohz_cpu_mask);
266 /*
267 * nohz_stop_sched_tick can be called several times before
268 * the nohz_restart_sched_tick is called. This happens when
269 * interrupts arrive which do not cause a reschedule. In the
270 * first call we save the current tick time, so we can restart
271 * the scheduler tick in nohz_restart_sched_tick.
272 */
273 if (!ts->tick_stopped) {
Siddha, Suresh B46cb4b72007-05-08 00:32:51 -0700274 if (select_nohz_load_balancer(1)) {
275 /*
276 * sched tick not stopped!
277 */
278 cpu_clear(cpu, nohz_cpu_mask);
279 goto out;
280 }
281
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800282 ts->idle_tick = ts->sched_timer.expires;
283 ts->tick_stopped = 1;
284 ts->idle_jiffies = last_jiffies;
Steven Rostedt2232c2d2008-02-29 18:46:50 +0100285 rcu_enter_nohz();
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800286 }
Thomas Gleixnerd3ed7822007-05-08 00:30:03 -0700287
288 /*
289 * If this cpu is the one which updates jiffies, then
290 * give up the assignment and let it be taken by the
291 * cpu which runs the tick timer next, which might be
292 * this cpu as well. If we don't drop this here the
293 * jiffies might be stale and do_timer() never
294 * invoked.
295 */
296 if (cpu == tick_do_timer_cpu)
297 tick_do_timer_cpu = -1;
298
Thomas Gleixnereaad0842007-05-29 23:47:39 +0200299 ts->idle_sleeps++;
300
301 /*
302 * delta_jiffies >= NEXT_TIMER_MAX_DELTA signals that
303 * there is no timer pending or at least extremly far
304 * into the future (12 days for HZ=1000). In this case
305 * we simply stop the tick timer:
306 */
307 if (unlikely(delta_jiffies >= NEXT_TIMER_MAX_DELTA)) {
308 ts->idle_expires.tv64 = KTIME_MAX;
309 if (ts->nohz_mode == NOHZ_MODE_HIGHRES)
310 hrtimer_cancel(&ts->sched_timer);
311 goto out;
312 }
313
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800314 /*
315 * calculate the expiry time for the next timer wheel
316 * timer
317 */
318 expires = ktime_add_ns(last_update, tick_period.tv64 *
319 delta_jiffies);
320 ts->idle_expires = expires;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800321
322 if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
323 hrtimer_start(&ts->sched_timer, expires,
324 HRTIMER_MODE_ABS);
325 /* Check, if the timer was already in the past */
326 if (hrtimer_active(&ts->sched_timer))
327 goto out;
Pavel Machek4c9dc642008-01-30 13:30:00 +0100328 } else if (!tick_program_event(expires, 0))
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800329 goto out;
330 /*
331 * We are past the event already. So we crossed a
332 * jiffie boundary. Update jiffies and raise the
333 * softirq.
334 */
335 tick_do_update_jiffies64(ktime_get());
336 cpu_clear(cpu, nohz_cpu_mask);
337 }
338 raise_softirq_irqoff(TIMER_SOFTIRQ);
339out:
340 ts->next_jiffies = next_jiffies;
341 ts->last_jiffies = last_jiffies;
Len Brown4f86d3a2007-10-03 18:58:00 -0400342 ts->sleep_length = ktime_sub(dev->next_event, now);
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800343end:
344 local_irq_restore(flags);
345}
346
347/**
Len Brown4f86d3a2007-10-03 18:58:00 -0400348 * tick_nohz_get_sleep_length - return the length of the current sleep
349 *
350 * Called from power state control code with interrupts disabled
351 */
352ktime_t tick_nohz_get_sleep_length(void)
353{
354 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
355
356 return ts->sleep_length;
357}
358
Len Brown4f86d3a2007-10-03 18:58:00 -0400359/**
Li Zefan8dce39c2007-11-05 14:51:10 -0800360 * tick_nohz_restart_sched_tick - restart the idle tick from the idle task
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800361 *
362 * Restart the idle tick when the CPU is woken up from idle
363 */
364void tick_nohz_restart_sched_tick(void)
365{
366 int cpu = smp_processor_id();
367 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
368 unsigned long ticks;
Venki Pallipadi6378ddb2008-01-30 13:30:04 +0100369 ktime_t now;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800370
371 local_irq_disable();
Venki Pallipadi6378ddb2008-01-30 13:30:04 +0100372 tick_nohz_stop_idle(cpu);
373
374 if (!ts->tick_stopped) {
375 local_irq_enable();
376 return;
377 }
378
Steven Rostedt2232c2d2008-02-29 18:46:50 +0100379 rcu_exit_nohz();
380
Venki Pallipadi6378ddb2008-01-30 13:30:04 +0100381 /* Update jiffies first */
Siddha, Suresh B46cb4b72007-05-08 00:32:51 -0700382 select_nohz_load_balancer(0);
Venki Pallipadi6378ddb2008-01-30 13:30:04 +0100383 now = ktime_get();
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800384 tick_do_update_jiffies64(now);
385 cpu_clear(cpu, nohz_cpu_mask);
386
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800387 /*
388 * We stopped the tick in idle. Update process times would miss the
389 * time we slept as update_process_times does only a 1 tick
390 * accounting. Enforce that this is accounted to idle !
391 */
392 ticks = jiffies - ts->idle_jiffies;
393 /*
394 * We might be one off. Do not randomly account a huge number of ticks!
395 */
396 if (ticks && ticks < LONG_MAX) {
397 add_preempt_count(HARDIRQ_OFFSET);
398 account_system_time(current, HARDIRQ_OFFSET,
399 jiffies_to_cputime(ticks));
400 sub_preempt_count(HARDIRQ_OFFSET);
401 }
402
403 /*
404 * Cancel the scheduled timer and restore the tick
405 */
406 ts->tick_stopped = 0;
Thomas Gleixner5df7fa12008-02-01 17:45:14 +0100407 ts->idle_exittime = now;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800408 hrtimer_cancel(&ts->sched_timer);
409 ts->sched_timer.expires = ts->idle_tick;
410
411 while (1) {
412 /* Forward the time to expire in the future */
413 hrtimer_forward(&ts->sched_timer, now, tick_period);
414
415 if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
416 hrtimer_start(&ts->sched_timer,
417 ts->sched_timer.expires,
418 HRTIMER_MODE_ABS);
419 /* Check, if the timer was already in the past */
420 if (hrtimer_active(&ts->sched_timer))
421 break;
422 } else {
423 if (!tick_program_event(ts->sched_timer.expires, 0))
424 break;
425 }
426 /* Update jiffies and reread time */
427 tick_do_update_jiffies64(now);
428 now = ktime_get();
429 }
430 local_irq_enable();
431}
432
433static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now)
434{
435 hrtimer_forward(&ts->sched_timer, now, tick_period);
436 return tick_program_event(ts->sched_timer.expires, 0);
437}
438
439/*
440 * The nohz low res interrupt handler
441 */
442static void tick_nohz_handler(struct clock_event_device *dev)
443{
444 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
445 struct pt_regs *regs = get_irq_regs();
Thomas Gleixnerd3ed7822007-05-08 00:30:03 -0700446 int cpu = smp_processor_id();
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800447 ktime_t now = ktime_get();
448
449 dev->next_event.tv64 = KTIME_MAX;
450
Thomas Gleixnerd3ed7822007-05-08 00:30:03 -0700451 /*
452 * Check if the do_timer duty was dropped. We don't care about
453 * concurrency: This happens only when the cpu in charge went
454 * into a long sleep. If two cpus happen to assign themself to
455 * this duty, then the jiffies update is still serialized by
456 * xtime_lock.
457 */
458 if (unlikely(tick_do_timer_cpu == -1))
459 tick_do_timer_cpu = cpu;
460
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800461 /* Check, if the jiffies need an update */
Thomas Gleixnerd3ed7822007-05-08 00:30:03 -0700462 if (tick_do_timer_cpu == cpu)
463 tick_do_update_jiffies64(now);
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800464
465 /*
466 * When we are idle and the tick is stopped, we have to touch
467 * the watchdog as we might not schedule for a really long
468 * time. This happens on complete idle SMP systems while
469 * waiting on the login prompt. We also increment the "start
470 * of idle" jiffy stamp so the idle accounting adjustment we
471 * do when we go busy again does not account too much ticks.
472 */
473 if (ts->tick_stopped) {
474 touch_softlockup_watchdog();
475 ts->idle_jiffies++;
476 }
477
478 update_process_times(user_mode(regs));
479 profile_tick(CPU_PROFILING);
480
481 /* Do not restart, when we are in the idle loop */
482 if (ts->tick_stopped)
483 return;
484
485 while (tick_nohz_reprogram(ts, now)) {
486 now = ktime_get();
487 tick_do_update_jiffies64(now);
488 }
489}
490
491/**
492 * tick_nohz_switch_to_nohz - switch to nohz mode
493 */
494static void tick_nohz_switch_to_nohz(void)
495{
496 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
497 ktime_t next;
498
499 if (!tick_nohz_enabled)
500 return;
501
502 local_irq_disable();
503 if (tick_switch_to_oneshot(tick_nohz_handler)) {
504 local_irq_enable();
505 return;
506 }
507
508 ts->nohz_mode = NOHZ_MODE_LOWRES;
509
510 /*
511 * Recycle the hrtimer in ts, so we can share the
512 * hrtimer_forward with the highres code.
513 */
514 hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
515 /* Get the next period */
516 next = tick_init_jiffy_update();
517
518 for (;;) {
519 ts->sched_timer.expires = next;
520 if (!tick_program_event(next, 0))
521 break;
522 next = ktime_add(next, tick_period);
523 }
524 local_irq_enable();
525
526 printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n",
527 smp_processor_id());
528}
529
530#else
531
532static inline void tick_nohz_switch_to_nohz(void) { }
533
534#endif /* NO_HZ */
535
536/*
537 * High resolution timer specific code
538 */
539#ifdef CONFIG_HIGH_RES_TIMERS
540/*
Pavel Machek4c9dc642008-01-30 13:30:00 +0100541 * We rearm the timer until we get disabled by the idle code.
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800542 * Called with interrupts disabled and timer->base->cpu_base->lock held.
543 */
544static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
545{
546 struct tick_sched *ts =
547 container_of(timer, struct tick_sched, sched_timer);
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800548 struct pt_regs *regs = get_irq_regs();
549 ktime_t now = ktime_get();
Thomas Gleixnerd3ed7822007-05-08 00:30:03 -0700550 int cpu = smp_processor_id();
551
552#ifdef CONFIG_NO_HZ
553 /*
554 * Check if the do_timer duty was dropped. We don't care about
555 * concurrency: This happens only when the cpu in charge went
556 * into a long sleep. If two cpus happen to assign themself to
557 * this duty, then the jiffies update is still serialized by
558 * xtime_lock.
559 */
560 if (unlikely(tick_do_timer_cpu == -1))
561 tick_do_timer_cpu = cpu;
562#endif
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800563
564 /* Check, if the jiffies need an update */
Thomas Gleixnerd3ed7822007-05-08 00:30:03 -0700565 if (tick_do_timer_cpu == cpu)
566 tick_do_update_jiffies64(now);
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800567
568 /*
569 * Do not call, when we are not in irq context and have
570 * no valid regs pointer
571 */
572 if (regs) {
573 /*
574 * When we are idle and the tick is stopped, we have to touch
575 * the watchdog as we might not schedule for a really long
576 * time. This happens on complete idle SMP systems while
577 * waiting on the login prompt. We also increment the "start of
578 * idle" jiffy stamp so the idle accounting adjustment we do
579 * when we go busy again does not account too much ticks.
580 */
581 if (ts->tick_stopped) {
582 touch_softlockup_watchdog();
583 ts->idle_jiffies++;
584 }
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800585 update_process_times(user_mode(regs));
586 profile_tick(CPU_PROFILING);
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800587 }
588
589 /* Do not restart, when we are in the idle loop */
590 if (ts->tick_stopped)
591 return HRTIMER_NORESTART;
592
593 hrtimer_forward(timer, now, tick_period);
594
595 return HRTIMER_RESTART;
596}
597
598/**
599 * tick_setup_sched_timer - setup the tick emulation timer
600 */
601void tick_setup_sched_timer(void)
602{
603 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
604 ktime_t now = ktime_get();
john stultz37045402007-07-21 04:37:35 -0700605 u64 offset;
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800606
607 /*
608 * Emulate tick processing via per-CPU hrtimers:
609 */
610 hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
611 ts->sched_timer.function = tick_sched_timer;
612 ts->sched_timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ;
613
john stultz37045402007-07-21 04:37:35 -0700614 /* Get the next period (per cpu) */
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800615 ts->sched_timer.expires = tick_init_jiffy_update();
john stultz37045402007-07-21 04:37:35 -0700616 offset = ktime_to_ns(tick_period) >> 1;
john stultzb2d93232007-10-16 23:27:18 -0700617 do_div(offset, num_possible_cpus());
john stultz37045402007-07-21 04:37:35 -0700618 offset *= smp_processor_id();
619 ts->sched_timer.expires = ktime_add_ns(ts->sched_timer.expires, offset);
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800620
621 for (;;) {
622 hrtimer_forward(&ts->sched_timer, now, tick_period);
623 hrtimer_start(&ts->sched_timer, ts->sched_timer.expires,
624 HRTIMER_MODE_ABS);
625 /* Check, if the timer was already in the past */
626 if (hrtimer_active(&ts->sched_timer))
627 break;
628 now = ktime_get();
629 }
630
631#ifdef CONFIG_NO_HZ
632 if (tick_nohz_enabled)
633 ts->nohz_mode = NOHZ_MODE_HIGHRES;
634#endif
635}
636
637void tick_cancel_sched_timer(int cpu)
638{
639 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
640
641 if (ts->sched_timer.base)
642 hrtimer_cancel(&ts->sched_timer);
Karsten Wiesea7901762008-03-04 14:59:55 -0800643
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800644 ts->nohz_mode = NOHZ_MODE_INACTIVE;
645}
646#endif /* HIGH_RES_TIMERS */
647
648/**
649 * Async notification about clocksource changes
650 */
651void tick_clock_notify(void)
652{
653 int cpu;
654
655 for_each_possible_cpu(cpu)
656 set_bit(0, &per_cpu(tick_cpu_sched, cpu).check_clocks);
657}
658
659/*
660 * Async notification about clock event changes
661 */
662void tick_oneshot_notify(void)
663{
664 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
665
666 set_bit(0, &ts->check_clocks);
667}
668
669/**
670 * Check, if a change happened, which makes oneshot possible.
671 *
672 * Called cyclic from the hrtimer softirq (driven by the timer
673 * softirq) allow_nohz signals, that we can switch into low-res nohz
674 * mode, because high resolution timers are disabled (either compile
675 * or runtime).
676 */
677int tick_check_oneshot_change(int allow_nohz)
678{
679 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
680
681 if (!test_and_clear_bit(0, &ts->check_clocks))
682 return 0;
683
684 if (ts->nohz_mode != NOHZ_MODE_INACTIVE)
685 return 0;
686
Li Zefancf4fc6c2008-02-08 04:19:24 -0800687 if (!timekeeping_valid_for_hres() || !tick_is_oneshot_available())
Thomas Gleixner79bf2bb2007-02-16 01:28:03 -0800688 return 0;
689
690 if (!allow_nohz)
691 return 1;
692
693 tick_nohz_switch_to_nohz();
694 return 0;
695}