Blame view
include/linux/timer.h
8.44 KB
b24413180 License cleanup: ... |
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4c Linux-2.6.12-rc2 |
2 3 |
#ifndef _LINUX_TIMER_H #define _LINUX_TIMER_H |
1da177e4c Linux-2.6.12-rc2 |
4 |
#include <linux/list.h> |
82f67cd9f [PATCH] Add debug... |
5 |
#include <linux/ktime.h> |
1da177e4c Linux-2.6.12-rc2 |
6 |
#include <linux/stddef.h> |
c6f3a97f8 debugobjects: add... |
7 |
#include <linux/debugobjects.h> |
6f2b9b9a9 timer: implement ... |
8 |
#include <linux/stringify.h> |
1da177e4c Linux-2.6.12-rc2 |
9 |
|
a6fa8e5a6 time: clean hunga... |
10 |
struct tvec_base; |
1da177e4c Linux-2.6.12-rc2 |
11 12 |
struct timer_list { |
3bbb9ec94 timers: Introduce... |
13 14 15 16 |
/* * All fields that change during normal runtime grouped to the * same cacheline */ |
0eeda71bc 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 timers: Introduce... |
22 |
|
6f2b9b9a9 timer: implement ... |
23 |
#ifdef CONFIG_LOCKDEP |
0eeda71bc timer: Replace ti... |
24 |
struct lockdep_map lockdep_map; |
6f2b9b9a9 timer: implement ... |
25 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
26 |
}; |
6f2b9b9a9 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 timer: Permit sta... |
39 |
/* |
dd6414b50 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 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 timer: Permit sta... |
52 |
*/ |
b0d6e2dcb timers: Reduce th... |
53 54 |
#define TIMER_CPUMASK 0x0003FFFF #define TIMER_MIGRATING 0x00040000 |
0eeda71bc timer: Replace ti... |
55 |
#define TIMER_BASEMASK (TIMER_CPUMASK | TIMER_MIGRATING) |
b0d6e2dcb timers: Reduce th... |
56 57 58 |
#define TIMER_DEFERRABLE 0x00080000 #define TIMER_PINNED 0x00100000 #define TIMER_IRQSAFE 0x00200000 |
500462a9d timers: Switch to... |
59 60 |
#define TIMER_ARRAYSHIFT 22 #define TIMER_ARRAYMASK 0xFFC00000 |
dd6414b50 timer: Permit sta... |
61 |
|
8a58a34ba timers: Make flag... |
62 |
#define TIMER_TRACE_FLAGMASK (TIMER_MIGRATING | TIMER_DEFERRABLE | TIMER_PINNED | TIMER_IRQSAFE) |
fc683995a timer: Clean up t... |
63 |
#define __TIMER_INITIALIZER(_function, _expires, _data, _flags) { \ |
1dabbcec2 timer: Use hlist ... |
64 |
.entry = { .next = TIMER_ENTRY_STATIC }, \ |
1da177e4c Linux-2.6.12-rc2 |
65 66 67 |
.function = (_function), \ .expires = (_expires), \ .data = (_data), \ |
0eeda71bc timer: Replace ti... |
68 |
.flags = (_flags), \ |
6f2b9b9a9 timer: implement ... |
69 70 |
__TIMER_LOCKDEP_MAP_INITIALIZER( \ __FILE__ ":" __stringify(__LINE__)) \ |
1da177e4c Linux-2.6.12-rc2 |
71 |
} |
fc683995a timer: Clean up t... |
72 73 |
#define TIMER_INITIALIZER(_function, _expires, _data) \ __TIMER_INITIALIZER((_function), (_expires), (_data), 0) |
dd6414b50 timer: Permit sta... |
74 |
|
e675447bd timers: Make 'pin... |
75 76 |
#define TIMER_PINNED_INITIALIZER(_function, _expires, _data) \ __TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_PINNED) |
fc683995a timer: Clean up t... |
77 78 |
#define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data) \ __TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE) |
dd6414b50 timer: Permit sta... |
79 |
|
e675447bd timers: Make 'pin... |
80 81 |
#define TIMER_PINNED_DEFERRED_INITIALIZER(_function, _expires, _data) \ __TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE | TIMER_PINNED) |
8d06afab7 [PATCH] timer ini... |
82 83 84 |
#define DEFINE_TIMER(_name, _function, _expires, _data) \ struct timer_list _name = \ TIMER_INITIALIZER(_function, _expires, _data) |
fc683995a 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 timer: implement ... |
87 |
|
5a9af38d0 timer: Relocate d... |
88 89 |
#ifdef CONFIG_DEBUG_OBJECTS_TIMERS extern void init_timer_on_stack_key(struct timer_list *timer, |
fc683995a timer: Clean up t... |
90 |
unsigned int flags, const char *name, |
5a9af38d0 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 timer: Clean up t... |
96 |
unsigned int flags, const char *name, |
5a9af38d0 timer: Relocate d... |
97 98 |
struct lock_class_key *key) { |
fc683995a timer: Clean up t... |
99 |
init_timer_key(timer, flags, name, key); |
5a9af38d0 timer: Relocate d... |
100 101 |
} #endif |
6f2b9b9a9 timer: implement ... |
102 |
#ifdef CONFIG_LOCKDEP |
fc683995a timer: Clean up t... |
103 |
#define __init_timer(_timer, _flags) \ |
6f2b9b9a9 timer: implement ... |
104 105 |
do { \ static struct lock_class_key __key; \ |
fc683995a timer: Clean up t... |
106 |
init_timer_key((_timer), (_flags), #_timer, &__key); \ |
6f2b9b9a9 timer: implement ... |
107 |
} while (0) |
fc683995a timer: Clean up t... |
108 |
#define __init_timer_on_stack(_timer, _flags) \ |
6f2b9b9a9 timer: implement ... |
109 110 |
do { \ static struct lock_class_key __key; \ |
fc683995a timer: Clean up t... |
111 |
init_timer_on_stack_key((_timer), (_flags), #_timer, &__key); \ |
6f2b9b9a9 timer: implement ... |
112 |
} while (0) |
fc683995a 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 timer: implement ... |
119 |
|
fc683995a timer: Clean up t... |
120 121 |
#define init_timer(timer) \ __init_timer((timer), 0) |
e675447bd timers: Make 'pin... |
122 123 |
#define init_timer_pinned(timer) \ __init_timer((timer), TIMER_PINNED) |
fc683995a timer: Clean up t... |
124 125 |
#define init_timer_deferrable(timer) \ __init_timer((timer), TIMER_DEFERRABLE) |
e675447bd timers: Make 'pin... |
126 127 |
#define init_timer_pinned_deferrable(timer) \ __init_timer((timer), TIMER_DEFERRABLE | TIMER_PINNED) |
6f2b9b9a9 timer: implement ... |
128 |
#define init_timer_on_stack(timer) \ |
fc683995a timer: Clean up t... |
129 130 131 |
__init_timer_on_stack((timer), 0) #define __setup_timer(_timer, _fn, _data, _flags) \ |
6f2b9b9a9 timer: implement ... |
132 |
do { \ |
fc683995a timer: Clean up t... |
133 134 135 |
__init_timer((_timer), (_flags)); \ (_timer)->function = (_fn); \ (_timer)->data = (_data); \ |
6f2b9b9a9 timer: implement ... |
136 |
} while (0) |
fc683995a timer: Clean up t... |
137 |
#define __setup_timer_on_stack(_timer, _fn, _data, _flags) \ |
6f2b9b9a9 timer: implement ... |
138 |
do { \ |
fc683995a timer: Clean up t... |
139 140 141 |
__init_timer_on_stack((_timer), (_flags)); \ (_timer)->function = (_fn); \ (_timer)->data = (_data); \ |
6f2b9b9a9 timer: implement ... |
142 |
} while (0) |
fc683995a timer: Clean up t... |
143 144 |
#define setup_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), 0) |
e675447bd timers: Make 'pin... |
145 146 |
#define setup_pinned_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), TIMER_PINNED) |
6f3ffc191 timer: add setup_... |
147 148 |
#define setup_deferrable_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), TIMER_DEFERRABLE) |
e675447bd timers: Make 'pin... |
149 150 |
#define setup_pinned_deferrable_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), TIMER_DEFERRABLE | TIMER_PINNED) |
6f2b9b9a9 timer: implement ... |
151 |
#define setup_timer_on_stack(timer, fn, data) \ |
fc683995a timer: Clean up t... |
152 |
__setup_timer_on_stack((timer), (fn), (data), 0) |
e675447bd timers: Make 'pin... |
153 154 |
#define setup_pinned_timer_on_stack(timer, fn, data) \ __setup_timer_on_stack((timer), (fn), (data), TIMER_PINNED) |
8cadd2831 timer: add on-sta... |
155 |
#define setup_deferrable_timer_on_stack(timer, fn, data) \ |
fc683995a timer: Clean up t... |
156 |
__setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE) |
e675447bd 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 timer: add on-sta... |
159 |
|
686fef928 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 [PATCH] fix vario... |
173 |
/** |
1da177e4c 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 timer: Use hlist ... |
185 |
return timer->entry.pprev != NULL; |
1da177e4c 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 Linux-2.6.12-rc2 |
190 |
extern int mod_timer(struct timer_list *timer, unsigned long expires); |
74019224a timers: add mod_t... |
191 |
extern int mod_timer_pending(struct timer_list *timer, unsigned long expires); |
1da177e4c Linux-2.6.12-rc2 |
192 |
|
fd064b9b7 [PATCH] Extend ne... |
193 |
/* |
eaad084bb 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 timers: add mod_t... |
198 |
extern void add_timer(struct timer_list *timer); |
1da177e4c Linux-2.6.12-rc2 |
199 |
|
6f1bc451e timer: Make try_t... |
200 |
extern int try_to_del_timer_sync(struct timer_list *timer); |
1da177e4c Linux-2.6.12-rc2 |
201 202 |
#ifdef CONFIG_SMP extern int del_timer_sync(struct timer_list *timer); |
1da177e4c Linux-2.6.12-rc2 |
203 |
#else |
fd450b731 [PATCH] timers: i... |
204 |
# define del_timer_sync(t) del_timer(t) |
1da177e4c Linux-2.6.12-rc2 |
205 |
#endif |
55c888d6d [PATCH] timers fi... |
206 |
#define del_singleshot_timer_sync(t) del_timer_sync(t) |
1da177e4c Linux-2.6.12-rc2 |
207 208 |
extern void init_timers(void); extern void run_local_timers(void); |
05cfb614d [PATCH] hrtimers:... |
209 |
struct hrtimer; |
c9cb2e3d7 [PATCH] hrtimers:... |
210 |
extern enum hrtimer_restart it_real_fn(struct hrtimer *); |
1da177e4c Linux-2.6.12-rc2 |
211 |
|
bc7a34b8b timer: Reduce tim... |
212 |
#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) |
b2d5bfea2 sched/headers, ti... |
213 |
struct ctl_table; |
bc7a34b8b 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 [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 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 timers/core: Conv... |
228 |
#ifdef CONFIG_HOTPLUG_CPU |
6fae6de72 timers: Reinitial... |
229 |
int timers_prepare_cpu(unsigned int cpu); |
24f73b997 timers/core: Conv... |
230 231 |
int timers_dead_cpu(unsigned int cpu); #else |
6fae6de72 timers: Reinitial... |
232 233 |
#define timers_prepare_cpu NULL #define timers_dead_cpu NULL |
24f73b997 timers/core: Conv... |
234 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
235 |
#endif |