Blame view

include/linux/timer.h 8.77 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
  	 */
0eeda71bc   Thomas Gleixner   timer: Replace ti...
16
17
18
19
20
  	struct hlist_node	entry;
  	unsigned long		expires;
  	void			(*function)(unsigned long);
  	unsigned long		data;
  	u32			flags;
3bbb9ec94   Arjan van de Ven   timers: Introduce...
21

82f67cd9f   Ingo Molnar   [PATCH] Add debug...
22
  #ifdef CONFIG_TIMER_STATS
0eeda71bc   Thomas Gleixner   timer: Replace ti...
23
24
25
  	int			start_pid;
  	void			*start_site;
  	char			start_comm[16];
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
26
  #endif
6f2b9b9a9   Johannes Berg   timer: implement ...
27
  #ifdef CONFIG_LOCKDEP
0eeda71bc   Thomas Gleixner   timer: Replace ti...
28
  	struct lockdep_map	lockdep_map;
6f2b9b9a9   Johannes Berg   timer: implement ...
29
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  };
6f2b9b9a9   Johannes Berg   timer: implement ...
31
32
33
34
35
36
37
38
39
40
41
42
  #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...
43
  /*
dd6414b50   Phil Carmody   timer: Permit sta...
44
45
46
47
   * 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   Tejun Heo   timer: Implement ...
48
49
50
51
52
53
54
55
   *
   * 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   Phil Carmody   timer: Permit sta...
56
   */
b0d6e2dcb   Thomas Gleixner   timers: Reduce th...
57
58
  #define TIMER_CPUMASK		0x0003FFFF
  #define TIMER_MIGRATING		0x00040000
0eeda71bc   Thomas Gleixner   timer: Replace ti...
59
  #define TIMER_BASEMASK		(TIMER_CPUMASK | TIMER_MIGRATING)
b0d6e2dcb   Thomas Gleixner   timers: Reduce th...
60
61
62
  #define TIMER_DEFERRABLE	0x00080000
  #define TIMER_PINNED		0x00100000
  #define TIMER_IRQSAFE		0x00200000
500462a9d   Thomas Gleixner   timers: Switch to...
63
64
  #define TIMER_ARRAYSHIFT	22
  #define TIMER_ARRAYMASK		0xFFC00000
dd6414b50   Phil Carmody   timer: Permit sta...
65

fc683995a   Tejun Heo   timer: Clean up t...
66
  #define __TIMER_INITIALIZER(_function, _expires, _data, _flags) { \
1dabbcec2   Thomas Gleixner   timer: Use hlist ...
67
  		.entry = { .next = TIMER_ENTRY_STATIC },	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
  		.function = (_function),			\
  		.expires = (_expires),				\
  		.data = (_data),				\
0eeda71bc   Thomas Gleixner   timer: Replace ti...
71
  		.flags = (_flags),				\
6f2b9b9a9   Johannes Berg   timer: implement ...
72
73
  		__TIMER_LOCKDEP_MAP_INITIALIZER(		\
  			__FILE__ ":" __stringify(__LINE__))	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
  	}
fc683995a   Tejun Heo   timer: Clean up t...
75
76
  #define TIMER_INITIALIZER(_function, _expires, _data)		\
  	__TIMER_INITIALIZER((_function), (_expires), (_data), 0)
dd6414b50   Phil Carmody   timer: Permit sta...
77

e675447bd   Thomas Gleixner   timers: Make 'pin...
78
79
  #define TIMER_PINNED_INITIALIZER(_function, _expires, _data)	\
  	__TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_PINNED)
fc683995a   Tejun Heo   timer: Clean up t...
80
81
  #define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data)	\
  	__TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE)
dd6414b50   Phil Carmody   timer: Permit sta...
82

e675447bd   Thomas Gleixner   timers: Make 'pin...
83
84
  #define TIMER_PINNED_DEFERRED_INITIALIZER(_function, _expires, _data)	\
  	__TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE | TIMER_PINNED)
8d06afab7   Ingo Molnar   [PATCH] timer ini...
85
86
87
  #define DEFINE_TIMER(_name, _function, _expires, _data)		\
  	struct timer_list _name =				\
  		TIMER_INITIALIZER(_function, _expires, _data)
