Signed-off-by: Kent Overstreet <kent.overstr...@gmail.com>
---
 include/linux/closure.h | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/include/linux/closure.h b/include/linux/closure.h
index 308e38028c..abacb91c35 100644
--- a/include/linux/closure.h
+++ b/include/linux/closure.h
@@ -379,4 +379,26 @@ static inline void closure_call(struct closure *cl, 
closure_fn fn,
        continue_at_nobarrier(cl, fn, wq);
 }
 
+#define __closure_wait_event(waitlist, _cond)                          \
+do {                                                                   \
+       struct closure cl;                                              \
+                                                                       \
+       closure_init_stack(&cl);                                        \
+                                                                       \
+       while (1) {                                                     \
+               closure_wait(waitlist, &cl);                            \
+               if (_cond)                                              \
+                       break;                                          \
+               closure_sync(&cl);                                      \
+       }                                                               \
+       closure_wake_up(waitlist);                                      \
+       closure_sync(&cl);                                              \
+} while (0)
+
+#define closure_wait_event(waitlist, _cond)                            \
+do {                                                                   \
+       if (!(_cond))                                                   \
+               __closure_wait_event(waitlist, _cond);                  \
+} while (0)
+
 #endif /* _LINUX_CLOSURE_H */
-- 
2.20.1

Reply via email to