diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-05-03 21:43:54 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-05-09 00:29:22 +0300 |
commit | 4c5b7294dedbdfae46f77262c0744879bb9b7221 (patch) | |
tree | 250afe51caab7ba04bdd8cd0233871d6b19ca229 /include | |
parent | 9a768ab75bef37eac23022f296e9be63b5f85565 (diff) | |
download | linux-4c5b7294dedbdfae46f77262c0744879bb9b7221.tar.xz |
closures: closure_sync_timeout()
Add a new variant of closure_sync_timeout() that takes a timeout.
Note that when this returns -ETIME the closure will still be waiting on
something, i.e. it's not safe to return if you've got a stack allocated
closure.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/closure.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/include/linux/closure.h b/include/linux/closure.h index c554c6a08768..99155df162d0 100644 --- a/include/linux/closure.h +++ b/include/linux/closure.h @@ -194,6 +194,18 @@ static inline void closure_sync(struct closure *cl) __closure_sync(cl); } +int __closure_sync_timeout(struct closure *cl, unsigned long timeout); + +static inline int closure_sync_timeout(struct closure *cl, unsigned long timeout) +{ +#ifdef CONFIG_DEBUG_CLOSURES + BUG_ON(closure_nr_remaining(cl) != 1 && !cl->closure_get_happened); +#endif + return cl->closure_get_happened + ? __closure_sync_timeout(cl, timeout) + : 0; +} + #ifdef CONFIG_DEBUG_CLOSURES void closure_debug_create(struct closure *cl); |