linux/include/linux/tick.h
<<
>>
Prefs
   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
  14enum tick_device_mode {
  15        TICKDEV_MODE_PERIODIC,
  16        TICKDEV_MODE_ONESHOT,
  17};
  18
  19struct tick_device {
  20        struct clock_event_device *evtdev;
  21        enum tick_device_mode mode;
  22};
  23
  24enum 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 * @last_tick:          Store the last tick expiry time when the tick
  35 *                      timer is modified for nohz sleeps. This is necessary
  36 *                      to resume the tick timer operation in the timeline
  37 *                      when the CPU returns from nohz sleep.
  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 */
  50struct tick_sched {
  51        struct hrtimer                  sched_timer;
  52        unsigned long                   check_clocks;
  53        enum tick_nohz_mode             nohz_mode;
  54        ktime_t                         last_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
  73extern void __init tick_init(void);
  74extern int tick_is_oneshot_available(void);
  75extern struct tick_device *tick_get_device(int cpu);
  76
  77# ifdef CONFIG_HIGH_RES_TIMERS
  78extern int tick_init_highres(void);
  79extern int tick_program_event(ktime_t expires, int force);
  80extern void tick_setup_sched_timer(void);
  81# endif
  82
  83# if defined CONFIG_NO_HZ || defined CONFIG_HIGH_RES_TIMERS
  84extern void tick_cancel_sched_timer(int cpu);
  85# else
  86static inline void tick_cancel_sched_timer(int cpu) { }
  87# endif
  88
  89# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
  90extern struct tick_device *tick_get_broadcast_device(void);
  91extern struct cpumask *tick_get_broadcast_mask(void);
  92
  93#  ifdef CONFIG_TICK_ONESHOT
  94extern struct cpumask *tick_get_broadcast_oneshot_mask(void);
  95#  endif
  96
  97# endif /* BROADCAST */
  98
  99# ifdef CONFIG_TICK_ONESHOT
 100extern void tick_clock_notify(void);
 101extern int tick_check_oneshot_change(int allow_nohz);
 102extern struct tick_sched *tick_get_tick_sched(int cpu);
 103extern void tick_check_idle(int cpu);
 104extern int tick_oneshot_mode_active(void);
 105#  ifndef arch_needs_cpu
 106#   define arch_needs_cpu(cpu) (0)
 107#  endif
 108# else
 109static inline void tick_clock_notify(void) { }
 110static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
 111static inline void tick_check_idle(int cpu) { }
 112static inline int tick_oneshot_mode_active(void) { return 0; }
 113# endif
 114
 115#else /* CONFIG_GENERIC_CLOCKEVENTS */
 116static inline void tick_init(void) { }
 117static inline void tick_cancel_sched_timer(int cpu) { }
 118static inline void tick_clock_notify(void) { }
 119static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
 120static inline void tick_check_idle(int cpu) { }
 121static inline int tick_oneshot_mode_active(void) { return 0; }
 122#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
 123
 124# ifdef CONFIG_NO_HZ
 125extern void tick_nohz_idle_enter(void);
 126extern void tick_nohz_idle_exit(void);
 127extern void tick_nohz_irq_exit(void);
 128extern ktime_t tick_nohz_get_sleep_length(void);
 129extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
 130extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);
 131# else
 132static inline void tick_nohz_idle_enter(void) { }
 133static inline void tick_nohz_idle_exit(void) { }
 134
 135static inline ktime_t tick_nohz_get_sleep_length(void)
 136{
 137        ktime_t len = { .tv64 = NSEC_PER_SEC/HZ };
 138
 139        return len;
 140}
 141static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
 142static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }
 143# endif /* !NO_HZ */
 144
 145#endif
 146