fc683995a   Tejun Heo   timer: Clean up t...
88
89
  void init_timer_key(struct timer_list *timer, unsigned int flags,
  		    const char *name, struct lock_class_key *key);
6f2b9b9a9   Johannes Berg   timer: implement ...
90

5a9af38d0   Tejun Heo   timer: Relocate d...
91
92
  #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
  extern void init_timer_on_stack_key(struct timer_list *timer,
fc683995a   Tejun Heo   timer: Clean up t...
93
  				    unsigned int flags, const char *name,
5a9af38d0   Tejun Heo   timer: Relocate d...
94
95
96
97
98
  				    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   Tejun Heo   timer: Clean up t...
99
  					   unsigned int flags, const char *name,
5a9af38d0   Tejun Heo   timer: Relocate d...
100
101
  					   struct lock_class_key *key)
  {
fc683995a   Tejun Heo   timer: Clean up t...
102
  	init_timer_key(timer, flags, name, key);
5a9af38d0   Tejun Heo   timer: Relocate d...
103
104
  }
  #endif
6f2b9b9a9   Johannes Berg   timer: implement ...
105
  #ifdef CONFIG_LOCKDEP
fc683995a   Tejun Heo   timer: Clean up t...
106
  #define __init_timer(_timer, _flags)					\
