diff options
Diffstat (limited to 'include/linux/tick.h')
-rw-r--r-- | include/linux/tick.h | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/include/linux/tick.h b/include/linux/tick.h index 0df1d50a408a..327434a05757 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #define _LINUX_TICK_H | 7 | #define _LINUX_TICK_H |
8 | 8 | ||
9 | #include <linux/clockchips.h> | 9 | #include <linux/clockchips.h> |
10 | #include <linux/irqflags.h> | ||
10 | 11 | ||
11 | #ifdef CONFIG_GENERIC_CLOCKEVENTS | 12 | #ifdef CONFIG_GENERIC_CLOCKEVENTS |
12 | 13 | ||
@@ -121,18 +122,57 @@ static inline int tick_oneshot_mode_active(void) { return 0; } | |||
121 | #endif /* !CONFIG_GENERIC_CLOCKEVENTS */ | 122 | #endif /* !CONFIG_GENERIC_CLOCKEVENTS */ |
122 | 123 | ||
123 | # ifdef CONFIG_NO_HZ | 124 | # ifdef CONFIG_NO_HZ |
124 | extern void tick_nohz_idle_enter(void); | 125 | extern void __tick_nohz_idle_enter(void); |
126 | static inline void tick_nohz_idle_enter(void) | ||
127 | { | ||
128 | local_irq_disable(); | ||
129 | __tick_nohz_idle_enter(); | ||
130 | local_irq_enable(); | ||
131 | } | ||
125 | extern void tick_nohz_idle_exit(void); | 132 | extern void tick_nohz_idle_exit(void); |
133 | |||
134 | /* | ||
135 | * Call this pair of function if the arch doesn't make any use | ||
136 | * of RCU in-between. You won't need to call rcu_idle_enter() and | ||
137 | * rcu_idle_exit(). | ||
138 | * Otherwise you need to call tick_nohz_idle_enter() and tick_nohz_idle_exit() | ||
139 | * and explicitly tell RCU about the window around the place the CPU enters low | ||
140 | * power mode where no RCU use is made. This is done by calling rcu_idle_enter() | ||
141 | * after the last use of RCU before the CPU is put to sleep and by calling | ||
142 | * rcu_idle_exit() before the first use of RCU after the CPU woke up. | ||
143 | */ | ||
144 | static inline void tick_nohz_idle_enter_norcu(void) | ||
145 | { | ||
146 | /* | ||
147 | * Also call rcu_idle_enter() in the irq disabled section even | ||
148 | * if it disables irq itself. | ||
149 | * Just an optimization that prevents from an interrupt happening | ||
150 | * between it and __tick_nohz_idle_enter() to lose time to help | ||
151 | * completing a grace period while we could be in extended grace | ||
152 | * period already. | ||
153 | */ | ||
154 | local_irq_disable(); | ||
155 | __tick_nohz_idle_enter(); | ||
156 | rcu_idle_enter(); | ||
157 | local_irq_enable(); | ||
158 | } | ||
159 | static inline void tick_nohz_idle_exit_norcu(void) | ||
160 | { | ||
161 | rcu_idle_exit(); | ||
162 | tick_nohz_idle_exit(); | ||
163 | } | ||
126 | extern void tick_nohz_irq_exit(void); | 164 | extern void tick_nohz_irq_exit(void); |
127 | extern ktime_t tick_nohz_get_sleep_length(void); | 165 | extern ktime_t tick_nohz_get_sleep_length(void); |
128 | extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time); | 166 | extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time); |
129 | extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time); | 167 | extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time); |
130 | # else | 168 | # else |
131 | static inline void tick_nohz_idle_enter(void) | 169 | static inline void tick_nohz_idle_enter(void) { } |
170 | static inline void tick_nohz_idle_exit(void) { } | ||
171 | static inline void tick_nohz_idle_enter_norcu(void) | ||
132 | { | 172 | { |
133 | rcu_idle_enter(); | 173 | rcu_idle_enter(); |
134 | } | 174 | } |
135 | static inline void tick_nohz_idle_exit(void) | 175 | static inline void tick_nohz_idle_exit_norcu(void) |
136 | { | 176 | { |
137 | rcu_idle_exit(); | 177 | rcu_idle_exit(); |
138 | } | 178 | } |