Blame view

include/linux/timer.h 7.75 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
21
  	struct hlist_node	entry;
  	unsigned long		expires;
  	void			(*function)(unsigned long);
  	unsigned long		data;
  	u32			flags;
  	int			slack;
3bbb9ec94   Arjan van de Ven   timers: Introduce...
22

82f67cd9f   Ingo Molnar   [PATCH] Add debug...
23
  #ifdef CONFIG_TIMER_STATS
0eeda71bc   Thomas Gleixner   timer: Replace ti...
24
25
26
  	int			start_pid;
  	void			*start_site;
  	char			start_comm[16];
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
27
  #endif
6f2b9b9a9   Johannes Berg   timer: implement ...
28
  #ifdef CONFIG_LOCKDEP
0eeda71bc   Thomas Gleixner   timer: Replace ti...
29
  	struct lockdep_map	lockdep_map;
6f2b9b9a9   Johannes Berg   timer: implement ...
30
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  };
6f2b9b9a9   Johannes Berg   timer: implement ...
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   Phil Carmody   timer: Permit sta...
44
  /*
dd6414b50   Phil Carmody   timer: Permit sta...
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   Tejun Heo   timer: Implement ...
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   Phil Carmody   timer: Permit sta...
57
   */
0eeda71bc   Thomas Gleixner   timer: Replace ti...
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   Phil Carmody   timer: Permit sta...
63

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

fc683995a   Tejun Heo   timer: Clean up t...
77
78
  #define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data)	\
  	__TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE)
dd6414b50   Phil Carmody   timer: Permit sta...
79

8d06afab7   Ingo Molnar   [PATCH] timer ini...
80
81
82
  #define DEFINE_TIMER(_name, _function, _expires, _data)		\
  	struct timer_list _name =				\
  		TIMER_INITIALIZER(_function, _expires, _data)
fc683995a   Tejun Heo   timer: Clean up t...
83
84
  void init_timer_key(struct timer_list *timer, unsigned int flags,
  		    const char *name, struct lock_class_key *key);
6f2b9b9a9   Johannes Berg   timer: implement ...
85

5a9af38d0   Tejun Heo   timer: Relocate d...
86
87
  #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
  extern void init_timer_on_stack_key(struct timer_list *timer,
fc683995a   Tejun Heo   timer: Clean up t...
88
  				    unsigned int flags, const char *name,
5a9af38d0   Tejun Heo   timer: Relocate d...
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   Tejun Heo   timer: Clean up t...
94
  					   unsigned int flags, const char *name,
5a9af38d0   Tejun Heo   timer: Relocate d...
95
96
  					   struct lock_class_key *key)
  {
fc683995a   Tejun Heo   timer: Clean up t...
97
  	init_timer_key(timer, flags, name, key);
5a9af38d0   Tejun Heo   timer: Relocate d...
98
99
  }
  #endif
6f2b9b9a9   Johannes Berg   timer: implement ...
100
  #ifdef CONFIG_LOCKDEP
fc683995a   Tejun Heo   timer: Clean up t...
101
  #define __init_timer(_timer, _flags)					\