6f2b9b9a9   Johannes Berg   timer: implement ...
107
108
  	do {								\
  		static struct lock_class_key __key;			\
fc683995a   Tejun Heo   timer: Clean up t...
109
  		init_timer_key((_timer), (_flags), #_timer, &__key);	\
6f2b9b9a9   Johannes Berg   timer: implement ...
110
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
111
  #define __init_timer_on_stack(_timer, _flags)				\
6f2b9b9a9   Johannes Berg   timer: implement ...
112
113
  	do {								\
  		static struct lock_class_key __key;			\
fc683995a   Tejun Heo   timer: Clean up t...
114
  		init_timer_on_stack_key((_timer), (_flags), #_timer, &__key); \
6f2b9b9a9   Johannes Berg   timer: implement ...
115
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
116
117
118
119
120
121
  #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   Johannes Berg   timer: implement ...
122

fc683995a   Tejun Heo   timer: Clean up t...
123
124
  #define init_timer(timer)						\
  	__init_timer((timer), 0)
e675447bd   Thomas Gleixner   timers: Make 'pin...
125
126
  #define init_timer_pinned(timer)					\
  	__init_timer((timer), TIMER_PINNED)
fc683995a   Tejun Heo   timer: Clean up t...
127
128
  #define init_timer_deferrable(timer)					\
  	__init_timer((timer), TIMER_DEFERRABLE)
e675447bd   Thomas Gleixner   timers: Make 'pin...
129
130
  #define init_timer_pinned_deferrable(timer)				\
  	__init_timer((timer), TIMER_DEFERRABLE | TIMER_PINNED)
6f2b9b9a9   Johannes Berg   timer: implement ...
131
  #define init_timer_on_stack(timer)					\
fc683995a   Tejun Heo   timer: Clean up t...
132
133
134
  	__init_timer_on_stack((timer), 0)
  
  #define __setup_timer(_timer, _fn, _data, _flags)			\
6f2b9b9a9   Johannes Berg   timer: implement ...
135
  	do {								\
fc683995a   Tejun Heo   timer: Clean up t...
136
137
138
  		__init_timer((_timer), (_flags));			\
  		(_timer)->function = (_fn);				\
  		(_timer)->data = (_data);				\
6f2b9b9a9   Johannes Berg   timer: implement ...
139
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
140
  #define __setup_timer_on_stack(_timer, _fn, _data, _flags)		\
6f2b9b9a9   Johannes Berg   timer: implement ...
141
  	do {								\
fc683995a   Tejun Heo   timer: Clean up t...
142
143
144
  		__init_timer_on_stack((_timer), (_flags));		\
  		(_timer)->function = (_fn);				\
  		(_timer)->data = (_data);				\
6f2b9b9a9   Johannes Berg   timer: implement ...
145
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
146
147
  #define setup_timer(timer, fn, data)					\
  	__setup_timer((timer), (fn), (data), 0)
e675447bd   Thomas Gleixner   timers: Make 'pin...
148
149
  #define setup_pinned_timer(timer, fn, data)				\
  	__setup_timer((timer), (fn), (data), TIMER_PINNED)
6f3ffc191   Lucas Stach   timer: add setup_...
150
151
  #define setup_deferrable_timer(timer, fn, data)				\
  	__setup_timer((timer), (fn), (data), TIMER_DEFERRABLE)
e675447bd   Thomas Gleixner   timers: Make 'pin...
152
153
  #define setup_pinned_deferrable_timer(timer, fn, data)			\
  	__setup_timer((timer), (fn), (data), TIMER_DEFERRABLE | TIMER_PINNED)
6f2b9b9a9   Johannes Berg   timer: implement ...
154
  #define setup_timer_on_stack(timer, fn, data)				\
fc683995a   Tejun Heo   timer: Clean up t...
155
  	__setup_timer_on_stack((timer), (fn), (data), 0)
e675447bd   Thomas Gleixner   timers: Make 'pin...
156
157
  #define setup_pinned_timer_on_stack(timer, fn, data)			\
  	__setup_timer_on_stack((timer), (fn), (data), TIMER_PINNED)
8cadd2831   Jesse Barnes   timer: add on-sta...
158
  #define setup_deferrable_timer_on_stack(timer, fn, data)		\
fc683995a   Tejun Heo   timer: Clean up t...
159
  	__setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE)
e675447bd   Thomas Gleixner   timers: Make 'pin...
160
161
  #define setup_pinned_deferrable_timer_on_stack(timer, fn, data)		\
  	__setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE | TIMER_PINNED)
8cadd2831   Jesse Barnes   timer: add on-sta...
162

45f8bde0d   Robert P. J. Day   [PATCH] fix vario...
163
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
166
167
168
169
170
171
172
173
174
   * 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   Thomas Gleixner   timer: Use hlist ...
175
  	return timer->entry.pprev != NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
177
178
179
  }
  
  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
180
  extern int mod_timer(struct timer_list *timer, unsigned long expires);
74019224a   Ingo Molnar   timers: add mod_t...
181
  extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182

fd064b9b7   Thomas Gleixner   [PATCH] Extend ne...
183
  /*
eaad084bb   Thomas Gleixner   NOHZ: prevent mul...
184
185
186
187
188
189
   * 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   Ingo Molnar   [PATCH] Add debug...
190
191
192
   * Timer-statistics info:
   */
  #ifdef CONFIG_TIMER_STATS
507e12315   Heiko Carstens   timer stats: Opti...
193
  extern int timer_stats_active;
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
194
195
196
  extern void init_timer_stats(void);
  
  extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
c74441a17   Thomas Gleixner   timer: Stats: Sim...
197
  				     void *timerf, char *comm, u32 flags);
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
198
199
200
201
202
203
  
  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...
204
205
  	if (likely(!timer_stats_active))
  		return;
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
206
207
208
209
210
211
212
213
214
215
216
  	__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...
217
218
219
220
221
222
223
224
  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...
225
  extern void add_timer(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226

6f1bc451e   Yong Zhang   timer: Make try_t...
227
  extern int try_to_del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
229
  #ifdef CONFIG_SMP
    extern int del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
  #else
fd450b731   Oleg Nesterov   [PATCH] timers: i...
231
  # define del_timer_sync(t)		del_timer(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232
  #endif
55c888d6d   Oleg Nesterov   [PATCH] timers fi...
233
  #define del_singleshot_timer_sync(t) del_timer_sync(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
235
  extern void init_timers(void);
  extern void run_local_timers(void);
05cfb614d   Roman Zippel   [PATCH] hrtimers:...
236
  struct hrtimer;
c9cb2e3d7   Thomas Gleixner   [PATCH] hrtimers:...
237
  extern enum hrtimer_restart it_real_fn(struct hrtimer *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238

bc7a34b8b   Thomas Gleixner   timer: Reduce tim...
239
240
241
242
243
244
245
246
  #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   Arjan van de Ven   [PATCH] round_jif...
247
248
249
250
  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...
251
252
253
254
  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);
24f73b997   Richard Cochran   timers/core: Conv...
255
256
257
258
259
  #ifdef CONFIG_HOTPLUG_CPU
  int timers_dead_cpu(unsigned int cpu);
  #else
  #define timers_dead_cpu NULL
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
  #endif