linux/include/linux/tick.h
<<
>>
Prefs
   1/*
   2 * Tick related global functions
   3 */
   4#ifndef _LINUX_TICK_H
   5#define _LINUX_TICK_H
   6
   7#include <linux/clockchips.h>
   8#include <linux/irqflags.h>
   9#include <linux/percpu.h>
  10#include <linux/context_tracking_state.h>
  11#include <linux/cpumask.h>
  12#include <linux/sched.h>
  13
  14#ifdef CONFIG_GENERIC_CLOCKEVENTS
  15extern void __init tick_init(void);
  16extern void tick_freeze(void);
  17extern void tick_unfreeze(void);
  18/* Should be core only, but ARM BL switcher requires it */
  19extern void tick_suspend_local(void);
  20/* Should be core only, but XEN resume magic and ARM BL switcher require it */
  21extern void tick_resume_local(void);
  22extern void tick_handover_do_timer(void);
  23extern void tick_cleanup_dead_cpu(int cpu);
  24#else /* CONFIG_GENERIC_CLOCKEVENTS */
  25static inline void tick_init(void) { }
  26static inline void tick_freeze(void) { }
  27static inline void tick_unfreeze(void) { }
  28static inline void tick_suspend_local(void) { }
  29static inline void tick_resume_local(void) { }
  30static inline void tick_handover_do_timer(void) { }
  31static inline void tick_cleanup_dead_cpu(int cpu) { }
  32#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
  33
  34#ifdef CONFIG_TICK_ONESHOT
  35extern void tick_irq_enter(void);
  36#  ifndef arch_needs_cpu
  37#   define arch_needs_cpu() (0)
  38#  endif
  39# else
  40static inline void tick_irq_enter(void) { }
  41#endif
  42
  43#if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT)
  44extern void hotplug_cpu__broadcast_tick_pull(int dead_cpu);
  45#else
  46static inline void hotplug_cpu__broadcast_tick_pull(int dead_cpu) { }
  47#endif
  48
  49enum tick_broadcast_mode {
  50        TICK_BROADCAST_OFF,
  51        TICK_BROADCAST_ON,
  52        TICK_BROADCAST_FORCE,
  53};
  54
  55enum tick_broadcast_state {
  56        TICK_BROADCAST_EXIT,
  57        TICK_BROADCAST_ENTER,
  58};
  59
  60#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
  61extern void tick_broadcast_control(enum tick_broadcast_mode mode);
  62#else
  63static inline void tick_broadcast_control(enum tick_broadcast_mode mode) { }
  64#endif /* BROADCAST */
  65
  66#if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT)
  67extern int tick_broadcast_oneshot_control(enum tick_broadcast_state state);
  68#else
  69static inline int tick_broadcast_oneshot_control(enum tick_broadcast_state state) { return 0; }
  70#endif
  71
  72static inline void tick_broadcast_enable(void)
  73{
  74        tick_broadcast_control(TICK_BROADCAST_ON);
  75}
  76static inline void tick_broadcast_disable(void)
  77{
  78        tick_broadcast_control(TICK_BROADCAST_OFF);
  79}
  80static inline void tick_broadcast_force(void)
  81{
  82        tick_broadcast_control(TICK_BROADCAST_FORCE);
  83}
  84static inline int tick_broadcast_enter(void)
  85{
  86        return tick_broadcast_oneshot_control(TICK_BROADCAST_ENTER);
  87}
  88static inline void tick_broadcast_exit(void)
  89{
  90        tick_broadcast_oneshot_control(TICK_BROADCAST_EXIT);
  91}
  92
  93#ifdef CONFIG_NO_HZ_COMMON
  94extern int tick_nohz_tick_stopped(void);
  95extern void tick_nohz_idle_enter(void);
  96extern void tick_nohz_idle_exit(void);
  97extern void tick_nohz_irq_exit(void);
  98extern ktime_t tick_nohz_get_sleep_length(void);
  99extern u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time);
 100extern u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time);
 101#else /* !CONFIG_NO_HZ_COMMON */
 102static inline int tick_nohz_tick_stopped(void) { return 0; }
 103static inline void tick_nohz_idle_enter(void) { }
 104static inline void tick_nohz_idle_exit(void) { }
 105
 106static inline ktime_t tick_nohz_get_sleep_length(void)
 107{
 108        ktime_t len = { .tv64 = NSEC_PER_SEC/HZ };
 109
 110        return len;
 111}
 112static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
 113static inline u64 get_cpu_iowait_time_us(int cpu, u64 *unused) { return -1; }
 114#endif /* !CONFIG_NO_HZ_COMMON */
 115
 116#ifdef CONFIG_NO_HZ_FULL
 117extern bool tick_nohz_full_running;
 118extern cpumask_var_t tick_nohz_full_mask;
 119extern cpumask_var_t housekeeping_mask;
 120
 121static inline bool tick_nohz_full_enabled(void)
 122{
 123        if (!context_tracking_is_enabled())
 124                return false;
 125
 126        return tick_nohz_full_running;
 127}
 128
 129static inline bool tick_nohz_full_cpu(int cpu)
 130{
 131        if (!tick_nohz_full_enabled())
 132                return false;
 133
 134        return cpumask_test_cpu(cpu, tick_nohz_full_mask);
 135}
 136
 137extern void __tick_nohz_full_check(void);
 138extern void tick_nohz_full_kick(void);
 139extern void tick_nohz_full_kick_cpu(int cpu);
 140extern void tick_nohz_full_kick_all(void);
 141extern void __tick_nohz_task_switch(struct task_struct *tsk);
 142#else
 143static inline bool tick_nohz_full_enabled(void) { return false; }
 144static inline bool tick_nohz_full_cpu(int cpu) { return false; }
 145static inline void __tick_nohz_full_check(void) { }
 146static inline void tick_nohz_full_kick_cpu(int cpu) { }
 147static inline void tick_nohz_full_kick(void) { }
 148static inline void tick_nohz_full_kick_all(void) { }
 149static inline void __tick_nohz_task_switch(struct task_struct *tsk) { }
 150#endif
 151
 152static inline bool is_housekeeping_cpu(int cpu)
 153{
 154#ifdef CONFIG_NO_HZ_FULL
 155        if (tick_nohz_full_enabled())
 156                return cpumask_test_cpu(cpu, housekeeping_mask);
 157#endif
 158        return true;
 159}
 160
 161static inline void housekeeping_affine(struct task_struct *t)
 162{
 163#ifdef CONFIG_NO_HZ_FULL
 164        if (tick_nohz_full_enabled())
 165                set_cpus_allowed_ptr(t, housekeeping_mask);
 166
 167#endif
 168}
 169
 170static inline void tick_nohz_full_check(void)
 171{
 172        if (tick_nohz_full_enabled())
 173                __tick_nohz_full_check();
 174}
 175
 176static inline void tick_nohz_task_switch(struct task_struct *tsk)
 177{
 178        if (tick_nohz_full_enabled())
 179                __tick_nohz_task_switch(tsk);
 180}
 181
 182#endif
 183