1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2cafe5635SKent Overstreet #ifndef _LINUX_CLOSURE_H
3cafe5635SKent Overstreet #define _LINUX_CLOSURE_H
4cafe5635SKent Overstreet
5cafe5635SKent Overstreet #include <linux/llist.h>
6cafe5635SKent Overstreet #include <linux/sched.h>
768db0cf1SIngo Molnar #include <linux/sched/task_stack.h>
8cafe5635SKent Overstreet #include <linux/workqueue.h>
9cafe5635SKent Overstreet
10cafe5635SKent Overstreet /*
11cafe5635SKent Overstreet * Closure is perhaps the most overused and abused term in computer science, but
12cafe5635SKent Overstreet * since I've been unable to come up with anything better you're stuck with it
13cafe5635SKent Overstreet * again.
14cafe5635SKent Overstreet *
15cafe5635SKent Overstreet * What are closures?
16cafe5635SKent Overstreet *
17cafe5635SKent Overstreet * They embed a refcount. The basic idea is they count "things that are in
18cafe5635SKent Overstreet * progress" - in flight bios, some other thread that's doing something else -
19cafe5635SKent Overstreet * anything you might want to wait on.
20cafe5635SKent Overstreet *
21cafe5635SKent Overstreet * The refcount may be manipulated with closure_get() and closure_put().
22cafe5635SKent Overstreet * closure_put() is where many of the interesting things happen, when it causes
23cafe5635SKent Overstreet * the refcount to go to 0.
24cafe5635SKent Overstreet *
25cafe5635SKent Overstreet * Closures can be used to wait on things both synchronously and asynchronously,
26cafe5635SKent Overstreet * and synchronous and asynchronous use can be mixed without restriction. To
27cafe5635SKent Overstreet * wait synchronously, use closure_sync() - you will sleep until your closure's
28cafe5635SKent Overstreet * refcount hits 1.
29cafe5635SKent Overstreet *
30cafe5635SKent Overstreet * To wait asynchronously, use
31cafe5635SKent Overstreet * continue_at(cl, next_function, workqueue);
32cafe5635SKent Overstreet *
33cafe5635SKent Overstreet * passing it, as you might expect, the function to run when nothing is pending
34cafe5635SKent Overstreet * and the workqueue to run that function out of.
35cafe5635SKent Overstreet *
367abc70d7SYijing Wang * continue_at() also, critically, requires a 'return' immediately following the
377abc70d7SYijing Wang * location where this macro is referenced, to return to the calling function.
38cafe5635SKent Overstreet * There's good reason for this.
39cafe5635SKent Overstreet *
40cafe5635SKent Overstreet * To use safely closures asynchronously, they must always have a refcount while
41cafe5635SKent Overstreet * they are running owned by the thread that is running them. Otherwise, suppose
42cafe5635SKent Overstreet * you submit some bios and wish to have a function run when they all complete:
43cafe5635SKent Overstreet *
444246a0b6SChristoph Hellwig * foo_endio(struct bio *bio)
45cafe5635SKent Overstreet * {
46cafe5635SKent Overstreet * closure_put(cl);
47cafe5635SKent Overstreet * }
48cafe5635SKent Overstreet *
49cafe5635SKent Overstreet * closure_init(cl);
50cafe5635SKent Overstreet *
51cafe5635SKent Overstreet * do_stuff();
52cafe5635SKent Overstreet * closure_get(cl);
53cafe5635SKent Overstreet * bio1->bi_endio = foo_endio;
54cafe5635SKent Overstreet * bio_submit(bio1);
55cafe5635SKent Overstreet *
56cafe5635SKent Overstreet * do_more_stuff();
57cafe5635SKent Overstreet * closure_get(cl);
58cafe5635SKent Overstreet * bio2->bi_endio = foo_endio;
59cafe5635SKent Overstreet * bio_submit(bio2);
60cafe5635SKent Overstreet *
61cafe5635SKent Overstreet * continue_at(cl, complete_some_read, system_wq);
62cafe5635SKent Overstreet *
63cafe5635SKent Overstreet * If closure's refcount started at 0, complete_some_read() could run before the
64cafe5635SKent Overstreet * second bio was submitted - which is almost always not what you want! More
65cafe5635SKent Overstreet * importantly, it wouldn't be possible to say whether the original thread or
66cafe5635SKent Overstreet * complete_some_read()'s thread owned the closure - and whatever state it was
67cafe5635SKent Overstreet * associated with!
68cafe5635SKent Overstreet *
69cafe5635SKent Overstreet * So, closure_init() initializes a closure's refcount to 1 - and when a
70cafe5635SKent Overstreet * closure_fn is run, the refcount will be reset to 1 first.
71cafe5635SKent Overstreet *
72cafe5635SKent Overstreet * Then, the rule is - if you got the refcount with closure_get(), release it
73cafe5635SKent Overstreet * with closure_put() (i.e, in a bio->bi_endio function). If you have a refcount
74cafe5635SKent Overstreet * on a closure because you called closure_init() or you were run out of a
75cafe5635SKent Overstreet * closure - _always_ use continue_at(). Doing so consistently will help
76cafe5635SKent Overstreet * eliminate an entire class of particularly pernicious races.
77cafe5635SKent Overstreet *
78cafe5635SKent Overstreet * Lastly, you might have a wait list dedicated to a specific event, and have no
79cafe5635SKent Overstreet * need for specifying the condition - you just want to wait until someone runs
80cafe5635SKent Overstreet * closure_wake_up() on the appropriate wait list. In that case, just use
81cafe5635SKent Overstreet * closure_wait(). It will return either true or false, depending on whether the
82cafe5635SKent Overstreet * closure was already on a wait list or not - a closure can only be on one wait
83cafe5635SKent Overstreet * list at a time.
84cafe5635SKent Overstreet *
85cafe5635SKent Overstreet * Parents:
86cafe5635SKent Overstreet *
87cafe5635SKent Overstreet * closure_init() takes two arguments - it takes the closure to initialize, and
88cafe5635SKent Overstreet * a (possibly null) parent.
89cafe5635SKent Overstreet *
90cafe5635SKent Overstreet * If parent is non null, the new closure will have a refcount for its lifetime;
91cafe5635SKent Overstreet * a closure is considered to be "finished" when its refcount hits 0 and the
92cafe5635SKent Overstreet * function to run is null. Hence
93cafe5635SKent Overstreet *
94cafe5635SKent Overstreet * continue_at(cl, NULL, NULL);
95cafe5635SKent Overstreet *
96cafe5635SKent Overstreet * returns up the (spaghetti) stack of closures, precisely like normal return
97cafe5635SKent Overstreet * returns up the C stack. continue_at() with non null fn is better thought of
98cafe5635SKent Overstreet * as doing a tail call.
99cafe5635SKent Overstreet *
100cafe5635SKent Overstreet * All this implies that a closure should typically be embedded in a particular
101cafe5635SKent Overstreet * struct (which its refcount will normally control the lifetime of), and that
102cafe5635SKent Overstreet * struct can very much be thought of as a stack frame.
103cafe5635SKent Overstreet */
104cafe5635SKent Overstreet
105cafe5635SKent Overstreet struct closure;
106e4bf7919SKent Overstreet struct closure_syncer;
107cafe5635SKent Overstreet typedef void (closure_fn) (struct closure *);
108df2b9431SChengguang Xu extern struct dentry *bcache_debug;
109cafe5635SKent Overstreet
110cafe5635SKent Overstreet struct closure_waitlist {
111cafe5635SKent Overstreet struct llist_head list;
112cafe5635SKent Overstreet };
113cafe5635SKent Overstreet
114cafe5635SKent Overstreet enum closure_state {
115cafe5635SKent Overstreet /*
116cafe5635SKent Overstreet * CLOSURE_WAITING: Set iff the closure is on a waitlist. Must be set by
117cafe5635SKent Overstreet * the thread that owns the closure, and cleared by the thread that's
118cafe5635SKent Overstreet * waking up the closure.
119cafe5635SKent Overstreet *
120cafe5635SKent Overstreet * The rest are for debugging and don't affect behaviour:
121cafe5635SKent Overstreet *
122cafe5635SKent Overstreet * CLOSURE_RUNNING: Set when a closure is running (i.e. by
123cafe5635SKent Overstreet * closure_init() and when closure_put() runs then next function), and
124cafe5635SKent Overstreet * must be cleared before remaining hits 0. Primarily to help guard
125cafe5635SKent Overstreet * against incorrect usage and accidentally transferring references.
126cafe5635SKent Overstreet * continue_at() and closure_return() clear it for you, if you're doing
127cafe5635SKent Overstreet * something unusual you can use closure_set_dead() which also helps
128cafe5635SKent Overstreet * annotate where references are being transferred.
129cafe5635SKent Overstreet */
130cafe5635SKent Overstreet
1313609c471SMichael Lyle CLOSURE_BITS_START = (1U << 26),
1323609c471SMichael Lyle CLOSURE_DESTRUCTOR = (1U << 26),
1333609c471SMichael Lyle CLOSURE_WAITING = (1U << 28),
1343609c471SMichael Lyle CLOSURE_RUNNING = (1U << 30),
135cafe5635SKent Overstreet };
136cafe5635SKent Overstreet
137cafe5635SKent Overstreet #define CLOSURE_GUARD_MASK \
138e4bf7919SKent Overstreet ((CLOSURE_DESTRUCTOR|CLOSURE_WAITING|CLOSURE_RUNNING) << 1)
139cafe5635SKent Overstreet
140cafe5635SKent Overstreet #define CLOSURE_REMAINING_MASK (CLOSURE_BITS_START - 1)
141cafe5635SKent Overstreet #define CLOSURE_REMAINING_INITIALIZER (1|CLOSURE_RUNNING)
142cafe5635SKent Overstreet
143cafe5635SKent Overstreet struct closure {
144cafe5635SKent Overstreet union {
145cafe5635SKent Overstreet struct {
146cafe5635SKent Overstreet struct workqueue_struct *wq;
147e4bf7919SKent Overstreet struct closure_syncer *s;
148cafe5635SKent Overstreet struct llist_node list;
149cafe5635SKent Overstreet closure_fn *fn;
150cafe5635SKent Overstreet };
151cafe5635SKent Overstreet struct work_struct work;
152cafe5635SKent Overstreet };
153cafe5635SKent Overstreet
154cafe5635SKent Overstreet struct closure *parent;
155cafe5635SKent Overstreet
156cafe5635SKent Overstreet atomic_t remaining;
157cafe5635SKent Overstreet
158cafe5635SKent Overstreet #ifdef CONFIG_BCACHE_CLOSURES_DEBUG
159cafe5635SKent Overstreet #define CLOSURE_MAGIC_DEAD 0xc054dead
160cafe5635SKent Overstreet #define CLOSURE_MAGIC_ALIVE 0xc054a11e
161cafe5635SKent Overstreet
1626f10f7d1SColy Li unsigned int magic;
163cafe5635SKent Overstreet struct list_head all;
164cafe5635SKent Overstreet unsigned long ip;
165cafe5635SKent Overstreet unsigned long waiting_on;
166cafe5635SKent Overstreet #endif
167cafe5635SKent Overstreet };
168cafe5635SKent Overstreet
169cafe5635SKent Overstreet void closure_sub(struct closure *cl, int v);
170cafe5635SKent Overstreet void closure_put(struct closure *cl);
171cafe5635SKent Overstreet void __closure_wake_up(struct closure_waitlist *list);
172cafe5635SKent Overstreet bool closure_wait(struct closure_waitlist *list, struct closure *cl);
173e4bf7919SKent Overstreet void __closure_sync(struct closure *cl);
174e4bf7919SKent Overstreet
175e4bf7919SKent Overstreet /**
176e4bf7919SKent Overstreet * closure_sync - sleep until a closure a closure has nothing left to wait on
177e4bf7919SKent Overstreet *
178e4bf7919SKent Overstreet * Sleeps until the refcount hits 1 - the thread that's running the closure owns
179e4bf7919SKent Overstreet * the last refcount.
180e4bf7919SKent Overstreet */
closure_sync(struct closure * cl)181e4bf7919SKent Overstreet static inline void closure_sync(struct closure *cl)
182e4bf7919SKent Overstreet {
183e4bf7919SKent Overstreet if ((atomic_read(&cl->remaining) & CLOSURE_REMAINING_MASK) != 1)
184e4bf7919SKent Overstreet __closure_sync(cl);
185e4bf7919SKent Overstreet }
186cafe5635SKent Overstreet
187cafe5635SKent Overstreet #ifdef CONFIG_BCACHE_CLOSURES_DEBUG
188cafe5635SKent Overstreet
18978ac2107SColy Li void closure_debug_init(void);
190cafe5635SKent Overstreet void closure_debug_create(struct closure *cl);
191cafe5635SKent Overstreet void closure_debug_destroy(struct closure *cl);
192cafe5635SKent Overstreet
193cafe5635SKent Overstreet #else
194cafe5635SKent Overstreet
closure_debug_init(void)19578ac2107SColy Li static inline void closure_debug_init(void) {}
closure_debug_create(struct closure * cl)196cafe5635SKent Overstreet static inline void closure_debug_create(struct closure *cl) {}
closure_debug_destroy(struct closure * cl)197cafe5635SKent Overstreet static inline void closure_debug_destroy(struct closure *cl) {}
198cafe5635SKent Overstreet
199cafe5635SKent Overstreet #endif
200cafe5635SKent Overstreet
closure_set_ip(struct closure * cl)201cafe5635SKent Overstreet static inline void closure_set_ip(struct closure *cl)
202cafe5635SKent Overstreet {
203cafe5635SKent Overstreet #ifdef CONFIG_BCACHE_CLOSURES_DEBUG
204cafe5635SKent Overstreet cl->ip = _THIS_IP_;
205cafe5635SKent Overstreet #endif
206cafe5635SKent Overstreet }
207cafe5635SKent Overstreet
closure_set_ret_ip(struct closure * cl)208cafe5635SKent Overstreet static inline void closure_set_ret_ip(struct closure *cl)
209cafe5635SKent Overstreet {
210cafe5635SKent Overstreet #ifdef CONFIG_BCACHE_CLOSURES_DEBUG
211cafe5635SKent Overstreet cl->ip = _RET_IP_;
212cafe5635SKent Overstreet #endif
213cafe5635SKent Overstreet }
214cafe5635SKent Overstreet
closure_set_waiting(struct closure * cl,unsigned long f)2151dd13c8dSKent Overstreet static inline void closure_set_waiting(struct closure *cl, unsigned long f)
216cafe5635SKent Overstreet {
217cafe5635SKent Overstreet #ifdef CONFIG_BCACHE_CLOSURES_DEBUG
2181dd13c8dSKent Overstreet cl->waiting_on = f;
219cafe5635SKent Overstreet #endif
220cafe5635SKent Overstreet }
221cafe5635SKent Overstreet
closure_set_stopped(struct closure * cl)2221dd13c8dSKent Overstreet static inline void closure_set_stopped(struct closure *cl)
223cafe5635SKent Overstreet {
2241dd13c8dSKent Overstreet atomic_sub(CLOSURE_RUNNING, &cl->remaining);
225faadf0c9SKent Overstreet }
226cafe5635SKent Overstreet
set_closure_fn(struct closure * cl,closure_fn * fn,struct workqueue_struct * wq)227cafe5635SKent Overstreet static inline void set_closure_fn(struct closure *cl, closure_fn *fn,
228cafe5635SKent Overstreet struct workqueue_struct *wq)
229cafe5635SKent Overstreet {
230cafe5635SKent Overstreet closure_set_ip(cl);
231cafe5635SKent Overstreet cl->fn = fn;
232cafe5635SKent Overstreet cl->wq = wq;
233cafe5635SKent Overstreet /* between atomic_dec() in closure_put() */
2344e857c58SPeter Zijlstra smp_mb__before_atomic();
235cafe5635SKent Overstreet }
236cafe5635SKent Overstreet
closure_queue(struct closure * cl)2371dd13c8dSKent Overstreet static inline void closure_queue(struct closure *cl)
2381dd13c8dSKent Overstreet {
2391dd13c8dSKent Overstreet struct workqueue_struct *wq = cl->wq;
2406446c684SLiang Chen /**
2416446c684SLiang Chen * Changes made to closure, work_struct, or a couple of other structs
2426446c684SLiang Chen * may cause work.func not pointing to the right location.
2436446c684SLiang Chen */
2446446c684SLiang Chen BUILD_BUG_ON(offsetof(struct closure, fn)
2456446c684SLiang Chen != offsetof(struct work_struct, func));
2461dd13c8dSKent Overstreet if (wq) {
2471dd13c8dSKent Overstreet INIT_WORK(&cl->work, cl->work.func);
2481dd13c8dSKent Overstreet BUG_ON(!queue_work(wq, &cl->work));
2491dd13c8dSKent Overstreet } else
2501dd13c8dSKent Overstreet cl->fn(cl);
2511dd13c8dSKent Overstreet }
2521dd13c8dSKent Overstreet
2531dd13c8dSKent Overstreet /**
2541dd13c8dSKent Overstreet * closure_get - increment a closure's refcount
2551dd13c8dSKent Overstreet */
closure_get(struct closure * cl)2561dd13c8dSKent Overstreet static inline void closure_get(struct closure *cl)
2571dd13c8dSKent Overstreet {
2581dd13c8dSKent Overstreet #ifdef CONFIG_BCACHE_CLOSURES_DEBUG
2591dd13c8dSKent Overstreet BUG_ON((atomic_inc_return(&cl->remaining) &
2601dd13c8dSKent Overstreet CLOSURE_REMAINING_MASK) <= 1);
2611dd13c8dSKent Overstreet #else
2621dd13c8dSKent Overstreet atomic_inc(&cl->remaining);
2631dd13c8dSKent Overstreet #endif
2641dd13c8dSKent Overstreet }
2651dd13c8dSKent Overstreet
2661dd13c8dSKent Overstreet /**
2671dd13c8dSKent Overstreet * closure_init - Initialize a closure, setting the refcount to 1
2681dd13c8dSKent Overstreet * @cl: closure to initialize
2691dd13c8dSKent Overstreet * @parent: parent of the new closure. cl will take a refcount on it for its
2701dd13c8dSKent Overstreet * lifetime; may be NULL.
2711dd13c8dSKent Overstreet */
closure_init(struct closure * cl,struct closure * parent)2721dd13c8dSKent Overstreet static inline void closure_init(struct closure *cl, struct closure *parent)
2731dd13c8dSKent Overstreet {
2741dd13c8dSKent Overstreet memset(cl, 0, sizeof(struct closure));
2751dd13c8dSKent Overstreet cl->parent = parent;
2761dd13c8dSKent Overstreet if (parent)
2771dd13c8dSKent Overstreet closure_get(parent);
2781dd13c8dSKent Overstreet
2791dd13c8dSKent Overstreet atomic_set(&cl->remaining, CLOSURE_REMAINING_INITIALIZER);
2801dd13c8dSKent Overstreet
2811dd13c8dSKent Overstreet closure_debug_create(cl);
2821dd13c8dSKent Overstreet closure_set_ip(cl);
2831dd13c8dSKent Overstreet }
2841dd13c8dSKent Overstreet
closure_init_stack(struct closure * cl)2851dd13c8dSKent Overstreet static inline void closure_init_stack(struct closure *cl)
2861dd13c8dSKent Overstreet {
2871dd13c8dSKent Overstreet memset(cl, 0, sizeof(struct closure));
288e4bf7919SKent Overstreet atomic_set(&cl->remaining, CLOSURE_REMAINING_INITIALIZER);
2891dd13c8dSKent Overstreet }
2901dd13c8dSKent Overstreet
2911dd13c8dSKent Overstreet /**
292eb2b3d03SColy Li * closure_wake_up - wake up all closures on a wait list,
293eb2b3d03SColy Li * with memory barrier
2941dd13c8dSKent Overstreet */
closure_wake_up(struct closure_waitlist * list)2951dd13c8dSKent Overstreet static inline void closure_wake_up(struct closure_waitlist *list)
2961dd13c8dSKent Overstreet {
297eb2b3d03SColy Li /* Memory barrier for the wait list */
2981dd13c8dSKent Overstreet smp_mb();
2991dd13c8dSKent Overstreet __closure_wake_up(list);
3001dd13c8dSKent Overstreet }
3011dd13c8dSKent Overstreet
3021dd13c8dSKent Overstreet /**
3031dd13c8dSKent Overstreet * continue_at - jump to another function with barrier
3041dd13c8dSKent Overstreet *
3051dd13c8dSKent Overstreet * After @cl is no longer waiting on anything (i.e. all outstanding refs have
3061dd13c8dSKent Overstreet * been dropped with closure_put()), it will resume execution at @fn running out
3071dd13c8dSKent Overstreet * of @wq (or, if @wq is NULL, @fn will be called by closure_put() directly).
3081dd13c8dSKent Overstreet *
3091dd13c8dSKent Overstreet * This is because after calling continue_at() you no longer have a ref on @cl,
3101dd13c8dSKent Overstreet * and whatever @cl owns may be freed out from under you - a running closure fn
3111dd13c8dSKent Overstreet * has a ref on its own closure which continue_at() drops.
312e4bf7919SKent Overstreet *
313e4bf7919SKent Overstreet * Note you are expected to immediately return after using this macro.
3141dd13c8dSKent Overstreet */
315cafe5635SKent Overstreet #define continue_at(_cl, _fn, _wq) \
316cafe5635SKent Overstreet do { \
317cafe5635SKent Overstreet set_closure_fn(_cl, _fn, _wq); \
318cafe5635SKent Overstreet closure_sub(_cl, CLOSURE_RUNNING + 1); \
319cafe5635SKent Overstreet } while (0)
320cafe5635SKent Overstreet
3211dd13c8dSKent Overstreet /**
3221dd13c8dSKent Overstreet * closure_return - finish execution of a closure
3231dd13c8dSKent Overstreet *
3241dd13c8dSKent Overstreet * This is used to indicate that @cl is finished: when all outstanding refs on
3251dd13c8dSKent Overstreet * @cl have been dropped @cl's ref on its parent closure (as passed to
3261dd13c8dSKent Overstreet * closure_init()) will be dropped, if one was specified - thus this can be
3271dd13c8dSKent Overstreet * thought of as returning to the parent closure.
3281dd13c8dSKent Overstreet */
329cafe5635SKent Overstreet #define closure_return(_cl) continue_at((_cl), NULL, NULL)
330cafe5635SKent Overstreet
3311dd13c8dSKent Overstreet /**
3321dd13c8dSKent Overstreet * continue_at_nobarrier - jump to another function without barrier
3331dd13c8dSKent Overstreet *
3341dd13c8dSKent Overstreet * Causes @fn to be executed out of @cl, in @wq context (or called directly if
3351dd13c8dSKent Overstreet * @wq is NULL).
3361dd13c8dSKent Overstreet *
3371dd13c8dSKent Overstreet * The ref the caller of continue_at_nobarrier() had on @cl is now owned by @fn,
3381dd13c8dSKent Overstreet * thus it's not safe to touch anything protected by @cl after a
3391dd13c8dSKent Overstreet * continue_at_nobarrier().
3401dd13c8dSKent Overstreet */
341cafe5635SKent Overstreet #define continue_at_nobarrier(_cl, _fn, _wq) \
342cafe5635SKent Overstreet do { \
343cafe5635SKent Overstreet set_closure_fn(_cl, _fn, _wq); \
344a34a8bfdSKent Overstreet closure_queue(_cl); \
345cafe5635SKent Overstreet } while (0)
346cafe5635SKent Overstreet
3471dd13c8dSKent Overstreet /**
348*4516da42SColy Li * closure_return_with_destructor - finish execution of a closure,
349*4516da42SColy Li * with destructor
3501dd13c8dSKent Overstreet *
3511dd13c8dSKent Overstreet * Works like closure_return(), except @destructor will be called when all
3521dd13c8dSKent Overstreet * outstanding refs on @cl have been dropped; @destructor may be used to safely
3531dd13c8dSKent Overstreet * free the memory occupied by @cl, and it is called with the ref on the parent
3541dd13c8dSKent Overstreet * closure still held - so @destructor could safely return an item to a
3551dd13c8dSKent Overstreet * freelist protected by @cl's parent.
3561dd13c8dSKent Overstreet */
357cafe5635SKent Overstreet #define closure_return_with_destructor(_cl, _destructor) \
358cafe5635SKent Overstreet do { \
359cafe5635SKent Overstreet set_closure_fn(_cl, _destructor, NULL); \
360cafe5635SKent Overstreet closure_sub(_cl, CLOSURE_RUNNING - CLOSURE_DESTRUCTOR + 1); \
361cafe5635SKent Overstreet } while (0)
362cafe5635SKent Overstreet
3631dd13c8dSKent Overstreet /**
3641dd13c8dSKent Overstreet * closure_call - execute @fn out of a new, uninitialized closure
3651dd13c8dSKent Overstreet *
3661dd13c8dSKent Overstreet * Typically used when running out of one closure, and we want to run @fn
3671dd13c8dSKent Overstreet * asynchronously out of a new closure - @parent will then wait for @cl to
3681dd13c8dSKent Overstreet * finish.
3691dd13c8dSKent Overstreet */
closure_call(struct closure * cl,closure_fn fn,struct workqueue_struct * wq,struct closure * parent)370cafe5635SKent Overstreet static inline void closure_call(struct closure *cl, closure_fn fn,
371cafe5635SKent Overstreet struct workqueue_struct *wq,
372cafe5635SKent Overstreet struct closure *parent)
373cafe5635SKent Overstreet {
374cafe5635SKent Overstreet closure_init(cl, parent);
375cafe5635SKent Overstreet continue_at_nobarrier(cl, fn, wq);
376cafe5635SKent Overstreet }
377cafe5635SKent Overstreet
378cafe5635SKent Overstreet #endif /* _LINUX_CLOSURE_H */
379