Blame view
include/linux/timer.h
8.6 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 |
#ifndef _LINUX_TIMER_H #define _LINUX_TIMER_H |
1da177e4c Linux-2.6.12-rc2 |
3 |
#include <linux/list.h> |
82f67cd9f [PATCH] Add debug... |
4 |
#include <linux/ktime.h> |
1da177e4c Linux-2.6.12-rc2 |
5 |
#include <linux/stddef.h> |
c6f3a97f8 debugobjects: add... |
6 |
#include <linux/debugobjects.h> |
6f2b9b9a9 timer: implement ... |
7 |
#include <linux/stringify.h> |
1da177e4c Linux-2.6.12-rc2 |
8 |
|
a6fa8e5a6 time: clean hunga... |
9 |
struct tvec_base; |
1da177e4c Linux-2.6.12-rc2 |
10 11 |
struct timer_list { |
3bbb9ec94 timers: Introduce... |
12 13 14 15 |
/* * All fields that change during normal runtime grouped to the * same cacheline */ |
1da177e4c Linux-2.6.12-rc2 |
16 17 |
struct list_head entry; unsigned long expires; |
3bbb9ec94 timers: Introduce... |
18 |
struct tvec_base *base; |
1da177e4c Linux-2.6.12-rc2 |
19 |
|
1da177e4c Linux-2.6.12-rc2 |
20 21 |
void (*function)(unsigned long); unsigned long data; |
3bbb9ec94 timers: Introduce... |
22 |
int slack; |
82f67cd9f [PATCH] Add debug... |
23 |
#ifdef CONFIG_TIMER_STATS |
d0959024d timer_list: Remov... |
24 |
int start_pid; |
82f67cd9f [PATCH] Add debug... |
25 26 |
void *start_site; char start_comm[16]; |
82f67cd9f [PATCH] Add debug... |
27 |
#endif |
6f2b9b9a9 timer: implement ... |
28 29 30 |
#ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map; #endif |
1da177e4c Linux-2.6.12-rc2 |
31 |
}; |
a6fa8e5a6 time: clean hunga... |
32 |
extern struct tvec_base boot_tvec_bases; |
55c888d6d [PATCH] timers fi... |
33 |
|
6f2b9b9a9 timer: implement ... |
34 35 36 37 38 39 40 41 42 43 44 45 |
#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 timer: Permit sta... |
46 47 48 49 50 51 52 53 54 55 56 |
/* * Note that all tvec_bases are 2 byte aligned and lower bit of * base in timer_list is guaranteed to be zero. Use the LSB to * indicate whether the timer is deferrable. * * 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. */ #define TBASE_DEFERRABLE_FLAG (0x1) |
1da177e4c Linux-2.6.12-rc2 |
57 |
#define TIMER_INITIALIZER(_function, _expires, _data) { \ |
c6f3a97f8 debugobjects: add... |
58 |
.entry = { .prev = TIMER_ENTRY_STATIC }, \ |
1da177e4c Linux-2.6.12-rc2 |
59 60 61 |
.function = (_function), \ .expires = (_expires), \ .data = (_data), \ |
3691c5199 [PATCH] kill __in... |
62 |
.base = &boot_tvec_bases, \ |
aaabe31c2 timer: Initialize... |
63 |
.slack = -1, \ |
6f2b9b9a9 timer: implement ... |
64 65 |
__TIMER_LOCKDEP_MAP_INITIALIZER( \ __FILE__ ":" __stringify(__LINE__)) \ |
1da177e4c Linux-2.6.12-rc2 |
66 |
} |
dd6414b50 timer: Permit sta... |
67 68 69 70 71 72 73 74 75 76 77 78 |
#define TBASE_MAKE_DEFERRED(ptr) ((struct tvec_base *) \ ((unsigned char *)(ptr) + TBASE_DEFERRABLE_FLAG)) #define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data) {\ .entry = { .prev = TIMER_ENTRY_STATIC }, \ .function = (_function), \ .expires = (_expires), \ .data = (_data), \ .base = TBASE_MAKE_DEFERRED(&boot_tvec_bases), \ __TIMER_LOCKDEP_MAP_INITIALIZER( \ __FILE__ ":" __stringify(__LINE__)) \ } |
8d06afab7 [PATCH] timer ini... |
79 80 81 |
#define DEFINE_TIMER(_name, _function, _expires, _data) \ struct timer_list _name = \ TIMER_INITIALIZER(_function, _expires, _data) |
6f2b9b9a9 timer: implement ... |
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
void init_timer_key(struct timer_list *timer, const char *name, struct lock_class_key *key); void init_timer_deferrable_key(struct timer_list *timer, const char *name, struct lock_class_key *key); #ifdef CONFIG_LOCKDEP #define init_timer(timer) \ do { \ static struct lock_class_key __key; \ init_timer_key((timer), #timer, &__key); \ } while (0) #define init_timer_deferrable(timer) \ do { \ static struct lock_class_key __key; \ init_timer_deferrable_key((timer), #timer, &__key); \ } while (0) #define init_timer_on_stack(timer) \ do { \ static struct lock_class_key __key; \ init_timer_on_stack_key((timer), #timer, &__key); \ } while (0) #define setup_timer(timer, fn, data) \ do { \ static struct lock_class_key __key; \ setup_timer_key((timer), #timer, &__key, (fn), (data));\ } while (0) #define setup_timer_on_stack(timer, fn, data) \ do { \ static struct lock_class_key __key; \ setup_timer_on_stack_key((timer), #timer, &__key, \ (fn), (data)); \ } while (0) |
8cadd2831 timer: add on-sta... |
120 121 122 123 124 125 126 |
#define setup_deferrable_timer_on_stack(timer, fn, data) \ do { \ static struct lock_class_key __key; \ setup_deferrable_timer_on_stack_key((timer), #timer, \ &__key, (fn), \ (data)); \ } while (0) |
6f2b9b9a9 timer: implement ... |
127 128 129 130 131 132 133 134 135 136 137 |
#else #define init_timer(timer)\ init_timer_key((timer), NULL, NULL) #define init_timer_deferrable(timer)\ init_timer_deferrable_key((timer), NULL, NULL) #define init_timer_on_stack(timer)\ init_timer_on_stack_key((timer), NULL, NULL) #define setup_timer(timer, fn, data)\ setup_timer_key((timer), NULL, NULL, (fn), (data)) #define setup_timer_on_stack(timer, fn, data)\ setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) |
8cadd2831 timer: add on-sta... |
138 139 |
#define setup_deferrable_timer_on_stack(timer, fn, data)\ setup_deferrable_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) |
6f2b9b9a9 timer: implement ... |
140 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
141 |
|
c6f3a97f8 debugobjects: add... |
142 |
#ifdef CONFIG_DEBUG_OBJECTS_TIMERS |
6f2b9b9a9 timer: implement ... |
143 144 145 |
extern void init_timer_on_stack_key(struct timer_list *timer, const char *name, struct lock_class_key *key); |
c6f3a97f8 debugobjects: add... |
146 147 148 |
extern void destroy_timer_on_stack(struct timer_list *timer); #else static inline void destroy_timer_on_stack(struct timer_list *timer) { } |
6f2b9b9a9 timer: implement ... |
149 150 151 |
static inline void init_timer_on_stack_key(struct timer_list *timer, const char *name, struct lock_class_key *key) |
c6f3a97f8 debugobjects: add... |
152 |
{ |
6f2b9b9a9 timer: implement ... |
153 |
init_timer_key(timer, name, key); |
c6f3a97f8 debugobjects: add... |
154 155 |
} #endif |
6f2b9b9a9 timer: implement ... |
156 157 158 |
static inline void setup_timer_key(struct timer_list * timer, const char *name, struct lock_class_key *key, |
a8db2db1e [PATCH] introduce... |
159 160 161 162 163 |
void (*function)(unsigned long), unsigned long data) { timer->function = function; timer->data = data; |
6f2b9b9a9 timer: implement ... |
164 |
init_timer_key(timer, name, key); |
a8db2db1e [PATCH] introduce... |
165 |
} |
6f2b9b9a9 timer: implement ... |
166 167 168 |
static inline void setup_timer_on_stack_key(struct timer_list *timer, const char *name, struct lock_class_key *key, |
c6f3a97f8 debugobjects: add... |
169 170 171 172 173 |
void (*function)(unsigned long), unsigned long data) { timer->function = function; timer->data = data; |
6f2b9b9a9 timer: implement ... |
174 |
init_timer_on_stack_key(timer, name, key); |
c6f3a97f8 debugobjects: add... |
175 |
} |
8cadd2831 timer: add on-sta... |
176 177 178 179 180 |
extern void setup_deferrable_timer_on_stack_key(struct timer_list *timer, const char *name, struct lock_class_key *key, void (*function)(unsigned long), unsigned long data); |
45f8bde0d [PATCH] fix vario... |
181 |
/** |
1da177e4c Linux-2.6.12-rc2 |
182 183 184 185 186 187 188 189 190 191 192 |
* 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) { |
55c888d6d [PATCH] timers fi... |
193 |
return timer->entry.next != NULL; |
1da177e4c Linux-2.6.12-rc2 |
194 195 196 197 |
} extern void add_timer_on(struct timer_list *timer, int cpu); extern int del_timer(struct timer_list * timer); |
1da177e4c Linux-2.6.12-rc2 |
198 |
extern int mod_timer(struct timer_list *timer, unsigned long expires); |
74019224a timers: add mod_t... |
199 |
extern int mod_timer_pending(struct timer_list *timer, unsigned long expires); |
597d02757 timers: Framework... |
200 |
extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires); |
1da177e4c Linux-2.6.12-rc2 |
201 |
|
3bbb9ec94 timers: Introduce... |
202 |
extern void set_timer_slack(struct timer_list *time, int slack_hz); |
597d02757 timers: Framework... |
203 204 |
#define TIMER_NOT_PINNED 0 #define TIMER_PINNED 1 |
fd064b9b7 [PATCH] Extend ne... |
205 |
/* |
eaad084bb NOHZ: prevent mul... |
206 207 208 209 210 211 |
* 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) /* |
fd064b9b7 [PATCH] Extend ne... |
212 |
* Return when the next timer-wheel timeout occurs (in absolute jiffies), |
fd064b9b7 [PATCH] Extend ne... |
213 214 215 216 |
* locks the timer base and does the comparison against the given * jiffie. */ extern unsigned long get_next_timer_interrupt(unsigned long now); |
1da177e4c Linux-2.6.12-rc2 |
217 |
|
82f67cd9f [PATCH] Add debug... |
218 219 220 221 |
/* * Timer-statistics info: */ #ifdef CONFIG_TIMER_STATS |
507e12315 timer stats: Opti... |
222 |
extern int timer_stats_active; |
c5c061b8f Add a flag to ind... |
223 |
#define TIMER_STATS_FLAG_DEFERRABLE 0x1 |
82f67cd9f [PATCH] Add debug... |
224 225 226 |
extern void init_timer_stats(void); extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf, |
c5c061b8f Add a flag to ind... |
227 228 |
void *timerf, char *comm, unsigned int timer_flag); |
82f67cd9f [PATCH] Add debug... |
229 230 231 232 233 234 |
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 timer stats: Opti... |
235 236 |
if (likely(!timer_stats_active)) return; |
82f67cd9f [PATCH] Add debug... |
237 238 239 240 241 242 243 244 245 246 247 |
__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 [PATCH] Add debug... |
248 249 250 251 252 253 254 255 |
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 timers: add mod_t... |
256 |
extern void add_timer(struct timer_list *timer); |
1da177e4c Linux-2.6.12-rc2 |
257 |
|
6f1bc451e timer: Make try_t... |
258 |
extern int try_to_del_timer_sync(struct timer_list *timer); |
1da177e4c Linux-2.6.12-rc2 |
259 260 |
#ifdef CONFIG_SMP extern int del_timer_sync(struct timer_list *timer); |
1da177e4c Linux-2.6.12-rc2 |
261 |
#else |
fd450b731 [PATCH] timers: i... |
262 |
# define del_timer_sync(t) del_timer(t) |
1da177e4c Linux-2.6.12-rc2 |
263 |
#endif |
55c888d6d [PATCH] timers fi... |
264 |
#define del_singleshot_timer_sync(t) del_timer_sync(t) |
1da177e4c Linux-2.6.12-rc2 |
265 266 |
extern void init_timers(void); extern void run_local_timers(void); |
05cfb614d [PATCH] hrtimers:... |
267 |
struct hrtimer; |
c9cb2e3d7 [PATCH] hrtimers:... |
268 |
extern enum hrtimer_restart it_real_fn(struct hrtimer *); |
1da177e4c Linux-2.6.12-rc2 |
269 |
|
4c36a5dec [PATCH] round_jif... |
270 271 272 273 |
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 Add round_jiffies... |
274 275 276 277 |
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 Linux-2.6.12-rc2 |
278 |
#endif |