aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/tick.h
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2007-02-16 04:28:03 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-16 11:13:59 -0500
commit79bf2bb335b85db25d27421c798595a2fa2a0e82 (patch)
tree550ec2654ae1dd65b871de7fe9c890108c6e86d8 /include/linux/tick.h
parentf8381cba04ba8173fd5a2b8e5cd8b3290ee13a98 (diff)
[PATCH] tick-management: dyntick / highres functionality
With Ingo Molnar <mingo@elte.hu> Add functions to provide dynamic ticks and high resolution timers. The code which keeps track of jiffies and handles the long idle periods is shared between tick based and high resolution timer based dynticks. The dyntick functionality can be disabled on the kernel commandline. Provide also the infrastructure to support high resolution timers. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: john stultz <johnstul@us.ibm.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/tick.h')
-rw-r--r--include/linux/tick.h71
1 files changed, 69 insertions, 2 deletions
diff --git a/include/linux/tick.h b/include/linux/tick.h
index e5c0a4e22706..cf435e459598 100644
--- a/include/linux/tick.h
+++ b/include/linux/tick.h
@@ -20,12 +20,79 @@ struct tick_device {
20 enum tick_device_mode mode; 20 enum tick_device_mode mode;
21}; 21};
22 22
23enum tick_nohz_mode {
24 NOHZ_MODE_INACTIVE,
25 NOHZ_MODE_LOWRES,
26 NOHZ_MODE_HIGHRES,
27};
28
29/**
30 * struct tick_sched - sched tick emulation and no idle tick control/stats
31 * @sched_timer: hrtimer to schedule the periodic tick in high
32 * resolution mode
33 * @idle_tick: Store the last idle tick expiry time when the tick
34 * timer is modified for idle sleeps. This is necessary
35 * to resume the tick timer operation in the timeline
36 * when the CPU returns from idle
37 * @tick_stopped: Indicator that the idle tick has been stopped
38 * @idle_jiffies: jiffies at the entry to idle for idle time accounting
39 * @idle_calls: Total number of idle calls
40 * @idle_sleeps: Number of idle calls, where the sched tick was stopped
41 * @idle_entrytime: Time when the idle call was entered
42 * @idle_sleeptime: Sum of the time slept in idle with sched tick stopped
43 */
44struct tick_sched {
45 struct hrtimer sched_timer;
46 unsigned long check_clocks;
47 enum tick_nohz_mode nohz_mode;
48 ktime_t idle_tick;
49 int tick_stopped;
50 unsigned long idle_jiffies;
51 unsigned long idle_calls;
52 unsigned long idle_sleeps;
53 ktime_t idle_entrytime;
54 ktime_t idle_sleeptime;
55 unsigned long last_jiffies;
56 unsigned long next_jiffies;
57 ktime_t idle_expires;
58};
59
23extern void __init tick_init(void); 60extern void __init tick_init(void);
61extern int tick_is_oneshot_available(void);
62
63# ifdef CONFIG_HIGH_RES_TIMERS
64extern int tick_init_highres(void);
65extern int tick_program_event(ktime_t expires, int force);
66extern void tick_setup_sched_timer(void);
67extern void tick_cancel_sched_timer(int cpu);
68# else
69static inline void tick_cancel_sched_timer(int cpu) { }
70# endif /* HIGHRES */
24 71
25#else 72# ifdef CONFIG_TICK_ONESHOT
73extern void tick_clock_notify(void);
74extern int tick_check_oneshot_change(int allow_nohz);
75extern struct tick_sched *tick_get_tick_sched(int cpu);
76# else
77static inline void tick_clock_notify(void) { }
78static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
79# endif
26 80
81#else /* CONFIG_GENERIC_CLOCKEVENTS */
27static inline void tick_init(void) { } 82static inline void tick_init(void) { }
83static inline void tick_cancel_sched_timer(int cpu) { }
84static inline void tick_clock_notify(void) { }
85static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
86#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
28 87
29#endif 88# ifdef CONFIG_NO_HZ
89extern void tick_nohz_stop_sched_tick(void);
90extern void tick_nohz_restart_sched_tick(void);
91extern void tick_nohz_update_jiffies(void);
92# else
93static inline void tick_nohz_stop_sched_tick(void) { }
94static inline void tick_nohz_restart_sched_tick(void) { }
95static inline void tick_nohz_update_jiffies(void) { }
96# endif /* !NO_HZ */
30 97
31#endif 98#endif