xref: /openbmc/linux/drivers/md/bcache/closure.h (revision 3eb66e91a25497065c5322b1268cbc3953642227)
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