]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/ofed/include/linux/wait.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / ofed / include / linux / wait.h
1 /*-
2  * Copyright (c) 2010 Isilon Systems, Inc.
3  * Copyright (c) 2010 iX Systems, Inc.
4  * Copyright (c) 2010 Panasas, Inc.
5  * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice unmodified, this list of conditions, and the following
13  *    disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 #ifndef _LINUX_WAIT_H_
30 #define _LINUX_WAIT_H_
31
32 #include <linux/spinlock.h>
33 #include <linux/sched.h>
34 #include <linux/list.h>
35
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/sleepqueue.h>
39 #include <sys/kernel.h>
40 #include <sys/proc.h>
41
42 struct __wait_queue_head {
43         unsigned int    wchan;
44 };
45 typedef struct __wait_queue_head wait_queue_head_t;
46
47 #define init_waitqueue_head(x)
48
49 static inline void
50 __wake_up(struct __wait_queue_head *q, int all)
51 {
52         int wakeup_swapper;
53         void *c;
54
55         c = &q->wchan;
56         sleepq_lock(c);
57         if (all)
58                 wakeup_swapper = sleepq_broadcast(c, SLEEPQ_SLEEP, 0, 0);
59         else
60                 wakeup_swapper = sleepq_signal(c, SLEEPQ_SLEEP, 0, 0);
61         sleepq_release(c);
62         if (wakeup_swapper)
63                 kick_proc0();
64 }
65
66 #define wake_up(q)                              __wake_up(q, 0)
67 #define wake_up_nr(q, nr)                       __wake_up(q, 1)
68 #define wake_up_all(q)                          __wake_up(q, 1)
69 #define wake_up_interruptible(q)                __wake_up(q, 0)
70 #define wake_up_interruptible_nr(q, nr)         __wake_up(q, 1)
71 #define wake_up_interruptible_all(q, nr)        __wake_up(q, 1)
72
73 #define wait_event(q, cond)                                             \
74 do {                                                                    \
75         void *c = &(q).wchan;                                           \
76         if (!(cond)) {                                                  \
77                 for (;;) {                                              \
78                         sleepq_lock(c);                                 \
79                         if (cond) {                                     \
80                                 sleepq_release(c);                      \
81                                 break;                                  \
82                         }                                               \
83                         sleepq_add(c, NULL, "completion", SLEEPQ_SLEEP, 0); \
84                         sleepq_wait(c, 0);                              \
85                 }                                                       \
86         }                                                               \
87 } while (0)
88
89 #define wait_event_interruptible(q, cond)                               \
90 ({                                                                      \
91         void *c = &(q).wchan;                                           \
92         int _error;                                                     \
93                                                                         \
94         _error = 0;                                                     \
95         if (!(cond)) {                                                  \
96                 for (; _error == 0;) {                                  \
97                         sleepq_lock(c);                                 \
98                         if (cond) {                                     \
99                                 sleepq_release(c);                      \
100                                 break;                                  \
101                         }                                               \
102                         sleepq_add(c, NULL, "completion",               \
103                             SLEEPQ_SLEEP | SLEEPQ_INTERRUPTIBLE, 0);    \
104                         if (sleepq_wait_sig(c, 0))                      \
105                                 _error = -ERESTARTSYS;                  \
106                 }                                                       \
107         }                                                               \
108         -_error;                                                        \
109 })
110
111 #define DEFINE_WAIT(x)
112
113 #endif  /* _LINUX_WAIT_H_ */