LCOV - code coverage report
Current view: top level - include/linux - hrtimer.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 20 21 95.2 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       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                 :            : #include <linux/percpu.h>
      24                 :            : #include <linux/timer.h>
      25                 :            : #include <linux/timerqueue.h>
      26                 :            : 
      27                 :            : struct hrtimer_clock_base;
      28                 :            : struct hrtimer_cpu_base;
      29                 :            : 
      30                 :            : /*
      31                 :            :  * Mode arguments of xxx_hrtimer functions:
      32                 :            :  */
      33                 :            : enum hrtimer_mode {
      34                 :            :         HRTIMER_MODE_ABS = 0x0,         /* Time value is absolute */
      35                 :            :         HRTIMER_MODE_REL = 0x1,         /* Time value is relative to now */
      36                 :            :         HRTIMER_MODE_PINNED = 0x02,     /* Timer is bound to CPU */
      37                 :            :         HRTIMER_MODE_ABS_PINNED = 0x02,
      38                 :            :         HRTIMER_MODE_REL_PINNED = 0x03,
      39                 :            : };
      40                 :            : 
      41                 :            : /*
      42                 :            :  * Return values for the callback function
      43                 :            :  */
      44                 :            : enum hrtimer_restart {
      45                 :            :         HRTIMER_NORESTART,      /* Timer is not restarted */
      46                 :            :         HRTIMER_RESTART,        /* Timer must be restarted */
      47                 :            : };
      48                 :            : 
      49                 :            : /*
      50                 :            :  * Values to track state of the timer
      51                 :            :  *
      52                 :            :  * Possible states:
      53                 :            :  *
      54                 :            :  * 0x00         inactive
      55                 :            :  * 0x01         enqueued into rbtree
      56                 :            :  * 0x02         callback function running
      57                 :            :  * 0x04         timer is migrated to another cpu
      58                 :            :  *
      59                 :            :  * Special cases:
      60                 :            :  * 0x03         callback function running and enqueued
      61                 :            :  *              (was requeued on another CPU)
      62                 :            :  * 0x05         timer was migrated on CPU hotunplug
      63                 :            :  *
      64                 :            :  * The "callback function running and enqueued" status is only possible on
      65                 :            :  * SMP. It happens for example when a posix timer expired and the callback
      66                 :            :  * queued a signal. Between dropping the lock which protects the posix timer
      67                 :            :  * and reacquiring the base lock of the hrtimer, another CPU can deliver the
      68                 :            :  * signal and rearm the timer. We have to preserve the callback running state,
      69                 :            :  * as otherwise the timer could be removed before the softirq code finishes the
      70                 :            :  * the handling of the timer.
      71                 :            :  *
      72                 :            :  * The HRTIMER_STATE_ENQUEUED bit is always or'ed to the current state
      73                 :            :  * to preserve the HRTIMER_STATE_CALLBACK in the above scenario. This
      74                 :            :  * also affects HRTIMER_STATE_MIGRATE where the preservation is not
      75                 :            :  * necessary. HRTIMER_STATE_MIGRATE is cleared after the timer is
      76                 :            :  * enqueued on the new cpu.
      77                 :            :  *
      78                 :            :  * All state transitions are protected by cpu_base->lock.
      79                 :            :  */
      80                 :            : #define HRTIMER_STATE_INACTIVE  0x00
      81                 :            : #define HRTIMER_STATE_ENQUEUED  0x01
      82                 :            : #define HRTIMER_STATE_CALLBACK  0x02
      83                 :            : #define HRTIMER_STATE_MIGRATE   0x04
      84                 :            : 
      85                 :            : /**
      86                 :            :  * struct hrtimer - the basic hrtimer structure
      87                 :            :  * @node:       timerqueue node, which also manages node.expires,
      88                 :            :  *              the absolute expiry time in the hrtimers internal
      89                 :            :  *              representation. The time is related to the clock on
      90                 :            :  *              which the timer is based. Is setup by adding
      91                 :            :  *              slack to the _softexpires value. For non range timers
      92                 :            :  *              identical to _softexpires.
      93                 :            :  * @_softexpires: the absolute earliest expiry time of the hrtimer.
      94                 :            :  *              The time which was given as expiry time when the timer
      95                 :            :  *              was armed.
      96                 :            :  * @function:   timer expiry callback function
      97                 :            :  * @base:       pointer to the timer base (per cpu and per clock)
      98                 :            :  * @state:      state information (See bit values above)
      99                 :            :  * @start_site: timer statistics field to store the site where the timer
     100                 :            :  *              was started
     101                 :            :  * @start_comm: timer statistics field to store the name of the process which
     102                 :            :  *              started the timer
     103                 :            :  * @start_pid: timer statistics field to store the pid of the task which
     104                 :            :  *              started the timer
     105                 :            :  *
     106                 :            :  * The hrtimer structure must be initialized by hrtimer_init()
     107                 :            :  */
     108                 :            : struct hrtimer {
     109                 :            :         struct timerqueue_node          node;
     110                 :            :         ktime_t                         _softexpires;
     111                 :            :         enum hrtimer_restart            (*function)(struct hrtimer *);
     112                 :            :         struct hrtimer_clock_base       *base;
     113                 :            :         unsigned long                   state;
     114                 :            : #ifdef CONFIG_TIMER_STATS
     115                 :            :         int                             start_pid;
     116                 :            :         void                            *start_site;
     117                 :            :         char                            start_comm[16];
     118                 :            : #endif
     119                 :            : };
     120                 :            : 
     121                 :            : /**
     122                 :            :  * struct hrtimer_sleeper - simple sleeper structure
     123                 :            :  * @timer:      embedded timer structure
     124                 :            :  * @task:       task to wake up
     125                 :            :  *
     126                 :            :  * task is set to NULL, when the timer expires.
     127                 :            :  */
     128                 :            : struct hrtimer_sleeper {
     129                 :            :         struct hrtimer timer;
     130                 :            :         struct task_struct *task;
     131                 :            : };
     132                 :            : 
     133                 :            : /**
     134                 :            :  * struct hrtimer_clock_base - the timer base for a specific clock
     135                 :            :  * @cpu_base:           per cpu clock base
     136                 :            :  * @index:              clock type index for per_cpu support when moving a
     137                 :            :  *                      timer to a base on another cpu.
     138                 :            :  * @clockid:            clock id for per_cpu support
     139                 :            :  * @active:             red black tree root node for the active timers
     140                 :            :  * @resolution:         the resolution of the clock, in nanoseconds
     141                 :            :  * @get_time:           function to retrieve the current time of the clock
     142                 :            :  * @softirq_time:       the time when running the hrtimer queue in the softirq
     143                 :            :  * @offset:             offset of this clock to the monotonic base
     144                 :            :  */
     145                 :            : struct hrtimer_clock_base {
     146                 :            :         struct hrtimer_cpu_base *cpu_base;
     147                 :            :         int                     index;
     148                 :            :         clockid_t               clockid;
     149                 :            :         struct timerqueue_head  active;
     150                 :            :         ktime_t                 resolution;
     151                 :            :         ktime_t                 (*get_time)(void);
     152                 :            :         ktime_t                 softirq_time;
     153                 :            :         ktime_t                 offset;
     154                 :            : };
     155                 :            : 
     156                 :            : enum  hrtimer_base_type {
     157                 :            :         HRTIMER_BASE_MONOTONIC,
     158                 :            :         HRTIMER_BASE_REALTIME,
     159                 :            :         HRTIMER_BASE_BOOTTIME,
     160                 :            :         HRTIMER_BASE_TAI,
     161                 :            :         HRTIMER_MAX_CLOCK_BASES,
     162                 :            : };
     163                 :            : 
     164                 :            : /*
     165                 :            :  * struct hrtimer_cpu_base - the per cpu clock bases
     166                 :            :  * @lock:               lock protecting the base and associated clock bases
     167                 :            :  *                      and timers
     168                 :            :  * @active_bases:       Bitfield to mark bases with active timers
     169                 :            :  * @clock_was_set:      Indicates that clock was set from irq context.
     170                 :            :  * @expires_next:       absolute time of the next event which was scheduled
     171                 :            :  *                      via clock_set_next_event()
     172                 :            :  * @hres_active:        State of high resolution mode
     173                 :            :  * @hang_detected:      The last hrtimer interrupt detected a hang
     174                 :            :  * @nr_events:          Total number of hrtimer interrupt events
     175                 :            :  * @nr_retries:         Total number of hrtimer interrupt retries
     176                 :            :  * @nr_hangs:           Total number of hrtimer interrupt hangs
     177                 :            :  * @max_hang_time:      Maximum time spent in hrtimer_interrupt
     178                 :            :  * @clock_base:         array of clock bases for this cpu
     179                 :            :  */
     180                 :            : struct hrtimer_cpu_base {
     181                 :            :         raw_spinlock_t                  lock;
     182                 :            :         unsigned int                    active_bases;
     183                 :            :         unsigned int                    clock_was_set;
     184                 :            : #ifdef CONFIG_HIGH_RES_TIMERS
     185                 :            :         ktime_t                         expires_next;
     186                 :            :         int                             hres_active;
     187                 :            :         int                             hang_detected;
     188                 :            :         unsigned long                   nr_events;
     189                 :            :         unsigned long                   nr_retries;
     190                 :            :         unsigned long                   nr_hangs;
     191                 :            :         ktime_t                         max_hang_time;
     192                 :            : #endif
     193                 :            :         struct hrtimer_clock_base       clock_base[HRTIMER_MAX_CLOCK_BASES];
     194                 :            : };
     195                 :            : 
     196                 :            : static inline void hrtimer_set_expires(struct hrtimer *timer, ktime_t time)
     197                 :            : {
     198                 :    1990063 :         timer->node.expires = time;
     199                 :    1990063 :         timer->_softexpires = time;
     200                 :            : }
     201                 :            : 
     202                 :            : static inline void hrtimer_set_expires_range(struct hrtimer *timer, ktime_t time, ktime_t delta)
     203                 :            : {
     204                 :            :         timer->_softexpires = time;
     205                 :            :         timer->node.expires = ktime_add_safe(time, delta);
     206                 :            : }
     207                 :            : 
     208                 :            : static inline void hrtimer_set_expires_range_ns(struct hrtimer *timer, ktime_t time, unsigned long delta)
     209                 :            : {
     210                 :    5500906 :         timer->_softexpires = time;
     211                 :    8015099 :         timer->node.expires = ktime_add_safe(time, ns_to_ktime(delta));
     212                 :            : }
     213                 :            : 
     214                 :            : static inline void hrtimer_set_expires_tv64(struct hrtimer *timer, s64 tv64)
     215                 :            : {
     216                 :          1 :         timer->node.expires.tv64 = tv64;
     217                 :          1 :         timer->_softexpires.tv64 = tv64;
     218                 :            : }
     219                 :            : 
     220                 :            : static inline void hrtimer_add_expires(struct hrtimer *timer, ktime_t time)
     221                 :            : {
     222                 :    8290378 :         timer->node.expires = ktime_add_safe(timer->node.expires, time);
     223                 :    8291324 :         timer->_softexpires = ktime_add_safe(timer->_softexpires, time);
     224                 :            : }
     225                 :            : 
     226                 :            : static inline void hrtimer_add_expires_ns(struct hrtimer *timer, u64 ns)
     227                 :            : {
     228                 :     209717 :         timer->node.expires = ktime_add_ns(timer->node.expires, ns);
     229                 :     209717 :         timer->_softexpires = ktime_add_ns(timer->_softexpires, ns);
     230                 :            : }
     231                 :            : 
     232                 :            : static inline ktime_t hrtimer_get_expires(const struct hrtimer *timer)
     233                 :            : {
     234                 :   32679099 :         return timer->node.expires;
     235                 :            : }
     236                 :            : 
     237                 :            : static inline ktime_t hrtimer_get_softexpires(const struct hrtimer *timer)
     238                 :            : {
     239                 :       3629 :         return timer->_softexpires;
     240                 :            : }
     241                 :            : 
     242                 :            : static inline s64 hrtimer_get_expires_tv64(const struct hrtimer *timer)
     243                 :            : {
     244                 :            :         return timer->node.expires.tv64;
     245                 :            : }
     246                 :            : static inline s64 hrtimer_get_softexpires_tv64(const struct hrtimer *timer)
     247                 :            : {
     248                 :            :         return timer->_softexpires.tv64;
     249                 :            : }
     250                 :            : 
     251                 :            : static inline s64 hrtimer_get_expires_ns(const struct hrtimer *timer)
     252                 :            : {
     253                 :            :         return ktime_to_ns(timer->node.expires);
     254                 :            : }
     255                 :            : 
     256                 :            : static inline ktime_t hrtimer_expires_remaining(const struct hrtimer *timer)
     257                 :            : {
     258                 :       5463 :         return ktime_sub(timer->node.expires, timer->base->get_time());
     259                 :            : }
     260                 :            : 
     261                 :            : #ifdef CONFIG_HIGH_RES_TIMERS
     262                 :            : struct clock_event_device;
     263                 :            : 
     264                 :            : extern void hrtimer_interrupt(struct clock_event_device *dev);
     265                 :            : 
     266                 :            : /*
     267                 :            :  * In high resolution mode the time reference must be read accurate
     268                 :            :  */
     269                 :            : static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
     270                 :            : {
     271                 :      10937 :         return timer->base->get_time();
     272                 :            : }
     273                 :            : 
     274                 :            : static inline int hrtimer_is_hres_active(struct hrtimer *timer)
     275                 :            : {
     276                 :          0 :         return timer->base->cpu_base->hres_active;
     277                 :            : }
     278                 :            : 
     279                 :            : extern void hrtimer_peek_ahead_timers(void);
     280                 :            : 
     281                 :            : /*
     282                 :            :  * The resolution of the clocks. The resolution value is returned in
     283                 :            :  * the clock_getres() system call to give application programmers an
     284                 :            :  * idea of the (in)accuracy of timers. Timer values are rounded up to
     285                 :            :  * this resolution values.
     286                 :            :  */
     287                 :            : # define HIGH_RES_NSEC          1
     288                 :            : # define KTIME_HIGH_RES         (ktime_t) { .tv64 = HIGH_RES_NSEC }
     289                 :            : # define MONOTONIC_RES_NSEC     HIGH_RES_NSEC
     290                 :            : # define KTIME_MONOTONIC_RES    KTIME_HIGH_RES
     291                 :            : 
     292                 :            : extern void clock_was_set_delayed(void);
     293                 :            : 
     294                 :            : #else
     295                 :            : 
     296                 :            : # define MONOTONIC_RES_NSEC     LOW_RES_NSEC
     297                 :            : # define KTIME_MONOTONIC_RES    KTIME_LOW_RES
     298                 :            : 
     299                 :            : static inline void hrtimer_peek_ahead_timers(void) { }
     300                 :            : 
     301                 :            : /*
     302                 :            :  * In non high resolution mode the time reference is taken from
     303                 :            :  * the base softirq time variable.
     304                 :            :  */
     305                 :            : static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
     306                 :            : {
     307                 :            :         return timer->base->softirq_time;
     308                 :            : }
     309                 :            : 
     310                 :            : static inline int hrtimer_is_hres_active(struct hrtimer *timer)
     311                 :            : {
     312                 :            :         return 0;
     313                 :            : }
     314                 :            : 
     315                 :            : static inline void clock_was_set_delayed(void) { }
     316                 :            : 
     317                 :            : #endif
     318                 :            : 
     319                 :            : extern void clock_was_set(void);
     320                 :            : #ifdef CONFIG_TIMERFD
     321                 :            : extern void timerfd_clock_was_set(void);
     322                 :            : #else
     323                 :            : static inline void timerfd_clock_was_set(void) { }
     324                 :            : #endif
     325                 :            : extern void hrtimers_resume(void);
     326                 :            : 
     327                 :            : extern ktime_t ktime_get(void);
     328                 :            : extern ktime_t ktime_get_real(void);
     329                 :            : extern ktime_t ktime_get_boottime(void);
     330                 :            : extern ktime_t ktime_get_monotonic_offset(void);
     331                 :            : extern ktime_t ktime_get_clocktai(void);
     332                 :            : extern ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot,
     333                 :            :                                          ktime_t *offs_tai);
     334                 :            : 
     335                 :            : DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
     336                 :            : 
     337                 :            : 
     338                 :            : /* Exported timer functions: */
     339                 :            : 
     340                 :            : /* Initialize timers: */
     341                 :            : extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
     342                 :            :                          enum hrtimer_mode mode);
     343                 :            : 
     344                 :            : #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
     345                 :            : extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock,
     346                 :            :                                   enum hrtimer_mode mode);
     347                 :            : 
     348                 :            : extern void destroy_hrtimer_on_stack(struct hrtimer *timer);
     349                 :            : #else
     350                 :            : static inline void hrtimer_init_on_stack(struct hrtimer *timer,
     351                 :            :                                          clockid_t which_clock,
     352                 :            :                                          enum hrtimer_mode mode)
     353                 :            : {
     354                 :     666078 :         hrtimer_init(timer, which_clock, mode);
     355                 :            : }
     356                 :            : static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { }
     357                 :            : #endif
     358                 :            : 
     359                 :            : /* Basic timer operations: */
     360                 :            : extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
     361                 :            :                          const enum hrtimer_mode mode);
     362                 :            : extern int hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
     363                 :            :                         unsigned long range_ns, const enum hrtimer_mode mode);
     364                 :            : extern int
     365                 :            : __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
     366                 :            :                          unsigned long delta_ns,
     367                 :            :                          const enum hrtimer_mode mode, int wakeup);
     368                 :            : 
     369                 :            : extern int hrtimer_cancel(struct hrtimer *timer);
     370                 :            : extern int hrtimer_try_to_cancel(struct hrtimer *timer);
     371                 :            : 
     372                 :            : static inline int hrtimer_start_expires(struct hrtimer *timer,
     373                 :            :                                                 enum hrtimer_mode mode)
     374                 :            : {
     375                 :            :         unsigned long delta;
     376                 :            :         ktime_t soft, hard;
     377                 :            :         soft = hrtimer_get_softexpires(timer);
     378                 :            :         hard = hrtimer_get_expires(timer);
     379                 :    2656131 :         delta = ktime_to_ns(ktime_sub(hard, soft));
     380                 :    2656135 :         return hrtimer_start_range_ns(timer, soft, delta, mode);
     381                 :            : }
     382                 :            : 
     383                 :            : static inline int hrtimer_restart(struct hrtimer *timer)
     384                 :            : {
     385                 :            :         return hrtimer_start_expires(timer, HRTIMER_MODE_ABS);
     386                 :            : }
     387                 :            : 
     388                 :            : /* Query timers: */
     389                 :            : extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer);
     390                 :            : extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
     391                 :            : 
     392                 :            : extern ktime_t hrtimer_get_next_event(void);
     393                 :            : 
     394                 :            : /*
     395                 :            :  * A timer is active, when it is enqueued into the rbtree or the
     396                 :            :  * callback function is running or it's in the state of being migrated
     397                 :            :  * to another cpu.
     398                 :            :  */
     399                 :            : static inline int hrtimer_active(const struct hrtimer *timer)
     400                 :            : {
     401                 :            :         return timer->state != HRTIMER_STATE_INACTIVE;
     402                 :            : }
     403                 :            : 
     404                 :            : /*
     405                 :            :  * Helper function to check, whether the timer is on one of the queues
     406                 :            :  */
     407                 :            : static inline int hrtimer_is_queued(struct hrtimer *timer)
     408                 :            : {
     409                 :    8651345 :         return timer->state & HRTIMER_STATE_ENQUEUED;
     410                 :            : }
     411                 :            : 
     412                 :            : /*
     413                 :            :  * Helper function to check, whether the timer is running the callback
     414                 :            :  * function
     415                 :            :  */
     416                 :            : static inline int hrtimer_callback_running(struct hrtimer *timer)
     417                 :            : {
     418                 :    8255115 :         return timer->state & HRTIMER_STATE_CALLBACK;
     419                 :            : }
     420                 :            : 
     421                 :            : /* Forward a hrtimer so it expires after now: */
     422                 :            : extern u64
     423                 :            : hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval);
     424                 :            : 
     425                 :            : /* Forward a hrtimer so it expires after the hrtimer's current now */
     426                 :            : static inline u64 hrtimer_forward_now(struct hrtimer *timer,
     427                 :            :                                       ktime_t interval)
     428                 :            : {
     429                 :         39 :         return hrtimer_forward(timer, timer->base->get_time(), interval);
     430                 :            : }
     431                 :            : 
     432                 :            : /* Precise sleep: */
     433                 :            : extern long hrtimer_nanosleep(struct timespec *rqtp,
     434                 :            :                               struct timespec __user *rmtp,
     435                 :            :                               const enum hrtimer_mode mode,
     436                 :            :                               const clockid_t clockid);
     437                 :            : extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);
     438                 :            : 
     439                 :            : extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
     440                 :            :                                  struct task_struct *tsk);
     441                 :            : 
     442                 :            : extern int schedule_hrtimeout_range(ktime_t *expires, unsigned long delta,
     443                 :            :                                                 const enum hrtimer_mode mode);
     444                 :            : extern int schedule_hrtimeout_range_clock(ktime_t *expires,
     445                 :            :                 unsigned long delta, const enum hrtimer_mode mode, int clock);
     446                 :            : extern int schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mode);
     447                 :            : 
     448                 :            : /* Soft interrupt function to run the hrtimer queues: */
     449                 :            : extern void hrtimer_run_queues(void);
     450                 :            : extern void hrtimer_run_pending(void);
     451                 :            : 
     452                 :            : /* Bootup initialization: */
     453                 :            : extern void __init hrtimers_init(void);
     454                 :            : 
     455                 :            : #if BITS_PER_LONG < 64
     456                 :            : extern u64 ktime_divns(const ktime_t kt, s64 div);
     457                 :            : #else /* BITS_PER_LONG < 64 */
     458                 :            : # define ktime_divns(kt, div)           (u64)((kt).tv64 / (div))
     459                 :            : #endif
     460                 :            : 
     461                 :            : /* Show pending timers: */
     462                 :            : extern void sysrq_timer_list_show(void);
     463                 :            : 
     464                 :            : #endif

Generated by: LCOV version 1.9