2015-03-25 13:07:37 +01:00
# ifndef _TICK_SCHED_H
# define _TICK_SCHED_H
# include <linux/hrtimer.h>
2015-03-25 13:11:52 +01:00
enum tick_device_mode {
TICKDEV_MODE_PERIODIC ,
TICKDEV_MODE_ONESHOT ,
} ;
struct tick_device {
struct clock_event_device * evtdev ;
enum tick_device_mode mode ;
} ;
2015-03-25 13:07:37 +01:00
enum tick_nohz_mode {
NOHZ_MODE_INACTIVE ,
NOHZ_MODE_LOWRES ,
NOHZ_MODE_HIGHRES ,
} ;
/**
* struct tick_sched - sched tick emulation and no idle tick control / stats
* @ sched_timer : hrtimer to schedule the periodic tick in high
* resolution mode
* @ last_tick : Store the last tick expiry time when the tick
* timer is modified for nohz sleeps . This is necessary
* to resume the tick timer operation in the timeline
* when the CPU returns from nohz sleep .
* @ tick_stopped : Indicator that the idle tick has been stopped
* @ idle_jiffies : jiffies at the entry to idle for idle time accounting
* @ idle_calls : Total number of idle calls
* @ idle_sleeps : Number of idle calls , where the sched tick was stopped
* @ idle_entrytime : Time when the idle call was entered
* @ idle_waketime : Time when the idle was interrupted
* @ idle_exittime : Time when the idle state was left
* @ idle_sleeptime : Sum of the time slept in idle with sched tick stopped
* @ iowait_sleeptime : Sum of the time slept in idle with sched tick stopped , with IO outstanding
* @ sleep_length : Duration of the current idle sleep
* @ do_timer_lst : CPU was the last one doing do_timer before going idle
*/
struct tick_sched {
struct hrtimer sched_timer ;
unsigned long check_clocks ;
enum tick_nohz_mode nohz_mode ;
ktime_t last_tick ;
int inidle ;
int tick_stopped ;
unsigned long idle_jiffies ;
unsigned long idle_calls ;
unsigned long idle_sleeps ;
int idle_active ;
ktime_t idle_entrytime ;
ktime_t idle_waketime ;
ktime_t idle_exittime ;
ktime_t idle_sleeptime ;
ktime_t iowait_sleeptime ;
ktime_t sleep_length ;
unsigned long last_jiffies ;
2015-04-14 21:08:58 +00:00
u64 next_timer ;
2015-03-25 13:07:37 +01:00
ktime_t idle_expires ;
int do_timer_last ;
2016-03-24 15:38:00 +01:00
atomic_t tick_dep_mask ;
2015-03-25 13:07:37 +01:00
} ;
extern struct tick_sched * tick_get_tick_sched ( int cpu ) ;
extern void tick_setup_sched_timer ( void ) ;
# if defined CONFIG_NO_HZ_COMMON || defined CONFIG_HIGH_RES_TIMERS
extern void tick_cancel_sched_timer ( int cpu ) ;
# else
static inline void tick_cancel_sched_timer ( int cpu ) { }
# endif
2015-07-07 16:29:38 +02:00
# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
extern int __tick_broadcast_oneshot_control ( enum tick_broadcast_state state ) ;
# else
static inline int
__tick_broadcast_oneshot_control ( enum tick_broadcast_state state )
{
return - EBUSY ;
}
# endif
2015-03-25 13:07:37 +01:00
# endif