Blame view

include/linux/timer.h 8.44 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
  #ifndef _LINUX_TIMER_H
  #define _LINUX_TIMER_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
  #include <linux/list.h>
82f67cd9f   Ingo Molnar   [PATCH] Add debug...
5
  #include <linux/ktime.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
  #include <linux/stddef.h>
c6f3a97f8   Thomas Gleixner   debugobjects: add...
7
  #include <linux/debugobjects.h>
6f2b9b9a9   Johannes Berg   timer: implement ...
8
  #include <linux/stringify.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9

a6fa8e5a6   Pavel Machek   time: clean hunga...
10
  struct tvec_base;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
  
  struct timer_list {
3bbb9ec94   Arjan van de Ven   timers: Introduce...
13
14
15
16
  	/*
  	 * All fields that change during normal runtime grouped to the
  	 * same cacheline
  	 */
0eeda71bc   Thomas Gleixner   timer: Replace ti...
17
18
19
20
21
  	struct hlist_node	entry;
  	unsigned long		expires;
  	void			(*function)(unsigned long);
  	unsigned long		data;
  	u32			flags;
3bbb9ec94   Arjan van de Ven   timers: Introduce...
22

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

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

e675447bd   Thomas Gleixner   timers: Make 'pin...
75
76
  #define TIMER_PINNED_INITIALIZER(_function, _expires, _data)	\
  	__TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_PINNED)
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

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

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

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

686fef928   Kees Cook   timer: Prepare to...
160
161
162
163
164
165
166
167
168
169
170
171
172
  #define TIMER_DATA_TYPE		unsigned long
  #define TIMER_FUNC_TYPE		void (*)(TIMER_DATA_TYPE)
  
  static inline void timer_setup(struct timer_list *timer,
  			       void (*callback)(struct timer_list *),
  			       unsigned int flags)
  {
  	__setup_timer(timer, (TIMER_FUNC_TYPE)callback,
  		      (TIMER_DATA_TYPE)timer, flags);
  }
  
  #define from_timer(var, callback_timer, timer_fieldname) \
  	container_of(callback_timer, typeof(*var), timer_fieldname)
45f8bde0d   Robert P. J. Day   [PATCH] fix vario...
173
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
177
178
179
180
181
182
183
184
   * 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 ...
185
  	return timer->entry.pprev != NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
188
189
  }
  
  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
190
  extern int mod_timer(struct timer_list *timer, unsigned long expires);
74019224a   Ingo Molnar   timers: add mod_t...
191
  extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192

fd064b9b7   Thomas Gleixner   [PATCH] Extend ne...
193
  /*
eaad084bb   Thomas Gleixner   NOHZ: prevent mul...
194
195
196
197
   * 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)
74019224a   Ingo Molnar   timers: add mod_t...
198
  extern void add_timer(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199

6f1bc451e   Yong Zhang   timer: Make try_t...
200
  extern int try_to_del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
  #ifdef CONFIG_SMP
    extern int del_timer_sync(struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
  #else
fd450b731   Oleg Nesterov   [PATCH] timers: i...
204
  # define del_timer_sync(t)		del_timer(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
  #endif
55c888d6d   Oleg Nesterov   [PATCH] timers fi...
206
  #define del_singleshot_timer_sync(t) del_timer_sync(t)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
208
  extern void init_timers(void);
  extern void run_local_timers(void);
05cfb614d   Roman Zippel   [PATCH] hrtimers:...
209
  struct hrtimer;
c9cb2e3d7   Thomas Gleixner   [PATCH] hrtimers:...
210
  extern enum hrtimer_restart it_real_fn(struct hrtimer *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211

bc7a34b8b   Thomas Gleixner   timer: Reduce tim...
212
  #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)
b2d5bfea2   Ingo Molnar   sched/headers, ti...
213
  struct ctl_table;
bc7a34b8b   Thomas Gleixner   timer: Reduce tim...
214
215
216
217
218
219
  
  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...
220
221
222
223
  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...
224
225
226
227
  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...
228
  #ifdef CONFIG_HOTPLUG_CPU
6fae6de72   Thomas Gleixner   timers: Reinitial...
229
  int timers_prepare_cpu(unsigned int cpu);
24f73b997   Richard Cochran   timers/core: Conv...
230
231
  int timers_dead_cpu(unsigned int cpu);
  #else
6fae6de72   Thomas Gleixner   timers: Reinitial...
232
233
  #define timers_prepare_cpu	NULL
  #define timers_dead_cpu		NULL
24f73b997   Richard Cochran   timers/core: Conv...
234
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
  #endif