linux/include/linux/timer.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_TIMER_H
   3#define _LINUX_TIMER_H
   4
   5#include <linux/list.h>
   6#include <linux/ktime.h>
   7#include <linux/stddef.h>
   8#include <linux/debugobjects.h>
   9#include <linux/stringify.h>
  10
  11struct timer_list {
  12        /*
  13         * All fields that change during normal runtime grouped to the
  14         * same cacheline
  15         */
  16        struct hlist_node       entry;
  17        unsigned long           expires;
  18        void                    (*function)(struct timer_list *);
  19        u32                     flags;
  20
  21#ifdef CONFIG_LOCKDEP
  22        struct lockdep_map      lockdep_map;
  23#endif
  24};
  25
  26#ifdef CONFIG_LOCKDEP
  27/*
  28 * NB: because we have to copy the lockdep_map, setting the lockdep_map key
  29 * (second argument) here is required, otherwise it could be initialised to
  30 * the copy of the lockdep_map later! We use the pointer to and the string
  31 * "<file>:<line>" as the key resp. the name of the lockdep_map.
  32 */
  33#define __TIMER_LOCKDEP_MAP_INITIALIZER(_kn)                            \
  34        .lockdep_map = STATIC_LOCKDEP_MAP_INIT(_kn, &_kn),
  35#else
  36#define __TIMER_LOCKDEP_MAP_INITIALIZER(_kn)
  37#endif
  38
  39/*
  40 * A deferrable timer will work normally when the system is busy, but
  41 * will not cause a CPU to come out of idle just to service it; instead,
  42 * the timer will be serviced when the CPU eventually wakes up with a
  43 * subsequent non-deferrable timer.
  44 *
  45 * An irqsafe timer is executed with IRQ disabled and it's safe to wait for
  46 * the completion of the running instance from IRQ handlers, for example,
  47 * by calling del_timer_sync().
  48 *
  49 * Note: The irq disabled callback execution is a special case for
  50 * workqueue locking issues. It's not meant for executing random crap
  51 * with interrupts disabled. Abuse is monitored!
  52 */
  53#define TIMER_CPUMASK           0x0003FFFF
  54#define TIMER_MIGRATING         0x00040000
  55#define TIMER_BASEMASK          (TIMER_CPUMASK | TIMER_MIGRATING)
  56#define TIMER_DEFERRABLE        0x00080000
  57#define TIMER_PINNED            0x00100000
  58#define TIMER_IRQSAFE           0x00200000
  59#define TIMER_ARRAYSHIFT        22
  60#define TIMER_ARRAYMASK         0xFFC00000
  61
  62#define TIMER_TRACE_FLAGMASK    (TIMER_MIGRATING | TIMER_DEFERRABLE | TIMER_PINNED | TIMER_IRQSAFE)
  63
  64#define __TIMER_INITIALIZER(_function, _flags) {                \
  65                .entry = { .next = TIMER_ENTRY_STATIC },        \
  66                .function = (_function),                        \
  67                .flags = (_flags),                              \
  68                __TIMER_LOCKDEP_MAP_INITIALIZER(                \
  69                        __FILE__ ":" __stringify(__LINE__))     \
  70        }
  71
  72#define DEFINE_TIMER(_name, _function)                          \
  73        struct timer_list _name =                               \
  74                __TIMER_INITIALIZER(_function, 0)
  75
  76/*
  77 * LOCKDEP and DEBUG timer interfaces.
  78 */
  79void init_timer_key(struct timer_list *timer,
  80                    void (*func)(struct timer_list *), unsigned int flags,
  81                    const char *name, struct lock_class_key *key);
  82
  83#ifdef CONFIG_DEBUG_OBJECTS_TIMERS
  84extern void init_timer_on_stack_key(struct timer_list *timer,
  85                                    void (*func)(struct timer_list *),
  86                                    unsigned int flags, const char *name,
  87                                    struct lock_class_key *key);
  88#else
  89static inline void init_timer_on_stack_key(struct timer_list *timer,
  90                                           void (*func)(struct timer_list *),
  91                                           unsigned int flags,
  92                                           const char *name,
  93                                           struct lock_class_key *key)
  94{
  95        init_timer_key(timer, func, flags, name, key);
  96}
  97#endif
  98
  99#ifdef CONFIG_LOCKDEP
 100#define __init_timer(_timer, _fn, _flags)                               \
 101        do {                                                            \
 102                static struct lock_class_key __key;                     \
 103                init_timer_key((_timer), (_fn), (_flags), #_timer, &__key);\
 104        } while (0)
 105
 106#define __init_timer_on_stack(_timer, _fn, _flags)                      \
 107        do {                                                            \
 108                static struct lock_class_key __key;                     \
 109                init_timer_on_stack_key((_timer), (_fn), (_flags),      \
 110                                        #_timer, &__key);                \
 111        } while (0)
 112#else
 113#define __init_timer(_timer, _fn, _flags)                               \
 114        init_timer_key((_timer), (_fn), (_flags), NULL, NULL)
 115#define __init_timer_on_stack(_timer, _fn, _flags)                      \
 116        init_timer_on_stack_key((_timer), (_fn), (_flags), NULL, NULL)
 117#endif
 118
 119/**
 120 * timer_setup - prepare a timer for first use
 121 * @timer: the timer in question
 122 * @callback: the function to call when timer expires
 123 * @flags: any TIMER_* flags
 124 *
 125 * Regular timer initialization should use either DEFINE_TIMER() above,
 126 * or timer_setup(). For timers on the stack, timer_setup_on_stack() must
 127 * be used and must be balanced with a call to destroy_timer_on_stack().
 128 */
 129#define timer_setup(timer, callback, flags)                     \
 130        __init_timer((timer), (callback), (flags))
 131
 132#define timer_setup_on_stack(timer, callback, flags)            \
 133        __init_timer_on_stack((timer), (callback), (flags))
 134
 135#ifdef CONFIG_DEBUG_OBJECTS_TIMERS
 136extern void destroy_timer_on_stack(struct timer_list *timer);
 137#else
 138static inline void destroy_timer_on_stack(struct timer_list *timer) { }
 139#endif
 140
 141#define from_timer(var, callback_timer, timer_fieldname) \
 142        container_of(callback_timer, typeof(*var), timer_fieldname)
 143
 144/**
 145 * timer_pending - is a timer pending?
 146 * @timer: the timer in question
 147 *
 148 * timer_pending will tell whether a given timer is currently pending,
 149 * or not. Callers must ensure serialization wrt. other operations done
 150 * to this timer, eg. interrupt contexts, or other CPUs on SMP.
 151 *
 152 * return value: 1 if the timer is pending, 0 if not.
 153 */
 154static inline int timer_pending(const struct timer_list * timer)
 155{
 156        return timer->entry.pprev != NULL;
 157}
 158
 159extern void add_timer_on(struct timer_list *timer, int cpu);
 160extern int del_timer(struct timer_list * timer);
 161extern int mod_timer(struct timer_list *timer, unsigned long expires);
 162extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
 163extern int timer_reduce(struct timer_list *timer, unsigned long expires);
 164
 165/*
 166 * The jiffies value which is added to now, when there is no timer
 167 * in the timer wheel:
 168 */
 169#define NEXT_TIMER_MAX_DELTA    ((1UL << 30) - 1)
 170
 171extern void add_timer(struct timer_list *timer);
 172
 173extern int try_to_del_timer_sync(struct timer_list *timer);
 174
 175#ifdef CONFIG_SMP
 176  extern int del_timer_sync(struct timer_list *timer);
 177#else
 178# define del_timer_sync(t)              del_timer(t)
 179#endif
 180
 181#define del_singleshot_timer_sync(t) del_timer_sync(t)
 182
 183extern void init_timers(void);
 184extern void run_local_timers(void);
 185struct hrtimer;
 186extern enum hrtimer_restart it_real_fn(struct hrtimer *);
 187
 188#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)
 189struct ctl_table;
 190
 191extern unsigned int sysctl_timer_migration;
 192int timer_migration_handler(struct ctl_table *table, int write,
 193                            void __user *buffer, size_t *lenp,
 194                            loff_t *ppos);
 195#endif
 196
 197unsigned long __round_jiffies(unsigned long j, int cpu);
 198unsigned long __round_jiffies_relative(unsigned long j, int cpu);
 199unsigned long round_jiffies(unsigned long j);
 200unsigned long round_jiffies_relative(unsigned long j);
 201
 202unsigned long __round_jiffies_up(unsigned long j, int cpu);
 203unsigned long __round_jiffies_up_relative(unsigned long j, int cpu);
 204unsigned long round_jiffies_up(unsigned long j);
 205unsigned long round_jiffies_up_relative(unsigned long j);
 206
 207#ifdef CONFIG_HOTPLUG_CPU
 208int timers_prepare_cpu(unsigned int cpu);
 209int timers_dead_cpu(unsigned int cpu);
 210#else
 211#define timers_prepare_cpu      NULL
 212#define timers_dead_cpu         NULL
 213#endif
 214
 215#endif
 216