diff options
Diffstat (limited to 'include/linux/tick.h')
-rw-r--r-- | include/linux/tick.h | 71 |
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 | ||
23 | enum 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 | */ | ||
44 | struct 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 | |||
23 | extern void __init tick_init(void); | 60 | extern void __init tick_init(void); |
61 | extern int tick_is_oneshot_available(void); | ||
62 | |||
63 | # ifdef CONFIG_HIGH_RES_TIMERS | ||
64 | extern int tick_init_highres(void); | ||
65 | extern int tick_program_event(ktime_t expires, int force); | ||
66 | extern void tick_setup_sched_timer(void); | ||
67 | extern void tick_cancel_sched_timer(int cpu); | ||
68 | # else | ||
69 | static inline void tick_cancel_sched_timer(int cpu) { } | ||
70 | # endif /* HIGHRES */ | ||
24 | 71 | ||
25 | #else | 72 | # ifdef CONFIG_TICK_ONESHOT |
73 | extern void tick_clock_notify(void); | ||
74 | extern int tick_check_oneshot_change(int allow_nohz); | ||
75 | extern struct tick_sched *tick_get_tick_sched(int cpu); | ||
76 | # else | ||
77 | static inline void tick_clock_notify(void) { } | ||
78 | static inline int tick_check_oneshot_change(int allow_nohz) { return 0; } | ||
79 | # endif | ||
26 | 80 | ||
81 | #else /* CONFIG_GENERIC_CLOCKEVENTS */ | ||
27 | static inline void tick_init(void) { } | 82 | static inline void tick_init(void) { } |
83 | static inline void tick_cancel_sched_timer(int cpu) { } | ||
84 | static inline void tick_clock_notify(void) { } | ||
85 | static 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 |
89 | extern void tick_nohz_stop_sched_tick(void); | ||
90 | extern void tick_nohz_restart_sched_tick(void); | ||
91 | extern void tick_nohz_update_jiffies(void); | ||
92 | # else | ||
93 | static inline void tick_nohz_stop_sched_tick(void) { } | ||
94 | static inline void tick_nohz_restart_sched_tick(void) { } | ||
95 | static inline void tick_nohz_update_jiffies(void) { } | ||
96 | # endif /* !NO_HZ */ | ||
30 | 97 | ||
31 | #endif | 98 | #endif |