1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __LINUX_COMPLETION_H 3 #define __LINUX_COMPLETION_H 4 5 /* 6 * (C) Copyright 2001 Linus Torvalds 7 * 8 * Atomic wait-for-completion handler data structures. 9 * See kernel/sched/completion.c for details. 10 */ 11 12 #include <linux/swait.h> 13 14 /* 15 * struct completion - structure used to maintain state for a "completion" 16 * 17 * This is the opaque structure used to maintain the state for a "completion". 18 * Completions currently use a FIFO to queue threads that have to wait for 19 * the "completion" event. 20 * 21 * See also: complete(), wait_for_completion() (and friends _timeout, 22 * _interruptible, _interruptible_timeout, and _killable), init_completion(), 23 * reinit_completion(), and macros DECLARE_COMPLETION(), 24 * DECLARE_COMPLETION_ONSTACK(). 25 */ 26 struct completion { 27 unsigned int done; 28 struct swait_queue_head wait; 29 }; 30 31 #define init_completion_map(x, m) init_completion(x) 32 static inline void complete_acquire(struct completion *x) {} 33 static inline void complete_release(struct completion *x) {} 34 35 #define COMPLETION_INITIALIZER(work) \ 36 { 0, __SWAIT_QUEUE_HEAD_INITIALIZER((work).wait) } 37 38 #define COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) \ 39 (*({ init_completion_map(&(work), &(map)); &(work); })) 40 41 #define COMPLETION_INITIALIZER_ONSTACK(work) \ 42 (*({ init_completion(&work); &work; })) 43 44 /** 45 * DECLARE_COMPLETION - declare and initialize a completion structure 46 * @work: identifier for the completion structure 47 * 48 * This macro declares and initializes a completion structure. Generally used 49 * for static declarations. You should use the _ONSTACK variant for automatic 50 * variables. 51 */ 52 #define DECLARE_COMPLETION(work) \ 53 struct completion work = COMPLETION_INITIALIZER(work) 54 55 /* 56 * Lockdep needs to run a non-constant initializer for on-stack 57 * completions - so we use the _ONSTACK() variant for those that 58 * are on the kernel stack: 59 */ 60 /** 61 * DECLARE_COMPLETION_ONSTACK - declare and initialize a completion structure 62 * @work: identifier for the completion structure 63 * 64 * This macro declares and initializes a completion structure on the kernel 65 * stack. 66 */ 67 #ifdef CONFIG_LOCKDEP 68 # define DECLARE_COMPLETION_ONSTACK(work) \ 69 struct completion work = COMPLETION_INITIALIZER_ONSTACK(work) 70 # define DECLARE_COMPLETION_ONSTACK_MAP(work, map) \ 71 struct completion work = COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) 72 #else 73 # define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work) 74 # define DECLARE_COMPLETION_ONSTACK_MAP(work, map) DECLARE_COMPLETION(work) 75 #endif 76 77 /** 78 * init_completion - Initialize a dynamically allocated completion 79 * @x: pointer to completion structure that is to be initialized 80 * 81 * This inline function will initialize a dynamically created completion 82 * structure. 83 */ 84 static inline void init_completion(struct completion *x) 85 { 86 x->done = 0; 87 init_swait_queue_head(&x->wait); 88 } 89 90 /** 91 * reinit_completion - reinitialize a completion structure 92 * @x: pointer to completion structure that is to be reinitialized 93 * 94 * This inline function should be used to reinitialize a completion structure so it can 95 * be reused. This is especially important after complete_all() is used. 96 */ 97 static inline void reinit_completion(struct completion *x) 98 { 99 x->done = 0; 100 } 101 102 extern void wait_for_completion(struct completion *); 103 extern void wait_for_completion_io(struct completion *); 104 extern int wait_for_completion_interruptible(struct completion *x); 105 extern int wait_for_completion_killable(struct completion *x); 106 extern int wait_for_completion_state(struct completion *x, unsigned int state); 107 extern unsigned long wait_for_completion_timeout(struct completion *x, 108 unsigned long timeout); 109 extern unsigned long wait_for_completion_io_timeout(struct completion *x, 110 unsigned long timeout); 111 extern long wait_for_completion_interruptible_timeout( 112 struct completion *x, unsigned long timeout); 113 extern long wait_for_completion_killable_timeout( 114 struct completion *x, unsigned long timeout); 115 extern bool try_wait_for_completion(struct completion *x); 116 extern bool completion_done(struct completion *x); 117 118 extern void complete(struct completion *); 119 extern void complete_on_current_cpu(struct completion *x); 120 extern void complete_all(struct completion *); 121 122 #endif 123
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.