• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*  linux/include/linux/tick.h
2   *
3   *  This file contains the structure definitions for tick related functions
4   *
5   */
6  #ifndef _LINUX_TICK_H
7  #define _LINUX_TICK_H
8  
9  #include <linux/clockchips.h>
10  #include <linux/irqflags.h>
11  
12  #ifdef CONFIG_GENERIC_CLOCKEVENTS
13  
14  enum tick_device_mode {
15  	TICKDEV_MODE_PERIODIC,
16  	TICKDEV_MODE_ONESHOT,
17  };
18  
19  struct tick_device {
20  	struct clock_event_device *evtdev;
21  	enum tick_device_mode mode;
22  };
23  
24  enum tick_nohz_mode {
25  	NOHZ_MODE_INACTIVE,
26  	NOHZ_MODE_LOWRES,
27  	NOHZ_MODE_HIGHRES,
28  };
29  
30  /**
31   * struct tick_sched - sched tick emulation and no idle tick control/stats
32   * @sched_timer:	hrtimer to schedule the periodic tick in high
33   *			resolution mode
34   * @idle_tick:		Store the last idle tick expiry time when the tick
35   *			timer is modified for idle sleeps. This is necessary
36   *			to resume the tick timer operation in the timeline
37   *			when the CPU returns from idle
38   * @tick_stopped:	Indicator that the idle tick has been stopped
39   * @idle_jiffies:	jiffies at the entry to idle for idle time accounting
40   * @idle_calls:		Total number of idle calls
41   * @idle_sleeps:	Number of idle calls, where the sched tick was stopped
42   * @idle_entrytime:	Time when the idle call was entered
43   * @idle_waketime:	Time when the idle was interrupted
44   * @idle_exittime:	Time when the idle state was left
45   * @idle_sleeptime:	Sum of the time slept in idle with sched tick stopped
46   * @iowait_sleeptime:	Sum of the time slept in idle with sched tick stopped, with IO outstanding
47   * @sleep_length:	Duration of the current idle sleep
48   * @do_timer_lst:	CPU was the last one doing do_timer before going idle
49   */
50  struct tick_sched {
51  	struct hrtimer			sched_timer;
52  	unsigned long			check_clocks;
53  	enum tick_nohz_mode		nohz_mode;
54  	ktime_t				idle_tick;
55  	int				inidle;
56  	int				tick_stopped;
57  	unsigned long			idle_jiffies;
58  	unsigned long			idle_calls;
59  	unsigned long			idle_sleeps;
60  	int				idle_active;
61  	ktime_t				idle_entrytime;
62  	ktime_t				idle_waketime;
63  	ktime_t				idle_exittime;
64  	ktime_t				idle_sleeptime;
65  	ktime_t				iowait_sleeptime;
66  	ktime_t				sleep_length;
67  	unsigned long			last_jiffies;
68  	unsigned long			next_jiffies;
69  	ktime_t				idle_expires;
70  	int				do_timer_last;
71  };
72  
73  extern void __init tick_init(void);
74  extern int tick_is_oneshot_available(void);
75  extern struct tick_device *tick_get_device(int cpu);
76  
77  # ifdef CONFIG_HIGH_RES_TIMERS
78  extern int tick_init_highres(void);
79  extern int tick_program_event(ktime_t expires, int force);
80  extern void tick_setup_sched_timer(void);
81  # endif
82  
83  # if defined CONFIG_NO_HZ || defined CONFIG_HIGH_RES_TIMERS
84  extern void tick_cancel_sched_timer(int cpu);
85  # else
tick_cancel_sched_timer(int cpu)86  static inline void tick_cancel_sched_timer(int cpu) { }
87  # endif
88  
89  # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
90  extern struct tick_device *tick_get_broadcast_device(void);
91  extern struct cpumask *tick_get_broadcast_mask(void);
92  
93  #  ifdef CONFIG_TICK_ONESHOT
94  extern struct cpumask *tick_get_broadcast_oneshot_mask(void);
95  #  endif
96  
97  # endif /* BROADCAST */
98  
99  # ifdef CONFIG_TICK_ONESHOT
100  extern void tick_clock_notify(void);
101  extern int tick_check_oneshot_change(int allow_nohz);
102  extern struct tick_sched *tick_get_tick_sched(int cpu);
103  extern void tick_check_idle(int cpu);
104  extern int tick_oneshot_mode_active(void);
105  #  ifndef arch_needs_cpu
106  #   define arch_needs_cpu(cpu) (0)
107  #  endif
108  # else
tick_clock_notify(void)109  static inline void tick_clock_notify(void) { }
tick_check_oneshot_change(int allow_nohz)110  static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
tick_check_idle(int cpu)111  static inline void tick_check_idle(int cpu) { }
tick_oneshot_mode_active(void)112  static inline int tick_oneshot_mode_active(void) { return 0; }
113  # endif
114  
115  #else /* CONFIG_GENERIC_CLOCKEVENTS */
tick_init(void)116  static inline void tick_init(void) { }
tick_cancel_sched_timer(int cpu)117  static inline void tick_cancel_sched_timer(int cpu) { }
tick_clock_notify(void)118  static inline void tick_clock_notify(void) { }
tick_check_oneshot_change(int allow_nohz)119  static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
tick_check_idle(int cpu)120  static inline void tick_check_idle(int cpu) { }
tick_oneshot_mode_active(void)121  static inline int tick_oneshot_mode_active(void) { return 0; }
122  #endif /* !CONFIG_GENERIC_CLOCKEVENTS */
123  
124  # ifdef CONFIG_NO_HZ
125  extern void tick_nohz_idle_enter(void);
126  extern void tick_nohz_idle_exit(void);
127  extern void tick_nohz_irq_exit(void);
128  extern ktime_t tick_nohz_get_sleep_length(void);
129  extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
130  extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);
131  # else
tick_nohz_idle_enter(void)132  static inline void tick_nohz_idle_enter(void) { }
tick_nohz_idle_exit(void)133  static inline void tick_nohz_idle_exit(void) { }
134  
tick_nohz_get_sleep_length(void)135  static inline ktime_t tick_nohz_get_sleep_length(void)
136  {
137  	ktime_t len = { .tv64 = NSEC_PER_SEC/HZ };
138  
139  	return len;
140  }
get_cpu_idle_time_us(int cpu,u64 * unused)141  static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
get_cpu_iowait_time_us(int cpu,u64 * unused)142  static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }
143  # endif /* !NO_HZ */
144  
145  #endif
146