diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/timer.h | 123 |
1 files changed, 39 insertions, 84 deletions
diff --git a/include/linux/timer.h b/include/linux/timer.h index 1d364aed1802..3f95c1fa615e 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h | |||
@@ -62,136 +62,91 @@ extern struct tvec_base boot_tvec_bases; | |||
62 | 62 | ||
63 | #define TIMER_FLAG_MASK 0x1LU | 63 | #define TIMER_FLAG_MASK 0x1LU |
64 | 64 | ||
65 | #define TIMER_INITIALIZER(_function, _expires, _data) { \ | 65 | #define __TIMER_INITIALIZER(_function, _expires, _data, _flags) { \ |
66 | .entry = { .prev = TIMER_ENTRY_STATIC }, \ | 66 | .entry = { .prev = TIMER_ENTRY_STATIC }, \ |
67 | .function = (_function), \ | 67 | .function = (_function), \ |
68 | .expires = (_expires), \ | 68 | .expires = (_expires), \ |
69 | .data = (_data), \ | 69 | .data = (_data), \ |
70 | .base = &boot_tvec_bases, \ | 70 | .base = (void *)((unsigned long)&boot_tvec_bases + (_flags)), \ |
71 | .slack = -1, \ | 71 | .slack = -1, \ |
72 | __TIMER_LOCKDEP_MAP_INITIALIZER( \ | 72 | __TIMER_LOCKDEP_MAP_INITIALIZER( \ |
73 | __FILE__ ":" __stringify(__LINE__)) \ | 73 | __FILE__ ":" __stringify(__LINE__)) \ |
74 | } | 74 | } |
75 | 75 | ||
76 | #define TBASE_MAKE_DEFERRED(ptr) ((struct tvec_base *) \ | 76 | #define TIMER_INITIALIZER(_function, _expires, _data) \ |
77 | ((unsigned char *)(ptr) + TIMER_DEFERRABLE)) | 77 | __TIMER_INITIALIZER((_function), (_expires), (_data), 0) |
78 | 78 | ||
79 | #define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data) {\ | 79 | #define TIMER_DEFERRED_INITIALIZER(_function, _expires, _data) \ |
80 | .entry = { .prev = TIMER_ENTRY_STATIC }, \ | 80 | __TIMER_INITIALIZER((_function), (_expires), (_data), TIMER_DEFERRABLE) |
81 | .function = (_function), \ | ||
82 | .expires = (_expires), \ | ||
83 | .data = (_data), \ | ||
84 | .base = TBASE_MAKE_DEFERRED(&boot_tvec_bases), \ | ||
85 | __TIMER_LOCKDEP_MAP_INITIALIZER( \ | ||
86 | __FILE__ ":" __stringify(__LINE__)) \ | ||
87 | } | ||
88 | 81 | ||
89 | #define DEFINE_TIMER(_name, _function, _expires, _data) \ | 82 | #define DEFINE_TIMER(_name, _function, _expires, _data) \ |
90 | struct timer_list _name = \ | 83 | struct timer_list _name = \ |
91 | TIMER_INITIALIZER(_function, _expires, _data) | 84 | TIMER_INITIALIZER(_function, _expires, _data) |
92 | 85 | ||
93 | void init_timer_key(struct timer_list *timer, | 86 | void init_timer_key(struct timer_list *timer, unsigned int flags, |
94 | const char *name, | 87 | const char *name, struct lock_class_key *key); |
95 | struct lock_class_key *key); | ||
96 | void init_timer_deferrable_key(struct timer_list *timer, | ||
97 | const char *name, | ||
98 | struct lock_class_key *key); | ||
99 | 88 | ||
100 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS | 89 | #ifdef CONFIG_DEBUG_OBJECTS_TIMERS |
101 | extern void init_timer_on_stack_key(struct timer_list *timer, | 90 | extern void init_timer_on_stack_key(struct timer_list *timer, |
102 | const char *name, | 91 | unsigned int flags, const char *name, |
103 | struct lock_class_key *key); | 92 | struct lock_class_key *key); |
104 | extern void destroy_timer_on_stack(struct timer_list *timer); | 93 | extern void destroy_timer_on_stack(struct timer_list *timer); |
105 | #else | 94 | #else |
106 | static inline void destroy_timer_on_stack(struct timer_list *timer) { } | 95 | static inline void destroy_timer_on_stack(struct timer_list *timer) { } |
107 | static inline void init_timer_on_stack_key(struct timer_list *timer, | 96 | static inline void init_timer_on_stack_key(struct timer_list *timer, |
108 | const char *name, | 97 | unsigned int flags, const char *name, |
109 | struct lock_class_key *key) | 98 | struct lock_class_key *key) |
110 | { | 99 | { |
111 | init_timer_key(timer, name, key); | 100 | init_timer_key(timer, flags, name, key); |
112 | } | 101 | } |
113 | #endif | 102 | #endif |
114 | 103 | ||
115 | #ifdef CONFIG_LOCKDEP | 104 | #ifdef CONFIG_LOCKDEP |
116 | #define init_timer(timer) \ | 105 | #define __init_timer(_timer, _flags) \ |
117 | do { \ | 106 | do { \ |
118 | static struct lock_class_key __key; \ | 107 | static struct lock_class_key __key; \ |
119 | init_timer_key((timer), #timer, &__key); \ | 108 | init_timer_key((_timer), (_flags), #_timer, &__key); \ |
120 | } while (0) | 109 | } while (0) |
121 | 110 | ||
122 | #define init_timer_deferrable(timer) \ | 111 | #define __init_timer_on_stack(_timer, _flags) \ |
123 | do { \ | 112 | do { \ |
124 | static struct lock_class_key __key; \ | 113 | static struct lock_class_key __key; \ |
125 | init_timer_deferrable_key((timer), #timer, &__key); \ | 114 | init_timer_on_stack_key((_timer), (_flags), #_timer, &__key); \ |
126 | } while (0) | 115 | } while (0) |
116 | #else | ||
117 | #define __init_timer(_timer, _flags) \ | ||
118 | init_timer_key((_timer), (_flags), NULL, NULL) | ||
119 | #define __init_timer_on_stack(_timer, _flags) \ | ||
120 | init_timer_on_stack_key((_timer), (_flags), NULL, NULL) | ||
121 | #endif | ||
127 | 122 | ||
123 | #define init_timer(timer) \ | ||
124 | __init_timer((timer), 0) | ||
125 | #define init_timer_deferrable(timer) \ | ||
126 | __init_timer((timer), TIMER_DEFERRABLE) | ||
128 | #define init_timer_on_stack(timer) \ | 127 | #define init_timer_on_stack(timer) \ |
128 | __init_timer_on_stack((timer), 0) | ||
129 | |||
130 | #define __setup_timer(_timer, _fn, _data, _flags) \ | ||
129 | do { \ | 131 | do { \ |
130 | static struct lock_class_key __key; \ | 132 | __init_timer((_timer), (_flags)); \ |
131 | init_timer_on_stack_key((timer), #timer, &__key); \ | 133 | (_timer)->function = (_fn); \ |
134 | (_timer)->data = (_data); \ | ||
132 | } while (0) | 135 | } while (0) |
133 | 136 | ||
134 | #define setup_timer(timer, fn, data) \ | 137 | #define __setup_timer_on_stack(_timer, _fn, _data, _flags) \ |
135 | do { \ | 138 | do { \ |
136 | static struct lock_class_key __key; \ | 139 | __init_timer_on_stack((_timer), (_flags)); \ |
137 | setup_timer_key((timer), #timer, &__key, (fn), (data));\ | 140 | (_timer)->function = (_fn); \ |
141 | (_timer)->data = (_data); \ | ||
138 | } while (0) | 142 | } while (0) |
139 | 143 | ||
144 | #define setup_timer(timer, fn, data) \ | ||
145 | __setup_timer((timer), (fn), (data), 0) | ||
140 | #define setup_timer_on_stack(timer, fn, data) \ | 146 | #define setup_timer_on_stack(timer, fn, data) \ |
141 | do { \ | 147 | __setup_timer_on_stack((timer), (fn), (data), 0) |
142 | static struct lock_class_key __key; \ | ||
143 | setup_timer_on_stack_key((timer), #timer, &__key, \ | ||
144 | (fn), (data)); \ | ||
145 | } while (0) | ||
146 | #define setup_deferrable_timer_on_stack(timer, fn, data) \ | 148 | #define setup_deferrable_timer_on_stack(timer, fn, data) \ |
147 | do { \ | 149 | __setup_timer_on_stack((timer), (fn), (data), TIMER_DEFERRABLE) |
148 | static struct lock_class_key __key; \ | ||
149 | setup_deferrable_timer_on_stack_key((timer), #timer, \ | ||
150 | &__key, (fn), \ | ||
151 | (data)); \ | ||
152 | } while (0) | ||
153 | #else | ||
154 | #define init_timer(timer)\ | ||
155 | init_timer_key((timer), NULL, NULL) | ||
156 | #define init_timer_deferrable(timer)\ | ||
157 | init_timer_deferrable_key((timer), NULL, NULL) | ||
158 | #define init_timer_on_stack(timer)\ | ||
159 | init_timer_on_stack_key((timer), NULL, NULL) | ||
160 | #define setup_timer(timer, fn, data)\ | ||
161 | setup_timer_key((timer), NULL, NULL, (fn), (data)) | ||
162 | #define setup_timer_on_stack(timer, fn, data)\ | ||
163 | setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) | ||
164 | #define setup_deferrable_timer_on_stack(timer, fn, data)\ | ||
165 | setup_deferrable_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) | ||
166 | #endif | ||
167 | |||
168 | static inline void setup_timer_key(struct timer_list * timer, | ||
169 | const char *name, | ||
170 | struct lock_class_key *key, | ||
171 | void (*function)(unsigned long), | ||
172 | unsigned long data) | ||
173 | { | ||
174 | timer->function = function; | ||
175 | timer->data = data; | ||
176 | init_timer_key(timer, name, key); | ||
177 | } | ||
178 | |||
179 | static inline void setup_timer_on_stack_key(struct timer_list *timer, | ||
180 | const char *name, | ||
181 | struct lock_class_key *key, | ||
182 | void (*function)(unsigned long), | ||
183 | unsigned long data) | ||
184 | { | ||
185 | timer->function = function; | ||
186 | timer->data = data; | ||
187 | init_timer_on_stack_key(timer, name, key); | ||
188 | } | ||
189 | |||
190 | extern void setup_deferrable_timer_on_stack_key(struct timer_list *timer, | ||
191 | const char *name, | ||
192 | struct lock_class_key *key, | ||
193 | void (*function)(unsigned long), | ||
194 | unsigned long data); | ||
195 | 150 | ||
196 | /** | 151 | /** |
197 | * timer_pending - is a timer pending? | 152 | * timer_pending - is a timer pending? |