This source file includes following definitions.
- swait_active
- swq_has_sleeper
1
2 #ifndef _LINUX_SWAIT_H
3 #define _LINUX_SWAIT_H
4
5 #include <linux/list.h>
6 #include <linux/stddef.h>
7 #include <linux/spinlock.h>
8 #include <linux/wait.h>
9 #include <asm/current.h>
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 struct task_struct;
55
56 struct swait_queue_head {
57 raw_spinlock_t lock;
58 struct list_head task_list;
59 };
60
61 struct swait_queue {
62 struct task_struct *task;
63 struct list_head task_list;
64 };
65
66 #define __SWAITQUEUE_INITIALIZER(name) { \
67 .task = current, \
68 .task_list = LIST_HEAD_INIT((name).task_list), \
69 }
70
71 #define DECLARE_SWAITQUEUE(name) \
72 struct swait_queue name = __SWAITQUEUE_INITIALIZER(name)
73
74 #define __SWAIT_QUEUE_HEAD_INITIALIZER(name) { \
75 .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \
76 .task_list = LIST_HEAD_INIT((name).task_list), \
77 }
78
79 #define DECLARE_SWAIT_QUEUE_HEAD(name) \
80 struct swait_queue_head name = __SWAIT_QUEUE_HEAD_INITIALIZER(name)
81
82 extern void __init_swait_queue_head(struct swait_queue_head *q, const char *name,
83 struct lock_class_key *key);
84
85 #define init_swait_queue_head(q) \
86 do { \
87 static struct lock_class_key __key; \
88 __init_swait_queue_head((q), #q, &__key); \
89 } while (0)
90
91 #ifdef CONFIG_LOCKDEP
92 # define __SWAIT_QUEUE_HEAD_INIT_ONSTACK(name) \
93 ({ init_swait_queue_head(&name); name; })
94 # define DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(name) \
95 struct swait_queue_head name = __SWAIT_QUEUE_HEAD_INIT_ONSTACK(name)
96 #else
97 # define DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(name) \
98 DECLARE_SWAIT_QUEUE_HEAD(name)
99 #endif
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 static inline int swait_active(struct swait_queue_head *wq)
135 {
136 return !list_empty(&wq->task_list);
137 }
138
139
140
141
142
143
144
145
146
147 static inline bool swq_has_sleeper(struct swait_queue_head *wq)
148 {
149
150
151
152
153
154
155
156 smp_mb();
157 return swait_active(wq);
158 }
159
160 extern void swake_up_one(struct swait_queue_head *q);
161 extern void swake_up_all(struct swait_queue_head *q);
162 extern void swake_up_locked(struct swait_queue_head *q);
163
164 extern void prepare_to_swait_exclusive(struct swait_queue_head *q, struct swait_queue *wait, int state);
165 extern long prepare_to_swait_event(struct swait_queue_head *q, struct swait_queue *wait, int state);
166
167 extern void __finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
168 extern void finish_swait(struct swait_queue_head *q, struct swait_queue *wait);
169
170
171 #define ___swait_event(wq, condition, state, ret, cmd) \
172 ({ \
173 __label__ __out; \
174 struct swait_queue __wait; \
175 long __ret = ret; \
176 \
177 INIT_LIST_HEAD(&__wait.task_list); \
178 for (;;) { \
179 long __int = prepare_to_swait_event(&wq, &__wait, state);\
180 \
181 if (condition) \
182 break; \
183 \
184 if (___wait_is_interruptible(state) && __int) { \
185 __ret = __int; \
186 goto __out; \
187 } \
188 \
189 cmd; \
190 } \
191 finish_swait(&wq, &__wait); \
192 __out: __ret; \
193 })
194
195 #define __swait_event(wq, condition) \
196 (void)___swait_event(wq, condition, TASK_UNINTERRUPTIBLE, 0, \
197 schedule())
198
199 #define swait_event_exclusive(wq, condition) \
200 do { \
201 if (condition) \
202 break; \
203 __swait_event(wq, condition); \
204 } while (0)
205
206 #define __swait_event_timeout(wq, condition, timeout) \
207 ___swait_event(wq, ___wait_cond_timeout(condition), \
208 TASK_UNINTERRUPTIBLE, timeout, \
209 __ret = schedule_timeout(__ret))
210
211 #define swait_event_timeout_exclusive(wq, condition, timeout) \
212 ({ \
213 long __ret = timeout; \
214 if (!___wait_cond_timeout(condition)) \
215 __ret = __swait_event_timeout(wq, condition, timeout); \
216 __ret; \
217 })
218
219 #define __swait_event_interruptible(wq, condition) \
220 ___swait_event(wq, condition, TASK_INTERRUPTIBLE, 0, \
221 schedule())
222
223 #define swait_event_interruptible_exclusive(wq, condition) \
224 ({ \
225 int __ret = 0; \
226 if (!(condition)) \
227 __ret = __swait_event_interruptible(wq, condition); \
228 __ret; \
229 })
230
231 #define __swait_event_interruptible_timeout(wq, condition, timeout) \
232 ___swait_event(wq, ___wait_cond_timeout(condition), \
233 TASK_INTERRUPTIBLE, timeout, \
234 __ret = schedule_timeout(__ret))
235
236 #define swait_event_interruptible_timeout_exclusive(wq, condition, timeout)\
237 ({ \
238 long __ret = timeout; \
239 if (!___wait_cond_timeout(condition)) \
240 __ret = __swait_event_interruptible_timeout(wq, \
241 condition, timeout); \
242 __ret; \
243 })
244
245 #define __swait_event_idle(wq, condition) \
246 (void)___swait_event(wq, condition, TASK_IDLE, 0, schedule())
247
248
249
250
251
252
253
254
255
256
257
258
259
260 #define swait_event_idle_exclusive(wq, condition) \
261 do { \
262 if (condition) \
263 break; \
264 __swait_event_idle(wq, condition); \
265 } while (0)
266
267 #define __swait_event_idle_timeout(wq, condition, timeout) \
268 ___swait_event(wq, ___wait_cond_timeout(condition), \
269 TASK_IDLE, timeout, \
270 __ret = schedule_timeout(__ret))
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291 #define swait_event_idle_timeout_exclusive(wq, condition, timeout) \
292 ({ \
293 long __ret = timeout; \
294 if (!___wait_cond_timeout(condition)) \
295 __ret = __swait_event_idle_timeout(wq, \
296 condition, timeout); \
297 __ret; \
298 })
299
300 #endif