Blame view

include/linux/timer.h 8.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _LINUX_TIMER_H
  #define _LINUX_TIMER_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
  #include <linux/list.h>
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
4
  #include <linux/ktime.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
  #include <linux/stddef.h>
c6f3a97f8   Thomas Gleixner   debugobjects: add...
6
  #include <linux/debugobjects.h>
6f2b9b9a9   Johannes Berg   timer: implement ...
7
  #include <linux/stringify.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8

a6fa8e5a6   Pavel Machek   time: clean hunga...
9
  struct tvec_base;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
  
  struct timer_list {
3bbb9ec94   Arjan van de Ven   timers: Introduce...
12
13
14
15
  	/*
  	 * All fields that change during normal runtime grouped to the
  	 * same cacheline
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
  	struct list_head entry;
  	unsigned long expires;
3bbb9ec94   Arjan van de Ven   timers: Introduce...
18
  	struct tvec_base *base;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
  	void (*function)(unsigned long);
  	unsigned long data;
3bbb9ec94   Arjan van de Ven   timers: Introduce...
22
  	int slack;
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
23
  #ifdef CONFIG_TIMER_STATS
d0959024d   Richard Kennedy   timer_list: Remov...
24
  	int start_pid;
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
25
26
  	void *start_site;
  	char start_comm[16];
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
27
  #endif
6f2b9b9a9   Johannes Berg   timer: implement ...
28
29
30
  #ifdef CONFIG_LOCKDEP
  	struct lockdep_map lockdep_map;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  };
a6fa8e5a6   Pavel Machek   time: clean hunga...
32
  extern struct tvec_base boot_tvec_bases;
55c888d6d   Oleg Nesterov   [PATCH] timers fi...
33

6f2b9b9a9   Johannes Berg   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   Phil Carmody   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   Linus Torvalds   Linux-2.6.12-rc2
57
  #define TIMER_INITIALIZER(_function, _expires, _data) {		\
c6f3a97f8   Thomas Gleixner   debugobjects: add...
58
  		.entry = { .prev = TIMER_ENTRY_STATIC },	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
  		.function = (_function),			\
  		.expires = (_expires),				\
  		.data = (_data),				\
3691c5199   Oleg Nesterov   [PATCH] kill __in...
62
  		.base = &boot_tvec_bases,			\
aaabe31c2   Changli Gao   timer: Initialize...
63
  		.slack = -1,					\
6f2b9b9a9   Johannes Berg   timer: implement ...
64
65
  		__TIMER_LOCKDEP_MAP_INITIALIZER(		\
  			__FILE__ ":" __stringify(__LINE__))	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
  	}
dd6414b50   Phil Carmody   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   Ingo Molnar   [PATCH] timer ini...
79
80
81
  #define DEFINE_TIMER(_name, _function, _expires, _data)		\
  	struct timer_list _name =				\
  		TIMER_INITIALIZER(_function, _expires, _data)
6f2b9b9a9   Johannes Berg   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   Jesse Barnes   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   Johannes Berg   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   Jesse Barnes   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   Johannes Berg   timer: implement ...
140
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141

c6f3a97f8   Thomas Gleixner   debugobjects: add...
142
  #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
6f2b9b9a9   Johannes Berg   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   Thomas Gleixner   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   Johannes Berg   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   Thomas Gleixner   debugobjects: add...
152
  {
6f2b9b9a9   Johannes Berg   timer: implement ...
153
  	init_timer_key(timer, name, key);
c6f3a97f8   Thomas Gleixner   debugobjects: add...
154
155
  }
  #endif
6f2b9b9a9   Johannes Berg   timer: implement ...
156
157
158
  static inline void setup_timer_key(struct timer_list * timer,
  				const char *name,
  				struct lock_class_key *key,
a8db2db1e   Oleg Nesterov   [PATCH] introduce...
159
160
161
162
163
  				void (*function)(unsigned long),
  				unsigned long data)
  {
  	timer->function = function;
  	timer->data = data;
6f2b9b9a9   Johannes Berg   timer: implement ...
164
  	init_timer_key(timer, name, key);
a8db2db1e   Oleg Nesterov   [PATCH] introduce...
165
  }
6f2b9b9a9   Johannes Berg   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   Thomas Gleixner   debugobjects: add...
169
170
171
172
173
  					void (*function)(unsigned long),
  					unsigned long data)
  {
  	timer->function = function;
  	timer->data = data;
6f2b9b9a9   Johannes Berg   timer: implement ...
174
  	init_timer_on_stack_key(timer, name, key);
c6f3a97f8   Thomas Gleixner   debugobjects: add...
175
  }
8cadd2831   Jesse Barnes   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   Robert P. J. Day   [PATCH] fix vario...
181
  /**
1da177e4c   Linus Torvalds   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   Oleg Nesterov   [PATCH] timers fi...
193
  	return timer->entry.next != NULL;
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
198
  extern int mod_timer(struct timer_list *timer, unsigned long expires);
74019224a   Ingo Molnar   timers: add mod_t...
199
  extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
597d02757   Arun R Bharadwaj   timers: Framework...
200
  extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201

3bbb9ec94   Arjan van de Ven   timers: Introduce...
202
  extern void set_timer_slack(struct timer_list *time, int slack_hz);
597d02757   Arun R Bharadwaj   timers: Framework...
203
204
  #define TIMER_NOT_PINNED	0
  #define TIMER_PINNED		1
fd064b9b7   Thomas Gleixner   [PATCH] Extend ne...
205
  /*
eaad084bb   Thomas Gleixner   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   Thomas Gleixner   [PATCH] Extend ne...
212
   * Return when the next timer-wheel timeout occurs (in absolute jiffies),
fd064b9b7   Thomas Gleixner   [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   Linus Torvalds   Linux-2.6.12-rc2
217

82f67cd9f   Ingo Molnar   [PATCH] Add debug...
218
219
220
221
  /*
   * Timer-statistics info:
   */
  #ifdef CONFIG_TIMER_STATS
507e12315   Heiko Carstens   timer stats: Opti...
222
  extern int timer_stats_active;
c5c061b8f   Venki Pallipadi   Add a flag to ind...
223
  #define TIMER_STATS_FLAG_DEFERRABLE	0x1
82f67cd9f   Ingo Molnar   [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   Venki Pallipadi   Add a flag to ind...
227
228
  				     void *timerf, char *comm,
  				     unsigned int timer_flag);
82f67cd9f   Ingo Molnar   [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   Heiko Carstens   timer stats: Opti...
235
236
  	if (likely(!timer_stats_active))
  		return;
82f67cd9f   Ingo Molnar   [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   Ingo Molnar   [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   Ingo Molnar   timers: add mod_t...
256
  extern void add_timer(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257

6f1bc451e   Yong Zhang   timer: Make try_t...
258
  extern int try_to_del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
260
  #ifdef CONFIG_SMP
    extern int del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
  #else
fd450b731   Oleg Nesterov   [PATCH] timers: i...
262
  # define del_timer_sync(t)		del_timer(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
  #endif
55c888d6d   Oleg Nesterov   [PATCH] timers fi...
264
  #define del_singleshot_timer_sync(t) del_timer_sync(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
266
  extern void init_timers(void);
  extern void run_local_timers(void);
05cfb614d   Roman Zippel   [PATCH] hrtimers:...
267
  struct hrtimer;
c9cb2e3d7   Thomas Gleixner   [PATCH] hrtimers:...
268
  extern enum hrtimer_restart it_real_fn(struct hrtimer *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269

4c36a5dec   Arjan van de Ven   [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   Alan Stern   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   Linus Torvalds   Linux-2.6.12-rc2
278
  #endif