mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 18:53:24 +00:00 
			
		
		
		
	 0aa12fb439
			
		
	
	
		0aa12fb439
		
	
	
	
	
		
			
			Add missing _killable_timeout variant for wait_for_completion that will return when a timeout expires or the task is killed. CC: Ingo Molnar <mingo@elte.hu> CC: Andreas Herrmann <andreas.herrmann3@amd.com> CC: Thomas Gleixner <tglx@linutronix.de> CC: Mike Galbraith <efault@gmx.de> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Sage Weil <sage@newdream.net>
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __LINUX_COMPLETION_H
 | |
| #define __LINUX_COMPLETION_H
 | |
| 
 | |
| /*
 | |
|  * (C) Copyright 2001 Linus Torvalds
 | |
|  *
 | |
|  * Atomic wait-for-completion handler data structures.
 | |
|  * See kernel/sched.c for details.
 | |
|  */
 | |
| 
 | |
| #include <linux/wait.h>
 | |
| 
 | |
| /**
 | |
|  * struct completion - structure used to maintain state for a "completion"
 | |
|  *
 | |
|  * This is the opaque structure used to maintain the state for a "completion".
 | |
|  * Completions currently use a FIFO to queue threads that have to wait for
 | |
|  * the "completion" event.
 | |
|  *
 | |
|  * See also:  complete(), wait_for_completion() (and friends _timeout,
 | |
|  * _interruptible, _interruptible_timeout, and _killable), init_completion(),
 | |
|  * and macros DECLARE_COMPLETION(), DECLARE_COMPLETION_ONSTACK(), and
 | |
|  * INIT_COMPLETION().
 | |
|  */
 | |
| struct completion {
 | |
| 	unsigned int done;
 | |
| 	wait_queue_head_t wait;
 | |
| };
 | |
| 
 | |
| #define COMPLETION_INITIALIZER(work) \
 | |
| 	{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
 | |
| 
 | |
| #define COMPLETION_INITIALIZER_ONSTACK(work) \
 | |
| 	({ init_completion(&work); work; })
 | |
| 
 | |
| /**
 | |
|  * DECLARE_COMPLETION: - declare and initialize a completion structure
 | |
|  * @work:  identifier for the completion structure
 | |
|  *
 | |
|  * This macro declares and initializes a completion structure. Generally used
 | |
|  * for static declarations. You should use the _ONSTACK variant for automatic
 | |
|  * variables.
 | |
|  */
 | |
| #define DECLARE_COMPLETION(work) \
 | |
| 	struct completion work = COMPLETION_INITIALIZER(work)
 | |
| 
 | |
| /*
 | |
|  * Lockdep needs to run a non-constant initializer for on-stack
 | |
|  * completions - so we use the _ONSTACK() variant for those that
 | |
|  * are on the kernel stack:
 | |
|  */
 | |
| /**
 | |
|  * DECLARE_COMPLETION_ONSTACK: - declare and initialize a completion structure
 | |
|  * @work:  identifier for the completion structure
 | |
|  *
 | |
|  * This macro declares and initializes a completion structure on the kernel
 | |
|  * stack.
 | |
|  */
 | |
| #ifdef CONFIG_LOCKDEP
 | |
| # define DECLARE_COMPLETION_ONSTACK(work) \
 | |
| 	struct completion work = COMPLETION_INITIALIZER_ONSTACK(work)
 | |
| #else
 | |
| # define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work)
 | |
| #endif
 | |
| 
 | |
| /**
 | |
|  * init_completion: - Initialize a dynamically allocated completion
 | |
|  * @x:  completion structure that is to be initialized
 | |
|  *
 | |
|  * This inline function will initialize a dynamically created completion
 | |
|  * structure.
 | |
|  */
 | |
| static inline void init_completion(struct completion *x)
 | |
| {
 | |
| 	x->done = 0;
 | |
| 	init_waitqueue_head(&x->wait);
 | |
| }
 | |
| 
 | |
| extern void wait_for_completion(struct completion *);
 | |
| extern int wait_for_completion_interruptible(struct completion *x);
 | |
| extern int wait_for_completion_killable(struct completion *x);
 | |
| extern unsigned long wait_for_completion_timeout(struct completion *x,
 | |
| 						   unsigned long timeout);
 | |
| extern unsigned long wait_for_completion_interruptible_timeout(
 | |
| 			struct completion *x, unsigned long timeout);
 | |
| extern unsigned long wait_for_completion_killable_timeout(
 | |
| 			struct completion *x, unsigned long timeout);
 | |
| extern bool try_wait_for_completion(struct completion *x);
 | |
| extern bool completion_done(struct completion *x);
 | |
| 
 | |
| extern void complete(struct completion *);
 | |
| extern void complete_all(struct completion *);
 | |
| 
 | |
| /**
 | |
|  * INIT_COMPLETION: - reinitialize a completion structure
 | |
|  * @x:  completion structure to be reinitialized
 | |
|  *
 | |
|  * This macro should be used to reinitialize a completion structure so it can
 | |
|  * be reused. This is especially important after complete_all() is used.
 | |
|  */
 | |
| #define INIT_COMPLETION(x)	((x).done = 0)
 | |
| 
 | |
| 
 | |
| #endif
 |