6f2b9b9a9   Johannes Berg   timer: implement ...
102
103
  	do {								\
  		static struct lock_class_key __key;			\
fc683995a   Tejun Heo   timer: Clean up t...
104
  		init_timer_key((_timer), (_flags), #_timer, &__key);	\
6f2b9b9a9   Johannes Berg   timer: implement ...
105
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
106
  #define __init_timer_on_stack(_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_on_stack_key((_timer), (_flags), #_timer, &__key); \
6f2b9b9a9   Johannes Berg   timer: implement ...
110
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
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   Johannes Berg   timer: implement ...
117

fc683995a   Tejun Heo   timer: Clean up t...
118
119
120
121
  #define init_timer(timer)						\
  	__init_timer((timer), 0)
  #define init_timer_deferrable(timer)					\
  	__init_timer((timer), TIMER_DEFERRABLE)
6f2b9b9a9   Johannes Berg   timer: implement ...
122
  #define init_timer_on_stack(timer)					\
fc683995a   Tejun Heo   timer: Clean up t...
123
124
125
  	__init_timer_on_stack((timer), 0)
  
  #define __setup_timer(_timer, _fn, _data, _flags)			\
6f2b9b9a9   Johannes Berg   timer: implement ...
126
  	do {								\
fc683995a   Tejun Heo   timer: Clean up t...
127
128
129
  		__init_timer((_timer), (_flags));			\
  		(_timer)->function = (_fn);				\
  		(_timer)->data = (_data);				\
6f2b9b9a9   Johannes Berg   timer: implement ...
130
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
131
  #define __setup_timer_on_stack(_timer, _fn, _data, _flags)		\
6f2b9b9a9   Johannes Berg   timer: implement ...
132
  	do {								\
fc683995a   Tejun Heo   timer: Clean up t...
133
134
135
  		__init_timer_on_stack((_timer), (_flags));		\
  		(_timer)->function = (_fn);				\
  		(_timer)->data = (_data);				\
6f2b9b9a9   Johannes Berg   timer: implement ...
136
  	} while (0)
fc683995a   Tejun Heo   timer: Clean up t...
137
138
  #define setup_timer(timer, fn, data)					\
  	__setup_timer((timer), (fn), (data), 0)
6f2b9b9a9   Johannes Berg   timer: implement ...
139
  #define setup_timer_on_stack(timer, fn, data)				\
fc683995a   Tejun Heo   timer: Clean up t...
140
  	__setup_timer_on_stack((timer), (fn), (data), 0)
8cadd2831   Jesse Barnes   timer: add on-sta...
141
  #define setup_deferrable_timer_on_stack(timer, fn, data)		\
fc683995a   Tejun Heo   timer: Clean up t...
142
  	__setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE)
8cadd2831   Jesse Barnes   timer: add on-sta...
143

45f8bde0d   Robert P. J. Day   [PATCH] fix vario...
144
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Thomas Gleixner   timer: Use hlist ...
156
  	return timer->entry.pprev != NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
160
  }
  
  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
161
  extern int mod_timer(struct timer_list *timer, unsigned long expires);
74019224a   Ingo Molnar   timers: add mod_t...
162
  extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
597d02757   Arun R Bharadwaj   timers: Framework...
163
  extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164

3bbb9ec94   Arjan van de Ven   timers: Introduce...
165
  extern void set_timer_slack(struct timer_list *time, int slack_hz);
597d02757   Arun R Bharadwaj   timers: Framework...
166
167
  #define TIMER_NOT_PINNED	0
  #define TIMER_PINNED		1
fd064b9b7   Thomas Gleixner   [PATCH] Extend ne...
168
  /*
eaad084bb   Thomas Gleixner   NOHZ: prevent mul...
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   Ingo Molnar   [PATCH] Add debug...
175
176
177
   * Timer-statistics info:
   */
  #ifdef CONFIG_TIMER_STATS
507e12315   Heiko Carstens   timer stats: Opti...
178
  extern int timer_stats_active;
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
179
180
181
  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...
182
  				     void *timerf, char *comm, u32 flags);
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
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   Heiko Carstens   timer stats: Opti...
189
190
  	if (likely(!timer_stats_active))
  		return;
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
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   Ingo Molnar   [PATCH] Add debug...
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   Ingo Molnar   timers: add mod_t...
210
  extern void add_timer(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211

6f1bc451e   Yong Zhang   timer: Make try_t...
212
  extern int try_to_del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
  #ifdef CONFIG_SMP
    extern int del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
  #else
fd450b731   Oleg Nesterov   [PATCH] timers: i...
216
  # define del_timer_sync(t)		del_timer(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217
  #endif
55c888d6d   Oleg Nesterov   [PATCH] timers fi...
218
  #define del_singleshot_timer_sync(t) del_timer_sync(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
220
  extern void init_timers(void);
  extern void run_local_timers(void);
05cfb614d   Roman Zippel   [PATCH] hrtimers:...
221
  struct hrtimer;
c9cb2e3d7   Thomas Gleixner   [PATCH] hrtimers:...
222
  extern enum hrtimer_restart it_real_fn(struct hrtimer *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223

bc7a34b8b   Thomas Gleixner   timer: Reduce tim...
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   Arjan van de Ven   [PATCH] round_jif...
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   Alan Stern   Add round_jiffies...
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   Linus Torvalds   Linux-2.6.12-rc2
240
  #endif