linux/include/linux/hrtimer.h
<<
>>
Prefs
   1/*
   2 *  include/linux/hrtimer.h
   3 *
   4 *  hrtimers - High-resolution kernel timers
   5 *
   6 *   Copyright(C) 2005, Thomas Gleixner <tglx@linutronix.de>
   7 *   Copyright(C) 2005, Red Hat, Inc., Ingo Molnar
   8 *
   9 *  data type definitions, declarations, prototypes
  10 *
  11 *  Started by: Thomas Gleixner and Ingo Molnar
  12 *
  13 *  For licencing details see kernel-base/COPYING
  14 */
  15#ifndef _LINUX_HRTIMER_H
  16#define _LINUX_HRTIMER_H
  17
  18#include <linux/rbtree.h>
  19#include <linux/ktime.h>
  20#include <linux/init.h>
  21#include <linux/list.h>
  22#include <linux/wait.h>
  23
  24struct hrtimer_clock_base;
  25struct hrtimer_cpu_base;
  26
  27/*
  28 * Mode arguments of xxx_hrtimer functions:
  29 */
  30enum hrtimer_mode {
  31        HRTIMER_MODE_ABS,       /* Time value is absolute */
  32        HRTIMER_MODE_REL,       /* Time value is relative to now */
  33};
  34
  35/*
  36 * Return values for the callback function
  37 */
  38enum hrtimer_restart {
  39        HRTIMER_NORESTART,      /* Timer is not restarted */
  40        HRTIMER_RESTART,        /* Timer must be restarted */
  41};
  42
  43/*
  44 * hrtimer callback modes:
  45 *
  46 *      HRTIMER_CB_SOFTIRQ:             Callback must run in softirq context
  47 *      HRTIMER_CB_IRQSAFE:             Callback may run in hardirq context
  48 *      HRTIMER_CB_IRQSAFE_NO_RESTART:  Callback may run in hardirq context and
  49 *                                      does not restart the timer
  50 *      HRTIMER_CB_IRQSAFE_NO_SOFTIRQ:  Callback must run in hardirq context
  51 *                                      Special mode for tick emultation
  52 */
  53enum hrtimer_cb_mode {
  54        HRTIMER_CB_SOFTIRQ,
  55        HRTIMER_CB_IRQSAFE,
  56        HRTIMER_CB_IRQSAFE_NO_RESTART,
  57        HRTIMER_CB_IRQSAFE_NO_SOFTIRQ,
  58};
  59
  60/*
  61 * Values to track state of the timer
  62 *
  63 * Possible states:
  64 *
  65 * 0x00         inactive
  66 * 0x01         enqueued into rbtree
  67 * 0x02         callback function running
  68 * 0x04         callback pending (high resolution mode)
  69 *
  70 * Special case:
  71 * 0x03         callback function running and enqueued
  72 *              (was requeued on another CPU)
  73 * The "callback function running and enqueued" status is only possible on
  74 * SMP. It happens for example when a posix timer expired and the callback
  75 * queued a signal. Between dropping the lock which protects the posix timer
  76 * and reacquiring the base lock of the hrtimer, another CPU can deliver the
  77 * signal and rearm the timer. We have to preserve the callback running state,
  78 * as otherwise the timer could be removed before the softirq code finishes the
  79 * the handling of the timer.
  80 *
  81 * The HRTIMER_STATE_ENQUEUE bit is always or'ed to the current state to
  82 * preserve the HRTIMER_STATE_CALLBACK bit in the above scenario.
  83 *
  84 * All state transitions are protected by cpu_base->lock.
  85 */
  86#define HRTIMER_STATE_INACTIVE  0x00
  87#define HRTIMER_STATE_ENQUEUED  0x01
  88#define HRTIMER_STATE_CALLBACK  0x02
  89#define HRTIMER_STATE_PENDING   0x04
  90
  91/**
  92 * struct hrtimer - the basic hrtimer structure
  93 * @node:       red black tree node for time ordered insertion
  94 * @expires:    the absolute expiry time in the hrtimers internal
  95 *              representation. The time is related to the clock on
  96 *              which the timer is based.
  97 * @function:   timer expiry callback function
  98 * @base:       pointer to the timer base (per cpu and per clock)
  99 * @state:      state information (See bit values above)
 100 * @cb_mode:    high resolution timer feature to select the callback execution
 101 *               mode
 102 * @cb_entry:   list head to enqueue an expired timer into the callback list
 103 * @start_site: timer statistics field to store the site where the timer
 104 *              was started
 105 * @start_comm: timer statistics field to store the name of the process which
 106 *              started the timer
 107 * @start_pid: timer statistics field to store the pid of the task which
 108 *              started the timer
 109 *
 110 * The hrtimer structure must be initialized by hrtimer_init()
 111 */
 112struct hrtimer {
 113        struct rb_node                  node;
 114        ktime_t                         expires;
 115        enum hrtimer_restart            (*function)(struct hrtimer *);
 116        struct hrtimer_clock_base       *base;
 117        unsigned long                   state;
 118#ifdef CONFIG_HIGH_RES_TIMERS
 119        enum hrtimer_cb_mode            cb_mode;
 120        struct list_head                cb_entry;
 121#endif
 122#ifdef CONFIG_TIMER_STATS
 123        void                            *start_site;
 124        char                            start_comm[16];
 125        int                             start_pid;
 126#endif
 127};
 128
 129/**
 130 * struct hrtimer_sleeper - simple sleeper structure
 131 * @timer:      embedded timer structure
 132 * @task:       task to wake up
 133 *
 134 * task is set to NULL, when the timer expires.
 135 */
 136struct hrtimer_sleeper {
 137        struct hrtimer timer;
 138        struct task_struct *task;
 139};
 140
 141/**
 142 * struct hrtimer_clock_base - the timer base for a specific clock
 143 * @cpu_base:           per cpu clock base
 144 * @index:              clock type index for per_cpu support when moving a
 145 *                      timer to a base on another cpu.
 146 * @active:             red black tree root node for the active timers
 147 * @first:              pointer to the timer node which expires first
 148 * @resolution:         the resolution of the clock, in nanoseconds
 149 * @get_time:           function to retrieve the current time of the clock
 150 * @get_softirq_time:   function to retrieve the current time from the softirq
 151 * @softirq_time:       the time when running the hrtimer queue in the softirq
 152 * @cb_pending:         list of timers where the callback is pending
 153 * @offset:             offset of this clock to the monotonic base
 154 * @reprogram:          function to reprogram the timer event
 155 */
 156struct hrtimer_clock_base {
 157        struct hrtimer_cpu_base *cpu_base;
 158        clockid_t               index;
 159        struct rb_root          active;
 160        struct rb_node          *first;
 161        ktime_t                 resolution;
 162        ktime_t                 (*get_time)(void);
 163        ktime_t                 (*get_softirq_time)(void);
 164        ktime_t                 softirq_time;
 165#ifdef CONFIG_HIGH_RES_TIMERS
 166        ktime_t                 offset;
 167        int                     (*reprogram)(struct hrtimer *t,
 168                                             struct hrtimer_clock_base *b,
 169                                             ktime_t n);
 170#endif
 171};
 172
 173#define HRTIMER_MAX_CLOCK_BASES 2
 174
 175/*
 176 * struct hrtimer_cpu_base - the per cpu clock bases
 177 * @lock:               lock protecting the base and associated clock bases
 178 *                      and timers
 179 * @lock_key:           the lock_class_key for use with lockdep
 180 * @clock_base:         array of clock bases for this cpu
 181 * @curr_timer:         the timer which is executing a callback right now
 182 * @expires_next:       absolute time of the next event which was scheduled
 183 *                      via clock_set_next_event()
 184 * @hres_active:        State of high resolution mode
 185 * @check_clocks:       Indictator, when set evaluate time source and clock
 186 *                      event devices whether high resolution mode can be
 187 *                      activated.
 188 * @cb_pending:         Expired timers are moved from the rbtree to this
 189 *                      list in the timer interrupt. The list is processed
 190 *                      in the softirq.
 191 * @nr_events:          Total number of timer interrupt events
 192 */
 193struct hrtimer_cpu_base {
 194        spinlock_t                      lock;
 195        struct lock_class_key           lock_key;
 196        struct hrtimer_clock_base       clock_base[HRTIMER_MAX_CLOCK_BASES];
 197#ifdef CONFIG_HIGH_RES_TIMERS
 198        ktime_t                         expires_next;
 199        int                             hres_active;
 200        struct list_head                cb_pending;
 201        unsigned long                   nr_events;
 202#endif
 203};
 204
 205#ifdef CONFIG_HIGH_RES_TIMERS
 206struct clock_event_device;
 207
 208extern void clock_was_set(void);
 209extern void hres_timers_resume(void);
 210extern void hrtimer_interrupt(struct clock_event_device *dev);
 211
 212/*
 213 * In high resolution mode the time reference must be read accurate
 214 */
 215static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
 216{
 217        return timer->base->get_time();
 218}
 219
 220/*
 221 * The resolution of the clocks. The resolution value is returned in
 222 * the clock_getres() system call to give application programmers an
 223 * idea of the (in)accuracy of timers. Timer values are rounded up to
 224 * this resolution values.
 225 */
 226# define KTIME_HIGH_RES         (ktime_t) { .tv64 = 1 }
 227# define KTIME_MONOTONIC_RES    KTIME_HIGH_RES
 228
 229#else
 230
 231# define KTIME_MONOTONIC_RES    KTIME_LOW_RES
 232
 233/*
 234 * clock_was_set() is a NOP for non- high-resolution systems. The
 235 * time-sorted order guarantees that a timer does not expire early and
 236 * is expired in the next softirq when the clock was advanced.
 237 */
 238static inline void clock_was_set(void) { }
 239
 240static inline void hres_timers_resume(void) { }
 241
 242/*
 243 * In non high resolution mode the time reference is taken from
 244 * the base softirq time variable.
 245 */
 246static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
 247{
 248        return timer->base->softirq_time;
 249}
 250
 251#endif
 252
 253extern ktime_t ktime_get(void);
 254extern ktime_t ktime_get_real(void);
 255
 256/* Exported timer functions: */
 257
 258/* Initialize timers: */
 259extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
 260                         enum hrtimer_mode mode);
 261
 262/* Basic timer operations: */
 263extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
 264                         const enum hrtimer_mode mode);
 265extern int hrtimer_cancel(struct hrtimer *timer);
 266extern int hrtimer_try_to_cancel(struct hrtimer *timer);
 267
 268static inline int hrtimer_restart(struct hrtimer *timer)
 269{
 270        return hrtimer_start(timer, timer->expires, HRTIMER_MODE_ABS);
 271}
 272
 273/* Query timers: */
 274extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer);
 275extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
 276
 277extern ktime_t hrtimer_get_next_event(void);
 278
 279/*
 280 * A timer is active, when it is enqueued into the rbtree or the callback
 281 * function is running.
 282 */
 283static inline int hrtimer_active(const struct hrtimer *timer)
 284{
 285        return timer->state != HRTIMER_STATE_INACTIVE;
 286}
 287
 288/*
 289 * Helper function to check, whether the timer is on one of the queues
 290 */
 291static inline int hrtimer_is_queued(struct hrtimer *timer)
 292{
 293        return timer->state &
 294                (HRTIMER_STATE_ENQUEUED | HRTIMER_STATE_PENDING);
 295}
 296
 297/* Forward a hrtimer so it expires after now: */
 298extern unsigned long
 299hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval);
 300
 301/* Precise sleep: */
 302extern long hrtimer_nanosleep(struct timespec *rqtp,
 303                              struct timespec *rmtp,
 304                              const enum hrtimer_mode mode,
 305                              const clockid_t clockid);
 306extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);
 307
 308extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
 309                                 struct task_struct *tsk);
 310
 311/* Soft interrupt function to run the hrtimer queues: */
 312extern void hrtimer_run_queues(void);
 313
 314/* Bootup initialization: */
 315extern void __init hrtimers_init(void);
 316
 317#if BITS_PER_LONG < 64
 318extern unsigned long ktime_divns(const ktime_t kt, s64 div);
 319#else /* BITS_PER_LONG < 64 */
 320# define ktime_divns(kt, div)           (unsigned long)((kt).tv64 / (div))
 321#endif
 322
 323/* Show pending timers: */
 324extern void sysrq_timer_list_show(void);
 325
 326/*
 327 * Timer-statistics info:
 328 */
 329#ifdef CONFIG_TIMER_STATS
 330
 331extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
 332                                     void *timerf, char *comm,
 333                                     unsigned int timer_flag);
 334
 335static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
 336{
 337        timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
 338                                 timer->function, timer->start_comm, 0);
 339}
 340
 341extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer,
 342                                                 void *addr);
 343
 344static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
 345{
 346        __timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0));
 347}
 348
 349static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
 350{
 351        timer->start_site = NULL;
 352}
 353#else
 354static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
 355{
 356}
 357
 358static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
 359{
 360}
 361
 362static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
 363{
 364}
 365#endif
 366
 367#endif
 368
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.