Deleted Added
full compact
completion.h (273246) completion.h (282513)
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

--- 18 unchanged lines hidden (view full) ---

27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef _LINUX_COMPLETION_H_
31#define _LINUX_COMPLETION_H_
32
33#include <linux/errno.h>
34
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

--- 18 unchanged lines hidden (view full) ---

27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef _LINUX_COMPLETION_H_
31#define _LINUX_COMPLETION_H_
32
33#include <linux/errno.h>
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/sleepqueue.h>
38#include <sys/kernel.h>
39#include <sys/proc.h>
40
41struct completion {
42 unsigned int done;
43};
44
35struct completion {
36 unsigned int done;
37};
38
45#define INIT_COMPLETION(c) ((c).done = 0)
46#define init_completion(c) ((c)->done = 0)
39#define INIT_COMPLETION(c) \
40 ((c).done = 0)
41#define init_completion(c) \
42 ((c)->done = 0)
43#define complete(c) \
44 linux_complete_common((c), 0)
45#define complete_all(c) \
46 linux_complete_common((c), 1)
47#define wait_for_completion(c) \
48 linux_wait_for_common((c), 0)
49#define wait_for_completion_interuptible(c) \
50 linux_wait_for_common((c), 1)
51#define wait_for_completion_timeout(c, timeout) \
52 linux_wait_for_timeout_common((c), (timeout), 0)
53#define wait_for_completion_interruptible_timeout(c, timeout) \
54 linux_wait_for_timeout_common((c), (timeout), 1)
55#define try_wait_for_completion(c) \
56 linux_try_wait_for_completion(c)
57#define completion_done(c) \
58 linux_completion_done(c)
47
59
48static inline void
49_complete_common(struct completion *c, int all)
50{
51 int wakeup_swapper;
60extern void linux_complete_common(struct completion *, int);
61extern long linux_wait_for_common(struct completion *, int);
62extern long linux_wait_for_timeout_common(struct completion *, long, int);
63extern int linux_try_wait_for_completion(struct completion *);
64extern int linux_completion_done(struct completion *);
52
65
53 sleepq_lock(c);
54 c->done++;
55 if (all)
56 wakeup_swapper = sleepq_broadcast(c, SLEEPQ_SLEEP, 0, 0);
57 else
58 wakeup_swapper = sleepq_signal(c, SLEEPQ_SLEEP, 0, 0);
59 sleepq_release(c);
60 if (wakeup_swapper)
61 kick_proc0();
62}
63
64#define complete(c) _complete_common(c, 0)
65#define complete_all(c) _complete_common(c, 1)
66
67/*
68 * Indefinite wait for done != 0 with or without signals.
69 */
70static inline long
71_wait_for_common(struct completion *c, int flags)
72{
73
74 flags |= SLEEPQ_SLEEP;
75 for (;;) {
76 sleepq_lock(c);
77 if (c->done)
78 break;
79 sleepq_add(c, NULL, "completion", flags, 0);
80 if (flags & SLEEPQ_INTERRUPTIBLE) {
81 if (sleepq_wait_sig(c, 0) != 0)
82 return (-ERESTARTSYS);
83 } else
84 sleepq_wait(c, 0);
85 }
86 c->done--;
87 sleepq_release(c);
88
89 return (0);
90}
91
92#define wait_for_completion(c) _wait_for_common(c, 0)
93#define wait_for_completion_interuptible(c) \
94 _wait_for_common(c, SLEEPQ_INTERRUPTIBLE)
95
96static inline long
97_wait_for_timeout_common(struct completion *c, long timeout, int flags)
98{
99 long end;
100
101 end = ticks + timeout;
102 flags |= SLEEPQ_SLEEP;
103 for (;;) {
104 sleepq_lock(c);
105 if (c->done)
106 break;
107 sleepq_add(c, NULL, "completion", flags, 0);
108 sleepq_set_timeout(c, end - ticks);
109 if (flags & SLEEPQ_INTERRUPTIBLE) {
110 if (sleepq_timedwait_sig(c, 0) != 0)
111 return (-ERESTARTSYS);
112 } else
113 sleepq_timedwait(c, 0);
114 }
115 c->done--;
116 sleepq_release(c);
117 timeout = end - ticks;
118
119 return (timeout > 0 ? timeout : 1);
120}
121
122#define wait_for_completion_timeout(c, timeout) \
123 _wait_for_timeout_common(c, timeout, 0)
124#define wait_for_completion_interruptible_timeout(c, timeout) \
125 _wait_for_timeout_common(c, timeout, SLEEPQ_INTERRUPTIBLE)
126
127static inline int
128try_wait_for_completion(struct completion *c)
129{
130 int isdone;
131
132 isdone = 1;
133 sleepq_lock(c);
134 if (c->done)
135 c->done--;
136 else
137 isdone = 0;
138 sleepq_release(c);
139 return (isdone);
140}
141
142static inline int
143completion_done(struct completion *c)
144{
145 int isdone;
146
147 isdone = 1;
148 sleepq_lock(c);
149 if (c->done == 0)
150 isdone = 0;
151 sleepq_release(c);
152 return (isdone);
153}
154
155#endif /* _LINUX_COMPLETION_H_ */
66#endif /* _LINUX_COMPLETION_H_ */