Blame view
include/linux/timer.h
7.75 KB
1da177e4c
|
1 2 |
#ifndef _LINUX_TIMER_H #define _LINUX_TIMER_H |
1da177e4c
|
3 |
#include <linux/list.h> |
82f67cd9f
|
4 |
#include <linux/ktime.h> |
1da177e4c
|
5 |
#include <linux/stddef.h> |
c6f3a97f8
|
6 |
#include <linux/debugobjects.h> |
6f2b9b9a9
|
7 |
#include <linux/stringify.h> |
1da177e4c
|
8 |
|
a6fa8e5a6
|
9 |
struct tvec_base; |
1da177e4c
|
10 11 |
struct timer_list { |
3bbb9ec94
|
12 13 14 15 |
/* * All fields that change during normal runtime grouped to the * same cacheline */ |
0eeda71bc
|
16 17 18 19 20 21 |
struct hlist_node entry; unsigned long expires; void (*function)(unsigned long); unsigned long data; u32 flags; int slack; |
3bbb9ec94
|
22 |
|
82f67cd9f
|
23 |
#ifdef CONFIG_TIMER_STATS |
0eeda71bc
|
24 25 26 |
int start_pid; void *start_site; char start_comm[16]; |
82f67cd9f
|
27 |
#endif |
6f2b9b9a9
|
28 |
#ifdef CONFIG_LOCKDEP |
0eeda71bc
|
29 |
struct lockdep_map lockdep_map; |
6f2b9b9a9
|
30 |
#endif |
1da177e4c
|
31 |
}; |
6f2b9b9a9
|
32 33 34 35 36 37 38 39 40 41 42 43 |
#ifdef CONFIG_LOCKDEP /* * NB: because we have to copy the lockdep_map, setting the lockdep_map key * (second argument) here is required, otherwise it could be initialised to * the copy of the lockdep_map later! We use the pointer to and the string * "<file>:<line>" as the key resp. the name of the lockdep_map. */ #define __TIMER_LOCKDEP_MAP_INITIALIZER(_kn) \ .lockdep_map = STATIC_LOCKDEP_MAP_INIT(_kn, &_kn), #else #define __TIMER_LOCKDEP_MAP_INITIALIZER(_kn) #endif |
dd6414b50
|
44 |
/* |
dd6414b50
|
45 46 47 48 |
* A deferrable timer will work normally when the system is busy, but * will not cause a CPU to come out of idle just to service it; instead, * the timer will be serviced when the CPU eventually wakes up with a * subsequent non-deferrable timer. |
c5f66e99b
|
49 50 51 52 53 54 55 56 |
* * An irqsafe timer is executed with IRQ disabled and it's safe to wait for * the completion of the running instance from IRQ handlers, for example, * by calling del_timer_sync(). * * Note: The irq disabled callback execution is a special case for * workqueue locking issues. It's not meant for executing random crap * with interrupts disabled. Abuse is monitored! |
dd6414b50
|
57 |
*/ |
0eeda71bc
|
58 59 60 61 62 |
#define TIMER_CPUMASK 0x0007FFFF #define TIMER_MIGRATING 0x00080000 #define TIMER_BASEMASK (TIMER_CPUMASK | TIMER_MIGRATING) #define TIMER_DEFERRABLE 0x00100000 #define TIMER_IRQSAFE 0x00200000 |
dd6414b50
|
63 |
|
fc683995a
|
64 |
#define __TIMER_INITIALIZER(_function, _expires, _data, _flags) { \ |
1dabbcec2
|
65 |
.entry = { .next = TIMER_ENTRY_STATIC }, \ |
1da177e4c
|
66 67 68 |
.function = (_function), \ .expires = (_expires), \ .data = (_data), \ |
0eeda71bc
|
69 |
.flags = (_flags), \ |
aaabe31c2
|
70 |
.slack = -1, \ |
6f2b9b9a9
|
71 72 |
__TIMER_LOCKDEP_MAP_INITIALIZER( \ __FILE__ ":" __stringify(__LINE__)) \ |
1da177e4c
|
73 |
} |
fc683995a
|
74 75 |
#define TIMER_INITIALIZER(_function, _expires, _data) \ __TIMER_INITIALIZER((_function), (_expires), (_data), 0) |
dd6414b50
|
76 |
|
fc683995a
|
77 78 |
#define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data) \ __TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE) |
dd6414b50
|
79 |
|
8d06afab7
|
80 81 82 |
#define DEFINE_TIMER(_name, _function, _expires, _data) \ struct timer_list _name = \ TIMER_INITIALIZER(_function, _expires, _data) |
fc683995a
|
83 84 |
void init_timer_key(struct timer_list *timer, unsigned int flags, const char *name, struct lock_class_key *key); |
6f2b9b9a9
|
85 |
|
5a9af38d0
|
86 87 |
#ifdef CONFIG_DEBUG_OBJECTS_TIMERS extern void init_timer_on_stack_key(struct timer_list *timer, |
fc683995a
|
88 |
unsigned int flags, const char *name, |
5a9af38d0
|
89 90 91 92 93 |
struct lock_class_key *key); extern void destroy_timer_on_stack(struct timer_list *timer); #else static inline void destroy_timer_on_stack(struct timer_list *timer) { } static inline void init_timer_on_stack_key(struct timer_list *timer, |
fc683995a
|
94 |
unsigned int flags, const char *name, |
5a9af38d0
|
95 96 |
struct lock_class_key *key) { |
fc683995a
|
97 |
init_timer_key(timer, flags, name, key); |
5a9af38d0
|
98 99 |
} #endif |
6f2b9b9a9
|
100 |
#ifdef CONFIG_LOCKDEP |
fc683995a
|
101 |
#define __init_timer(_timer, _flags) \ |
6f2b9b9a9
|
102 103 |
do { \ static struct lock_class_key __key; \ |
fc683995a
|
104 |
init_timer_key((_timer), (_flags), #_timer, &__key); \ |
6f2b9b9a9
|
105 |
} while (0) |
fc683995a
|
106 |
#define __init_timer_on_stack(_timer, _flags) \ |
6f2b9b9a9
|
107 108 |
do { \ static struct lock_class_key __key; \ |
fc683995a
|
109 |
init_timer_on_stack_key((_timer), (_flags), #_timer, &__key); \ |
6f2b9b9a9
|
110 |
} while (0) |
fc683995a
|
111 112 113 114 115 116 |
#else #define __init_timer(_timer, _flags) \ init_timer_key((_timer), (_flags), NULL, NULL) #define __init_timer_on_stack(_timer, _flags) \ init_timer_on_stack_key((_timer), (_flags), NULL, NULL) #endif |
6f2b9b9a9
|
117 |
|
fc683995a
|
118 119 120 121 |
#define init_timer(timer) \ __init_timer((timer), 0) #define init_timer_deferrable(timer) \ __init_timer((timer), TIMER_DEFERRABLE) |
6f2b9b9a9
|
122 |
#define init_timer_on_stack(timer) \ |
fc683995a
|
123 124 125 |
__init_timer_on_stack((timer), 0) #define __setup_timer(_timer, _fn, _data, _flags) \ |
6f2b9b9a9
|
126 |
do { \ |
fc683995a
|
127 128 129 |
__init_timer((_timer), (_flags)); \ (_timer)->function = (_fn); \ (_timer)->data = (_data); \ |
6f2b9b9a9
|
130 |
} while (0) |
fc683995a
|
131 |
#define __setup_timer_on_stack(_timer, _fn, _data, _flags) \ |
6f2b9b9a9
|
132 |
do { \ |
fc683995a
|
133 134 135 |
__init_timer_on_stack((_timer), (_flags)); \ (_timer)->function = (_fn); \ (_timer)->data = (_data); \ |
6f2b9b9a9
|
136 |
} while (0) |
fc683995a
|
137 138 |
#define setup_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), 0) |
6f2b9b9a9
|
139 |
#define setup_timer_on_stack(timer, fn, data) \ |
fc683995a
|
140 |
__setup_timer_on_stack((timer), (fn), (data), 0) |
8cadd2831
|
141 |
#define setup_deferrable_timer_on_stack(timer, fn, data) \ |
fc683995a
|
142 |
__setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE) |
8cadd2831
|
143 |
|
45f8bde0d
|
144 |
/** |
1da177e4c
|
145 146 147 148 149 150 151 152 153 154 155 |
* timer_pending - is a timer pending? * @timer: the timer in question * * timer_pending will tell whether a given timer is currently pending, * or not. Callers must ensure serialization wrt. other operations done * to this timer, eg. interrupt contexts, or other CPUs on SMP. * * return value: 1 if the timer is pending, 0 if not. */ static inline int timer_pending(const struct timer_list * timer) { |
1dabbcec2
|
156 |
return timer->entry.pprev != NULL; |
1da177e4c
|
157 158 159 160 |
} extern void add_timer_on(struct timer_list *timer, int cpu); extern int del_timer(struct timer_list * timer); |
1da177e4c
|
161 |
extern int mod_timer(struct timer_list *timer, unsigned long expires); |
74019224a
|
162 |
extern int mod_timer_pending(struct timer_list *timer, unsigned long expires); |
597d02757
|
163 |
extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires); |
1da177e4c
|
164 |
|
3bbb9ec94
|
165 |
extern void set_timer_slack(struct timer_list *time, int slack_hz); |
597d02757
|
166 167 |
#define TIMER_NOT_PINNED 0 #define TIMER_PINNED 1 |
fd064b9b7
|
168 |
/* |
eaad084bb
|
169 170 171 172 173 174 |
* The jiffies value which is added to now, when there is no timer * in the timer wheel: */ #define NEXT_TIMER_MAX_DELTA ((1UL << 30) - 1) /* |
82f67cd9f
|
175 176 177 |
* Timer-statistics info: */ #ifdef CONFIG_TIMER_STATS |
507e12315
|
178 |
extern int timer_stats_active; |
82f67cd9f
|
179 180 181 |
extern void init_timer_stats(void); extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf, |
c74441a17
|
182 |
void *timerf, char *comm, u32 flags); |
82f67cd9f
|
183 184 185 186 187 188 |
extern void __timer_stats_timer_set_start_info(struct timer_list *timer, void *addr); static inline void timer_stats_timer_set_start_info(struct timer_list *timer) { |
507e12315
|
189 190 |
if (likely(!timer_stats_active)) return; |
82f67cd9f
|
191 192 193 194 195 196 197 198 199 200 201 |
__timer_stats_timer_set_start_info(timer, __builtin_return_address(0)); } static inline void timer_stats_timer_clear_start_info(struct timer_list *timer) { timer->start_site = NULL; } #else static inline void init_timer_stats(void) { } |
82f67cd9f
|
202 203 204 205 206 207 208 209 |
static inline void timer_stats_timer_set_start_info(struct timer_list *timer) { } static inline void timer_stats_timer_clear_start_info(struct timer_list *timer) { } #endif |
74019224a
|
210 |
extern void add_timer(struct timer_list *timer); |
1da177e4c
|
211 |
|
6f1bc451e
|
212 |
extern int try_to_del_timer_sync(struct timer_list *timer); |
1da177e4c
|
213 214 |
#ifdef CONFIG_SMP extern int del_timer_sync(struct timer_list *timer); |
1da177e4c
|
215 |
#else |
fd450b731
|
216 |
# define del_timer_sync(t) del_timer(t) |
1da177e4c
|
217 |
#endif |
55c888d6d
|
218 |
#define del_singleshot_timer_sync(t) del_timer_sync(t) |
1da177e4c
|
219 220 |
extern void init_timers(void); extern void run_local_timers(void); |
05cfb614d
|
221 |
struct hrtimer; |
c9cb2e3d7
|
222 |
extern enum hrtimer_restart it_real_fn(struct hrtimer *); |
1da177e4c
|
223 |
|
bc7a34b8b
|
224 225 226 227 228 229 230 231 |
#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) #include <linux/sysctl.h> extern unsigned int sysctl_timer_migration; int timer_migration_handler(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos); #endif |
4c36a5dec
|
232 233 234 235 |
unsigned long __round_jiffies(unsigned long j, int cpu); unsigned long __round_jiffies_relative(unsigned long j, int cpu); unsigned long round_jiffies(unsigned long j); unsigned long round_jiffies_relative(unsigned long j); |
9c133c469
|
236 237 238 239 |
unsigned long __round_jiffies_up(unsigned long j, int cpu); unsigned long __round_jiffies_up_relative(unsigned long j, int cpu); unsigned long round_jiffies_up(unsigned long j); unsigned long round_jiffies_up_relative(unsigned long j); |
1da177e4c
|
240 |
#endif |