1
2
3
4
5
6#ifndef _LINUX_TICK_H
7#define _LINUX_TICK_H
8
9#include <linux/clockchips.h>
10#include <linux/irqflags.h>
11#include <linux/percpu.h>
12#include <linux/hrtimer.h>
13
14#ifdef CONFIG_GENERIC_CLOCKEVENTS
15
16enum tick_device_mode {
17 TICKDEV_MODE_PERIODIC,
18 TICKDEV_MODE_ONESHOT,
19};
20
21struct tick_device {
22 struct clock_event_device *evtdev;
23 enum tick_device_mode mode;
24};
25
26enum tick_nohz_mode {
27 NOHZ_MODE_INACTIVE,
28 NOHZ_MODE_LOWRES,
29 NOHZ_MODE_HIGHRES,
30};
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52struct tick_sched {
53 struct hrtimer sched_timer;
54 unsigned long check_clocks;
55 enum tick_nohz_mode nohz_mode;
56 ktime_t last_tick;
57 int inidle;
58 int tick_stopped;
59 unsigned long idle_jiffies;
60 unsigned long idle_calls;
61 unsigned long idle_sleeps;
62 int idle_active;
63 ktime_t idle_entrytime;
64 ktime_t idle_waketime;
65 ktime_t idle_exittime;
66 ktime_t idle_sleeptime;
67 ktime_t iowait_sleeptime;
68 ktime_t sleep_length;
69 unsigned long last_jiffies;
70 unsigned long next_jiffies;
71 ktime_t idle_expires;
72 int do_timer_last;
73};
74
75extern void __init tick_init(void);
76extern int tick_is_oneshot_available(void);
77extern struct tick_device *tick_get_device(int cpu);
78
79# ifdef CONFIG_HIGH_RES_TIMERS
80extern int tick_init_highres(void);
81extern int tick_program_event(ktime_t expires, int force);
82extern void tick_setup_sched_timer(void);
83# endif
84
85# if defined CONFIG_NO_HZ_COMMON || defined CONFIG_HIGH_RES_TIMERS
86extern void tick_cancel_sched_timer(int cpu);
87# else
88static inline void tick_cancel_sched_timer(int cpu) { }
89# endif
90
91# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
92extern struct tick_device *tick_get_broadcast_device(void);
93extern struct cpumask *tick_get_broadcast_mask(void);
94
95# ifdef CONFIG_TICK_ONESHOT
96extern struct cpumask *tick_get_broadcast_oneshot_mask(void);
97# endif
98
99# endif
100
101# ifdef CONFIG_TICK_ONESHOT
102extern void tick_clock_notify(void);
103extern int tick_check_oneshot_change(int allow_nohz);
104extern struct tick_sched *tick_get_tick_sched(int cpu);
105extern void tick_check_idle(int cpu);
106extern int tick_oneshot_mode_active(void);
107# ifndef arch_needs_cpu
108# define arch_needs_cpu(cpu) (0)
109# endif
110# else
111static inline void tick_clock_notify(void) { }
112static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
113static inline void tick_check_idle(int cpu) { }
114static inline int tick_oneshot_mode_active(void) { return 0; }
115# endif
116
117#else
118static inline void tick_init(void) { }
119static inline void tick_cancel_sched_timer(int cpu) { }
120static inline void tick_clock_notify(void) { }
121static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
122static inline void tick_check_idle(int cpu) { }
123static inline int tick_oneshot_mode_active(void) { return 0; }
124#endif
125
126# ifdef CONFIG_NO_HZ_COMMON
127DECLARE_PER_CPU(struct tick_sched, tick_cpu_sched);
128
129static inline int tick_nohz_tick_stopped(void)
130{
131 return __this_cpu_read(tick_cpu_sched.tick_stopped);
132}
133
134extern void tick_nohz_idle_enter(void);
135extern void tick_nohz_idle_exit(void);
136extern void tick_nohz_irq_exit(void);
137extern ktime_t tick_nohz_get_sleep_length(void);
138extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
139extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);
140
141# else
142static inline int tick_nohz_tick_stopped(void)
143{
144 return 0;
145}
146
147static inline void tick_nohz_idle_enter(void) { }
148static inline void tick_nohz_idle_exit(void) { }
149
150static inline ktime_t tick_nohz_get_sleep_length(void)
151{
152 ktime_t len = { .tv64 = NSEC_PER_SEC/HZ };
153
154 return len;
155}
156static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
157static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }
158# endif
159
160#ifdef CONFIG_NO_HZ_FULL
161extern void tick_nohz_init(void);
162extern int tick_nohz_full_cpu(int cpu);
163extern void tick_nohz_full_check(void);
164extern void tick_nohz_full_kick(void);
165extern void tick_nohz_full_kick_all(void);
166extern void tick_nohz_task_switch(struct task_struct *tsk);
167#else
168static inline void tick_nohz_init(void) { }
169static inline int tick_nohz_full_cpu(int cpu) { return 0; }
170static inline void tick_nohz_full_check(void) { }
171static inline void tick_nohz_full_kick(void) { }
172static inline void tick_nohz_full_kick_all(void) { }
173static inline void tick_nohz_task_switch(struct task_struct *tsk) { }
174#endif
175
176
177#endif
178