root/include/linux/tick.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. tick_init
  2. tick_suspend_local
  3. tick_resume_local
  4. tick_handover_do_timer
  5. tick_cleanup_dead_cpu
  6. tick_freeze
  7. tick_unfreeze
  8. tick_irq_enter
  9. hotplug_cpu__broadcast_tick_pull
  10. tick_broadcast_control
  11. tick_offline_cpu
  12. tick_broadcast_oneshot_control
  13. tick_broadcast_enable
  14. tick_broadcast_disable
  15. tick_broadcast_force
  16. tick_broadcast_enter
  17. tick_broadcast_exit
  18. tick_nohz_idle_stop_tick_protected
  19. tick_nohz_tick_stopped
  20. tick_nohz_tick_stopped_cpu
  21. tick_nohz_idle_stop_tick
  22. tick_nohz_idle_retain_tick
  23. tick_nohz_idle_restart_tick
  24. tick_nohz_idle_enter
  25. tick_nohz_idle_exit
  26. tick_nohz_idle_got_tick
  27. tick_nohz_get_next_hrtimer
  28. tick_nohz_get_sleep_length
  29. get_cpu_idle_time_us
  30. get_cpu_iowait_time_us
  31. tick_nohz_idle_stop_tick_protected
  32. tick_nohz_full_enabled
  33. tick_nohz_full_cpu
  34. tick_nohz_full_add_cpus_to
  35. tick_dep_set
  36. tick_dep_clear
  37. tick_dep_set_cpu
  38. tick_dep_clear_cpu
  39. tick_dep_set_task
  40. tick_dep_clear_task
  41. tick_dep_set_signal
  42. tick_dep_clear_signal
  43. tick_nohz_full_enabled
  44. tick_nohz_full_cpu
  45. tick_nohz_full_add_cpus_to
  46. tick_dep_set
  47. tick_dep_clear
  48. tick_dep_set_cpu
  49. tick_dep_clear_cpu
  50. tick_dep_set_task
  51. tick_dep_clear_task
  52. tick_dep_set_signal
  53. tick_dep_clear_signal
  54. tick_nohz_full_kick_cpu
  55. __tick_nohz_task_switch
  56. tick_nohz_full_setup
  57. tick_nohz_task_switch

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * Tick related global functions
   4  */
   5 #ifndef _LINUX_TICK_H
   6 #define _LINUX_TICK_H
   7 
   8 #include <linux/clockchips.h>
   9 #include <linux/irqflags.h>
  10 #include <linux/percpu.h>
  11 #include <linux/context_tracking_state.h>
  12 #include <linux/cpumask.h>
  13 #include <linux/sched.h>
  14 
  15 #ifdef CONFIG_GENERIC_CLOCKEVENTS
  16 extern void __init tick_init(void);
  17 /* Should be core only, but ARM BL switcher requires it */
  18 extern void tick_suspend_local(void);
  19 /* Should be core only, but XEN resume magic and ARM BL switcher require it */
  20 extern void tick_resume_local(void);
  21 extern void tick_handover_do_timer(void);
  22 extern void tick_cleanup_dead_cpu(int cpu);
  23 #else /* CONFIG_GENERIC_CLOCKEVENTS */
  24 static inline void tick_init(void) { }
  25 static inline void tick_suspend_local(void) { }
  26 static inline void tick_resume_local(void) { }
  27 static inline void tick_handover_do_timer(void) { }
  28 static inline void tick_cleanup_dead_cpu(int cpu) { }
  29 #endif /* !CONFIG_GENERIC_CLOCKEVENTS */
  30 
  31 #if defined(CONFIG_GENERIC_CLOCKEVENTS) && defined(CONFIG_SUSPEND)
  32 extern void tick_freeze(void);
  33 extern void tick_unfreeze(void);
  34 #else
  35 static inline void tick_freeze(void) { }
  36 static inline void tick_unfreeze(void) { }
  37 #endif
  38 
  39 #ifdef CONFIG_TICK_ONESHOT
  40 extern void tick_irq_enter(void);
  41 #  ifndef arch_needs_cpu
  42 #   define arch_needs_cpu() (0)
  43 #  endif
  44 # else
  45 static inline void tick_irq_enter(void) { }
  46 #endif
  47 
  48 #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT)
  49 extern void hotplug_cpu__broadcast_tick_pull(int dead_cpu);
  50 #else
  51 static inline void hotplug_cpu__broadcast_tick_pull(int dead_cpu) { }
  52 #endif
  53 
  54 enum tick_broadcast_mode {
  55         TICK_BROADCAST_OFF,
  56         TICK_BROADCAST_ON,
  57         TICK_BROADCAST_FORCE,
  58 };
  59 
  60 enum tick_broadcast_state {
  61         TICK_BROADCAST_EXIT,
  62         TICK_BROADCAST_ENTER,
  63 };
  64 
  65 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
  66 extern void tick_broadcast_control(enum tick_broadcast_mode mode);
  67 #else
  68 static inline void tick_broadcast_control(enum tick_broadcast_mode mode) { }
  69 #endif /* BROADCAST */
  70 
  71 #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_HOTPLUG_CPU)
  72 extern void tick_offline_cpu(unsigned int cpu);
  73 #else
  74 static inline void tick_offline_cpu(unsigned int cpu) { }
  75 #endif
  76 
  77 #ifdef CONFIG_GENERIC_CLOCKEVENTS
  78 extern int tick_broadcast_oneshot_control(enum tick_broadcast_state state);
  79 #else
  80 static inline int tick_broadcast_oneshot_control(enum tick_broadcast_state state)
  81 {
  82         return 0;
  83 }
  84 #endif
  85 
  86 static inline void tick_broadcast_enable(void)
  87 {
  88         tick_broadcast_control(TICK_BROADCAST_ON);
  89 }
  90 static inline void tick_broadcast_disable(void)
  91 {
  92         tick_broadcast_control(TICK_BROADCAST_OFF);
  93 }
  94 static inline void tick_broadcast_force(void)
  95 {
  96         tick_broadcast_control(TICK_BROADCAST_FORCE);
  97 }
  98 static inline int tick_broadcast_enter(void)
  99 {
 100         return tick_broadcast_oneshot_control(TICK_BROADCAST_ENTER);
 101 }
 102 static inline void tick_broadcast_exit(void)
 103 {
 104         tick_broadcast_oneshot_control(TICK_BROADCAST_EXIT);
 105 }
 106 
 107 enum tick_dep_bits {
 108         TICK_DEP_BIT_POSIX_TIMER        = 0,
 109         TICK_DEP_BIT_PERF_EVENTS        = 1,
 110         TICK_DEP_BIT_SCHED              = 2,
 111         TICK_DEP_BIT_CLOCK_UNSTABLE     = 3
 112 };
 113 
 114 #define TICK_DEP_MASK_NONE              0
 115 #define TICK_DEP_MASK_POSIX_TIMER       (1 << TICK_DEP_BIT_POSIX_TIMER)
 116 #define TICK_DEP_MASK_PERF_EVENTS       (1 << TICK_DEP_BIT_PERF_EVENTS)
 117 #define TICK_DEP_MASK_SCHED             (1 << TICK_DEP_BIT_SCHED)
 118 #define TICK_DEP_MASK_CLOCK_UNSTABLE    (1 << TICK_DEP_BIT_CLOCK_UNSTABLE)
 119 
 120 #ifdef CONFIG_NO_HZ_COMMON
 121 extern bool tick_nohz_enabled;
 122 extern bool tick_nohz_tick_stopped(void);
 123 extern bool tick_nohz_tick_stopped_cpu(int cpu);
 124 extern void tick_nohz_idle_stop_tick(void);
 125 extern void tick_nohz_idle_retain_tick(void);
 126 extern void tick_nohz_idle_restart_tick(void);
 127 extern void tick_nohz_idle_enter(void);
 128 extern void tick_nohz_idle_exit(void);
 129 extern void tick_nohz_irq_exit(void);
 130 extern bool tick_nohz_idle_got_tick(void);
 131 extern ktime_t tick_nohz_get_next_hrtimer(void);
 132 extern ktime_t tick_nohz_get_sleep_length(ktime_t *delta_next);
 133 extern unsigned long tick_nohz_get_idle_calls(void);
 134 extern unsigned long tick_nohz_get_idle_calls_cpu(int cpu);
 135 extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
 136 extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);
 137 
 138 static inline void tick_nohz_idle_stop_tick_protected(void)
 139 {
 140         local_irq_disable();
 141         tick_nohz_idle_stop_tick();
 142         local_irq_enable();
 143 }
 144 
 145 #else /* !CONFIG_NO_HZ_COMMON */
 146 #define tick_nohz_enabled (0)
 147 static inline int tick_nohz_tick_stopped(void) { return 0; }
 148 static inline int tick_nohz_tick_stopped_cpu(int cpu) { return 0; }
 149 static inline void tick_nohz_idle_stop_tick(void) { }
 150 static inline void tick_nohz_idle_retain_tick(void) { }
 151 static inline void tick_nohz_idle_restart_tick(void) { }
 152 static inline void tick_nohz_idle_enter(void) { }
 153 static inline void tick_nohz_idle_exit(void) { }
 154 static inline bool tick_nohz_idle_got_tick(void) { return false; }
 155 static inline ktime_t tick_nohz_get_next_hrtimer(void)
 156 {
 157         /* Next wake up is the tick period, assume it starts now */
 158         return ktime_add(ktime_get(), TICK_NSEC);
 159 }
 160 static inline ktime_t tick_nohz_get_sleep_length(ktime_t *delta_next)
 161 {
 162         *delta_next = TICK_NSEC;
 163         return *delta_next;
 164 }
 165 static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
 166 static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }
 167 
 168 static inline void tick_nohz_idle_stop_tick_protected(void) { }
 169 #endif /* !CONFIG_NO_HZ_COMMON */
 170 
 171 #ifdef CONFIG_NO_HZ_FULL
 172 extern bool tick_nohz_full_running;
 173 extern cpumask_var_t tick_nohz_full_mask;
 174 
 175 static inline bool tick_nohz_full_enabled(void)
 176 {
 177         if (!context_tracking_is_enabled())
 178                 return false;
 179 
 180         return tick_nohz_full_running;
 181 }
 182 
 183 static inline bool tick_nohz_full_cpu(int cpu)
 184 {
 185         if (!tick_nohz_full_enabled())
 186                 return false;
 187 
 188         return cpumask_test_cpu(cpu, tick_nohz_full_mask);
 189 }
 190 
 191 static inline void tick_nohz_full_add_cpus_to(struct cpumask *mask)
 192 {
 193         if (tick_nohz_full_enabled())
 194                 cpumask_or(mask, mask, tick_nohz_full_mask);
 195 }
 196 
 197 extern void tick_nohz_dep_set(enum tick_dep_bits bit);
 198 extern void tick_nohz_dep_clear(enum tick_dep_bits bit);
 199 extern void tick_nohz_dep_set_cpu(int cpu, enum tick_dep_bits bit);
 200 extern void tick_nohz_dep_clear_cpu(int cpu, enum tick_dep_bits bit);
 201 extern void tick_nohz_dep_set_task(struct task_struct *tsk,
 202                                    enum tick_dep_bits bit);
 203 extern void tick_nohz_dep_clear_task(struct task_struct *tsk,
 204                                      enum tick_dep_bits bit);
 205 extern void tick_nohz_dep_set_signal(struct signal_struct *signal,
 206                                      enum tick_dep_bits bit);
 207 extern void tick_nohz_dep_clear_signal(struct signal_struct *signal,
 208                                        enum tick_dep_bits bit);
 209 
 210 /*
 211  * The below are tick_nohz_[set,clear]_dep() wrappers that optimize off-cases
 212  * on top of static keys.
 213  */
 214 static inline void tick_dep_set(enum tick_dep_bits bit)
 215 {
 216         if (tick_nohz_full_enabled())
 217                 tick_nohz_dep_set(bit);
 218 }
 219 
 220 static inline void tick_dep_clear(enum tick_dep_bits bit)
 221 {
 222         if (tick_nohz_full_enabled())
 223                 tick_nohz_dep_clear(bit);
 224 }
 225 
 226 static inline void tick_dep_set_cpu(int cpu, enum tick_dep_bits bit)
 227 {
 228         if (tick_nohz_full_cpu(cpu))
 229                 tick_nohz_dep_set_cpu(cpu, bit);
 230 }
 231 
 232 static inline void tick_dep_clear_cpu(int cpu, enum tick_dep_bits bit)
 233 {
 234         if (tick_nohz_full_cpu(cpu))
 235                 tick_nohz_dep_clear_cpu(cpu, bit);
 236 }
 237 
 238 static inline void tick_dep_set_task(struct task_struct *tsk,
 239                                      enum tick_dep_bits bit)
 240 {
 241         if (tick_nohz_full_enabled())
 242                 tick_nohz_dep_set_task(tsk, bit);
 243 }
 244 static inline void tick_dep_clear_task(struct task_struct *tsk,
 245                                        enum tick_dep_bits bit)
 246 {
 247         if (tick_nohz_full_enabled())
 248                 tick_nohz_dep_clear_task(tsk, bit);
 249 }
 250 static inline void tick_dep_set_signal(struct signal_struct *signal,
 251                                        enum tick_dep_bits bit)
 252 {
 253         if (tick_nohz_full_enabled())
 254                 tick_nohz_dep_set_signal(signal, bit);
 255 }
 256 static inline void tick_dep_clear_signal(struct signal_struct *signal,
 257                                          enum tick_dep_bits bit)
 258 {
 259         if (tick_nohz_full_enabled())
 260                 tick_nohz_dep_clear_signal(signal, bit);
 261 }
 262 
 263 extern void tick_nohz_full_kick_cpu(int cpu);
 264 extern void __tick_nohz_task_switch(void);
 265 extern void __init tick_nohz_full_setup(cpumask_var_t cpumask);
 266 #else
 267 static inline bool tick_nohz_full_enabled(void) { return false; }
 268 static inline bool tick_nohz_full_cpu(int cpu) { return false; }
 269 static inline void tick_nohz_full_add_cpus_to(struct cpumask *mask) { }
 270 
 271 static inline void tick_dep_set(enum tick_dep_bits bit) { }
 272 static inline void tick_dep_clear(enum tick_dep_bits bit) { }
 273 static inline void tick_dep_set_cpu(int cpu, enum tick_dep_bits bit) { }
 274 static inline void tick_dep_clear_cpu(int cpu, enum tick_dep_bits bit) { }
 275 static inline void tick_dep_set_task(struct task_struct *tsk,
 276                                      enum tick_dep_bits bit) { }
 277 static inline void tick_dep_clear_task(struct task_struct *tsk,
 278                                        enum tick_dep_bits bit) { }
 279 static inline void tick_dep_set_signal(struct signal_struct *signal,
 280                                        enum tick_dep_bits bit) { }
 281 static inline void tick_dep_clear_signal(struct signal_struct *signal,
 282                                          enum tick_dep_bits bit) { }
 283 
 284 static inline void tick_nohz_full_kick_cpu(int cpu) { }
 285 static inline void __tick_nohz_task_switch(void) { }
 286 static inline void tick_nohz_full_setup(cpumask_var_t cpumask) { }
 287 #endif
 288 
 289 static inline void tick_nohz_task_switch(void)
 290 {
 291         if (tick_nohz_full_enabled())
 292                 __tick_nohz_task_switch();
 293 }
 294 
 295 #endif

/* [<][>][^][v][top][bottom][index][help] */