mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	sched/wait: Standardize internal naming of wait-queue entries
So the various wait-queue entry variables in include/linux/wait.h and kernel/sched/wait.c are named in a colorfully inconsistent way: wait_queue_entry_t *wait wait_queue_entry_t *__wait (even in plain C code!) wait_queue_entry_t *q (!) wait_queue_entry_t *new (making anyone who knows C++ cringe) wait_queue_entry_t *old I think part of the reason for the inconsistency is the constant apparent confusion about what a wait queue 'head' versus 'entry' is. ( Some of the documentation talks about a 'wait descriptor', which is the wait-queue entry itself - further adding to the confusion. ) The most common name is 'wait', but that in itself is somewhat ambiguous as well, as it does not really make it clear whether it's a wait-queue entry or head. To improve all this name the wait-queue entry structure parameters and variables consistently and push through this naming into all the wait.h and wait.c code: struct wait_queue_entry *wq_entry The 'wq_' prefix makes it easy to grep for, and we also use the opportunity to move away from the typedef to a plain 'struct' naming: in the kernel we typically reserve typedefs for cases where a C structure is really small and somewhat opaque - such as pte_t. wait-queue entries are neither small nor opaque, so use the more standard 'struct xxx_entry' list management code nomenclature instead. ( We don't touch external users, and we preserve the typedef as well for actual wait-queue users, to reduce unnecessary churn. ) Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-kernel@vger.kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									ac6424b981
								
							
						
					
					
						commit
						50816c4899
					
				
					 2 changed files with 91 additions and 91 deletions
				
			
		|  | @ -11,8 +11,9 @@ | ||||||
| #include <uapi/linux/wait.h> | #include <uapi/linux/wait.h> | ||||||
| 
 | 
 | ||||||
| typedef struct wait_queue_entry wait_queue_entry_t; | typedef struct wait_queue_entry wait_queue_entry_t; | ||||||
| typedef int (*wait_queue_func_t)(wait_queue_entry_t *wait, unsigned mode, int flags, void *key); | 
 | ||||||
| int default_wake_function(wait_queue_entry_t *wait, unsigned mode, int flags, void *key); | typedef int (*wait_queue_func_t)(struct wait_queue_entry *wq_entry, unsigned mode, int flags, void *key); | ||||||
|  | int default_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int flags, void *key); | ||||||
| 
 | 
 | ||||||
| /* wait_queue_entry::flags */ | /* wait_queue_entry::flags */ | ||||||
| #define WQ_FLAG_EXCLUSIVE	0x01 | #define WQ_FLAG_EXCLUSIVE	0x01 | ||||||
|  | @ -37,7 +38,7 @@ struct wait_bit_key { | ||||||
| 
 | 
 | ||||||
| struct wait_bit_queue { | struct wait_bit_queue { | ||||||
| 	struct wait_bit_key	key; | 	struct wait_bit_key	key; | ||||||
| 	wait_queue_entry_t	wait; | 	struct wait_queue_entry	wait; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct __wait_queue_head { | struct __wait_queue_head { | ||||||
|  | @ -58,7 +59,7 @@ struct task_struct; | ||||||
| 	.task_list	= { NULL, NULL } } | 	.task_list	= { NULL, NULL } } | ||||||
| 
 | 
 | ||||||
| #define DECLARE_WAITQUEUE(name, tsk)					\ | #define DECLARE_WAITQUEUE(name, tsk)					\ | ||||||
| 	wait_queue_entry_t name = __WAITQUEUE_INITIALIZER(name, tsk) | 	struct wait_queue_entry name = __WAITQUEUE_INITIALIZER(name, tsk) | ||||||
| 
 | 
 | ||||||
| #define __WAIT_QUEUE_HEAD_INITIALIZER(name) {				\ | #define __WAIT_QUEUE_HEAD_INITIALIZER(name) {				\ | ||||||
| 	.lock		= __SPIN_LOCK_UNLOCKED(name.lock),		\ | 	.lock		= __SPIN_LOCK_UNLOCKED(name.lock),		\ | ||||||
|  | @ -91,19 +92,19 @@ extern void __init_waitqueue_head(wait_queue_head_t *q, const char *name, struct | ||||||
| # define DECLARE_WAIT_QUEUE_HEAD_ONSTACK(name) DECLARE_WAIT_QUEUE_HEAD(name) | # define DECLARE_WAIT_QUEUE_HEAD_ONSTACK(name) DECLARE_WAIT_QUEUE_HEAD(name) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static inline void init_waitqueue_entry(wait_queue_entry_t *q, struct task_struct *p) | static inline void init_waitqueue_entry(struct wait_queue_entry *wq_entry, struct task_struct *p) | ||||||
| { | { | ||||||
| 	q->flags	= 0; | 	wq_entry->flags		= 0; | ||||||
| 	q->private	= p; | 	wq_entry->private	= p; | ||||||
| 	q->func		= default_wake_function; | 	wq_entry->func		= default_wake_function; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void | static inline void | ||||||
| init_waitqueue_func_entry(wait_queue_entry_t *q, wait_queue_func_t func) | init_waitqueue_func_entry(struct wait_queue_entry *wq_entry, wait_queue_func_t func) | ||||||
| { | { | ||||||
| 	q->flags	= 0; | 	wq_entry->flags		= 0; | ||||||
| 	q->private	= NULL; | 	wq_entry->private	= NULL; | ||||||
| 	q->func		= func; | 	wq_entry->func		= func; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -162,42 +163,41 @@ static inline bool wq_has_sleeper(wait_queue_head_t *wq) | ||||||
| 	return waitqueue_active(wq); | 	return waitqueue_active(wq); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| extern void add_wait_queue(wait_queue_head_t *q, wait_queue_entry_t *wait); | extern void add_wait_queue(wait_queue_head_t *q, struct wait_queue_entry *wq_entry); | ||||||
| extern void add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_entry_t *wait); | extern void add_wait_queue_exclusive(wait_queue_head_t *q, struct wait_queue_entry *wq_entry); | ||||||
| extern void remove_wait_queue(wait_queue_head_t *q, wait_queue_entry_t *wait); | extern void remove_wait_queue(wait_queue_head_t *q, struct wait_queue_entry *wq_entry); | ||||||
| 
 | 
 | ||||||
| static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_entry_t *new) | static inline void __add_wait_queue(wait_queue_head_t *head, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	list_add(&new->task_list, &head->task_list); | 	list_add(&wq_entry->task_list, &head->task_list); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Used for wake-one threads: |  * Used for wake-one threads: | ||||||
|  */ |  */ | ||||||
| static inline void | static inline void | ||||||
| __add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_entry_t *wait) | __add_wait_queue_exclusive(wait_queue_head_t *q, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	wait->flags |= WQ_FLAG_EXCLUSIVE; | 	wq_entry->flags |= WQ_FLAG_EXCLUSIVE; | ||||||
| 	__add_wait_queue(q, wait); | 	__add_wait_queue(q, wq_entry); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void __add_wait_queue_entry_tail(wait_queue_head_t *head, | static inline void __add_wait_queue_entry_tail(wait_queue_head_t *head, struct wait_queue_entry *wq_entry) | ||||||
| 					 wait_queue_entry_t *new) |  | ||||||
| { | { | ||||||
| 	list_add_tail(&new->task_list, &head->task_list); | 	list_add_tail(&wq_entry->task_list, &head->task_list); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void | static inline void | ||||||
| __add_wait_queue_entry_tail_exclusive(wait_queue_head_t *q, wait_queue_entry_t *wait) | __add_wait_queue_entry_tail_exclusive(wait_queue_head_t *q, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	wait->flags |= WQ_FLAG_EXCLUSIVE; | 	wq_entry->flags |= WQ_FLAG_EXCLUSIVE; | ||||||
| 	__add_wait_queue_entry_tail(q, wait); | 	__add_wait_queue_entry_tail(q, wq_entry); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void | static inline void | ||||||
| __remove_wait_queue(wait_queue_head_t *head, wait_queue_entry_t *old) | __remove_wait_queue(wait_queue_head_t *head, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	list_del(&old->task_list); | 	list_del(&wq_entry->task_list); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| typedef int wait_bit_action_f(struct wait_bit_key *, int mode); | typedef int wait_bit_action_f(struct wait_bit_key *, int mode); | ||||||
|  | @ -252,7 +252,7 @@ wait_queue_head_t *bit_waitqueue(void *, int); | ||||||
| 	(!__builtin_constant_p(state) ||				\ | 	(!__builtin_constant_p(state) ||				\ | ||||||
| 		state == TASK_INTERRUPTIBLE || state == TASK_KILLABLE)	\ | 		state == TASK_INTERRUPTIBLE || state == TASK_KILLABLE)	\ | ||||||
| 
 | 
 | ||||||
| extern void init_wait_entry(wait_queue_entry_t *__wait, int flags); | extern void init_wait_entry(struct wait_queue_entry *wq_entry, int flags); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * The below macro ___wait_event() has an explicit shadow of the __ret |  * The below macro ___wait_event() has an explicit shadow of the __ret | ||||||
|  | @ -269,12 +269,12 @@ extern void init_wait_entry(wait_queue_entry_t *__wait, int flags); | ||||||
| #define ___wait_event(wq, condition, state, exclusive, ret, cmd)	\ | #define ___wait_event(wq, condition, state, exclusive, ret, cmd)	\ | ||||||
| ({									\ | ({									\ | ||||||
| 	__label__ __out;						\ | 	__label__ __out;						\ | ||||||
| 	wait_queue_entry_t __wait;						\ | 	struct wait_queue_entry __wq_entry;				\ | ||||||
| 	long __ret = ret;	/* explicit shadow */			\ | 	long __ret = ret;	/* explicit shadow */			\ | ||||||
| 									\ | 									\ | ||||||
| 	init_wait_entry(&__wait, exclusive ? WQ_FLAG_EXCLUSIVE : 0);	\ | 	init_wait_entry(&__wq_entry, exclusive ? WQ_FLAG_EXCLUSIVE : 0);\ | ||||||
| 	for (;;) {							\ | 	for (;;) {							\ | ||||||
| 		long __int = prepare_to_wait_event(&wq, &__wait, state);\ | 		long __int = prepare_to_wait_event(&wq, &__wq_entry, state);\ | ||||||
| 									\ | 									\ | ||||||
| 		if (condition)						\ | 		if (condition)						\ | ||||||
| 			break;						\ | 			break;						\ | ||||||
|  | @ -286,7 +286,7 @@ extern void init_wait_entry(wait_queue_entry_t *__wait, int flags); | ||||||
| 									\ | 									\ | ||||||
| 		cmd;							\ | 		cmd;							\ | ||||||
| 	}								\ | 	}								\ | ||||||
| 	finish_wait(&wq, &__wait);					\ | 	finish_wait(&wq, &__wq_entry);					\ | ||||||
| __out:	__ret;								\ | __out:	__ret;								\ | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  | @ -970,17 +970,17 @@ do {									\ | ||||||
| /*
 | /*
 | ||||||
|  * Waitqueues which are removed from the waitqueue_head at wakeup time |  * Waitqueues which are removed from the waitqueue_head at wakeup time | ||||||
|  */ |  */ | ||||||
| void prepare_to_wait(wait_queue_head_t *q, wait_queue_entry_t *wait, int state); | void prepare_to_wait(wait_queue_head_t *q, struct wait_queue_entry *wq_entry, int state); | ||||||
| void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_entry_t *wait, int state); | void prepare_to_wait_exclusive(wait_queue_head_t *q, struct wait_queue_entry *wq_entry, int state); | ||||||
| long prepare_to_wait_event(wait_queue_head_t *q, wait_queue_entry_t *wait, int state); | long prepare_to_wait_event(wait_queue_head_t *q, struct wait_queue_entry *wq_entry, int state); | ||||||
| void finish_wait(wait_queue_head_t *q, wait_queue_entry_t *wait); | void finish_wait(wait_queue_head_t *q, struct wait_queue_entry *wq_entry); | ||||||
| long wait_woken(wait_queue_entry_t *wait, unsigned mode, long timeout); | long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout); | ||||||
| int woken_wake_function(wait_queue_entry_t *wait, unsigned mode, int sync, void *key); | int woken_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *key); | ||||||
| int autoremove_wake_function(wait_queue_entry_t *wait, unsigned mode, int sync, void *key); | int autoremove_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *key); | ||||||
| int wake_bit_function(wait_queue_entry_t *wait, unsigned mode, int sync, void *key); | int wake_bit_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *key); | ||||||
| 
 | 
 | ||||||
| #define DEFINE_WAIT_FUNC(name, function)				\ | #define DEFINE_WAIT_FUNC(name, function)				\ | ||||||
| 	wait_queue_entry_t name = {					\ | 	struct wait_queue_entry name = {				\ | ||||||
| 		.private	= current,				\ | 		.private	= current,				\ | ||||||
| 		.func		= function,				\ | 		.func		= function,				\ | ||||||
| 		.task_list	= LIST_HEAD_INIT((name).task_list),	\ | 		.task_list	= LIST_HEAD_INIT((name).task_list),	\ | ||||||
|  |  | ||||||
|  | @ -21,34 +21,34 @@ void __init_waitqueue_head(wait_queue_head_t *q, const char *name, struct lock_c | ||||||
| 
 | 
 | ||||||
| EXPORT_SYMBOL(__init_waitqueue_head); | EXPORT_SYMBOL(__init_waitqueue_head); | ||||||
| 
 | 
 | ||||||
| void add_wait_queue(wait_queue_head_t *q, wait_queue_entry_t *wait) | void add_wait_queue(wait_queue_head_t *q, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
| 	wait->flags &= ~WQ_FLAG_EXCLUSIVE; | 	wq_entry->flags &= ~WQ_FLAG_EXCLUSIVE; | ||||||
| 	spin_lock_irqsave(&q->lock, flags); | 	spin_lock_irqsave(&q->lock, flags); | ||||||
| 	__add_wait_queue(q, wait); | 	__add_wait_queue_entry_tail(q, wq_entry); | ||||||
| 	spin_unlock_irqrestore(&q->lock, flags); | 	spin_unlock_irqrestore(&q->lock, flags); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(add_wait_queue); | EXPORT_SYMBOL(add_wait_queue); | ||||||
| 
 | 
 | ||||||
| void add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_entry_t *wait) | void add_wait_queue_exclusive(wait_queue_head_t *q, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
| 	wait->flags |= WQ_FLAG_EXCLUSIVE; | 	wq_entry->flags |= WQ_FLAG_EXCLUSIVE; | ||||||
| 	spin_lock_irqsave(&q->lock, flags); | 	spin_lock_irqsave(&q->lock, flags); | ||||||
| 	__add_wait_queue_entry_tail(q, wait); | 	__add_wait_queue_entry_tail(q, wq_entry); | ||||||
| 	spin_unlock_irqrestore(&q->lock, flags); | 	spin_unlock_irqrestore(&q->lock, flags); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(add_wait_queue_exclusive); | EXPORT_SYMBOL(add_wait_queue_exclusive); | ||||||
| 
 | 
 | ||||||
| void remove_wait_queue(wait_queue_head_t *q, wait_queue_entry_t *wait) | void remove_wait_queue(wait_queue_head_t *q, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
| 	spin_lock_irqsave(&q->lock, flags); | 	spin_lock_irqsave(&q->lock, flags); | ||||||
| 	__remove_wait_queue(q, wait); | 	__remove_wait_queue(q, wq_entry); | ||||||
| 	spin_unlock_irqrestore(&q->lock, flags); | 	spin_unlock_irqrestore(&q->lock, flags); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(remove_wait_queue); | EXPORT_SYMBOL(remove_wait_queue); | ||||||
|  | @ -170,43 +170,43 @@ EXPORT_SYMBOL_GPL(__wake_up_sync);	/* For internal use only */ | ||||||
|  * loads to move into the critical region). |  * loads to move into the critical region). | ||||||
|  */ |  */ | ||||||
| void | void | ||||||
| prepare_to_wait(wait_queue_head_t *q, wait_queue_entry_t *wait, int state) | prepare_to_wait(wait_queue_head_t *q, struct wait_queue_entry *wq_entry, int state) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
| 	wait->flags &= ~WQ_FLAG_EXCLUSIVE; | 	wq_entry->flags &= ~WQ_FLAG_EXCLUSIVE; | ||||||
| 	spin_lock_irqsave(&q->lock, flags); | 	spin_lock_irqsave(&q->lock, flags); | ||||||
| 	if (list_empty(&wait->task_list)) | 	if (list_empty(&wq_entry->task_list)) | ||||||
| 		__add_wait_queue(q, wait); | 		__add_wait_queue(q, wq_entry); | ||||||
| 	set_current_state(state); | 	set_current_state(state); | ||||||
| 	spin_unlock_irqrestore(&q->lock, flags); | 	spin_unlock_irqrestore(&q->lock, flags); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(prepare_to_wait); | EXPORT_SYMBOL(prepare_to_wait); | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_entry_t *wait, int state) | prepare_to_wait_exclusive(wait_queue_head_t *q, struct wait_queue_entry *wq_entry, int state) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
| 	wait->flags |= WQ_FLAG_EXCLUSIVE; | 	wq_entry->flags |= WQ_FLAG_EXCLUSIVE; | ||||||
| 	spin_lock_irqsave(&q->lock, flags); | 	spin_lock_irqsave(&q->lock, flags); | ||||||
| 	if (list_empty(&wait->task_list)) | 	if (list_empty(&wq_entry->task_list)) | ||||||
| 		__add_wait_queue_entry_tail(q, wait); | 		__add_wait_queue_entry_tail(q, wq_entry); | ||||||
| 	set_current_state(state); | 	set_current_state(state); | ||||||
| 	spin_unlock_irqrestore(&q->lock, flags); | 	spin_unlock_irqrestore(&q->lock, flags); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(prepare_to_wait_exclusive); | EXPORT_SYMBOL(prepare_to_wait_exclusive); | ||||||
| 
 | 
 | ||||||
| void init_wait_entry(wait_queue_entry_t *wait, int flags) | void init_wait_entry(struct wait_queue_entry *wq_entry, int flags) | ||||||
| { | { | ||||||
| 	wait->flags = flags; | 	wq_entry->flags = flags; | ||||||
| 	wait->private = current; | 	wq_entry->private = current; | ||||||
| 	wait->func = autoremove_wake_function; | 	wq_entry->func = autoremove_wake_function; | ||||||
| 	INIT_LIST_HEAD(&wait->task_list); | 	INIT_LIST_HEAD(&wq_entry->task_list); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(init_wait_entry); | EXPORT_SYMBOL(init_wait_entry); | ||||||
| 
 | 
 | ||||||
| long prepare_to_wait_event(wait_queue_head_t *q, wait_queue_entry_t *wait, int state) | long prepare_to_wait_event(wait_queue_head_t *q, struct wait_queue_entry *wq_entry, int state) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 	long ret = 0; | 	long ret = 0; | ||||||
|  | @ -225,14 +225,14 @@ long prepare_to_wait_event(wait_queue_head_t *q, wait_queue_entry_t *wait, int s | ||||||
| 		 * can't see us, it should wake up another exclusive waiter if | 		 * can't see us, it should wake up another exclusive waiter if | ||||||
| 		 * we fail. | 		 * we fail. | ||||||
| 		 */ | 		 */ | ||||||
| 		list_del_init(&wait->task_list); | 		list_del_init(&wq_entry->task_list); | ||||||
| 		ret = -ERESTARTSYS; | 		ret = -ERESTARTSYS; | ||||||
| 	} else { | 	} else { | ||||||
| 		if (list_empty(&wait->task_list)) { | 		if (list_empty(&wq_entry->task_list)) { | ||||||
| 			if (wait->flags & WQ_FLAG_EXCLUSIVE) | 			if (wq_entry->flags & WQ_FLAG_EXCLUSIVE) | ||||||
| 				__add_wait_queue_entry_tail(q, wait); | 				__add_wait_queue_entry_tail(q, wq_entry); | ||||||
| 			else | 			else | ||||||
| 				__add_wait_queue(q, wait); | 				__add_wait_queue(q, wq_entry); | ||||||
| 		} | 		} | ||||||
| 		set_current_state(state); | 		set_current_state(state); | ||||||
| 	} | 	} | ||||||
|  | @ -284,13 +284,13 @@ EXPORT_SYMBOL(do_wait_intr_irq); | ||||||
| /**
 | /**
 | ||||||
|  * finish_wait - clean up after waiting in a queue |  * finish_wait - clean up after waiting in a queue | ||||||
|  * @q: waitqueue waited on |  * @q: waitqueue waited on | ||||||
|  * @wait: wait descriptor |  * @wq_entry: wait descriptor | ||||||
|  * |  * | ||||||
|  * Sets current thread back to running state and removes |  * Sets current thread back to running state and removes | ||||||
|  * the wait descriptor from the given waitqueue if still |  * the wait descriptor from the given waitqueue if still | ||||||
|  * queued. |  * queued. | ||||||
|  */ |  */ | ||||||
| void finish_wait(wait_queue_head_t *q, wait_queue_entry_t *wait) | void finish_wait(wait_queue_head_t *q, struct wait_queue_entry *wq_entry) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 
 | 
 | ||||||
|  | @ -308,20 +308,20 @@ void finish_wait(wait_queue_head_t *q, wait_queue_entry_t *wait) | ||||||
| 	 *    have _one_ other CPU that looks at or modifies | 	 *    have _one_ other CPU that looks at or modifies | ||||||
| 	 *    the list). | 	 *    the list). | ||||||
| 	 */ | 	 */ | ||||||
| 	if (!list_empty_careful(&wait->task_list)) { | 	if (!list_empty_careful(&wq_entry->task_list)) { | ||||||
| 		spin_lock_irqsave(&q->lock, flags); | 		spin_lock_irqsave(&q->lock, flags); | ||||||
| 		list_del_init(&wait->task_list); | 		list_del_init(&wq_entry->task_list); | ||||||
| 		spin_unlock_irqrestore(&q->lock, flags); | 		spin_unlock_irqrestore(&q->lock, flags); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(finish_wait); | EXPORT_SYMBOL(finish_wait); | ||||||
| 
 | 
 | ||||||
| int autoremove_wake_function(wait_queue_entry_t *wait, unsigned mode, int sync, void *key) | int autoremove_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *key) | ||||||
| { | { | ||||||
| 	int ret = default_wake_function(wait, mode, sync, key); | 	int ret = default_wake_function(wq_entry, mode, sync, key); | ||||||
| 
 | 
 | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		list_del_init(&wait->task_list); | 		list_del_init(&wq_entry->task_list); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(autoremove_wake_function); | EXPORT_SYMBOL(autoremove_wake_function); | ||||||
|  | @ -341,17 +341,17 @@ static inline bool is_kthread_should_stop(void) | ||||||
|  * |  * | ||||||
|  *     p->state = mode;				condition = true; |  *     p->state = mode;				condition = true; | ||||||
|  *     smp_mb(); // A				smp_wmb(); // C
 |  *     smp_mb(); // A				smp_wmb(); // C
 | ||||||
|  *     if (!wait->flags & WQ_FLAG_WOKEN)	wait->flags |= WQ_FLAG_WOKEN; |  *     if (!wq_entry->flags & WQ_FLAG_WOKEN)	wq_entry->flags |= WQ_FLAG_WOKEN; | ||||||
|  *         schedule()				try_to_wake_up(); |  *         schedule()				try_to_wake_up(); | ||||||
|  *     p->state = TASK_RUNNING;		    ~~~~~~~~~~~~~~~~~~ |  *     p->state = TASK_RUNNING;		    ~~~~~~~~~~~~~~~~~~ | ||||||
|  *     wait->flags &= ~WQ_FLAG_WOKEN;		condition = true; |  *     wq_entry->flags &= ~WQ_FLAG_WOKEN;		condition = true; | ||||||
|  *     smp_mb() // B				smp_wmb(); // C
 |  *     smp_mb() // B				smp_wmb(); // C
 | ||||||
|  *						wait->flags |= WQ_FLAG_WOKEN; |  *						wq_entry->flags |= WQ_FLAG_WOKEN; | ||||||
|  * } |  * } | ||||||
|  * remove_wait_queue(&wq, &wait); |  * remove_wait_queue(&wq, &wait); | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| long wait_woken(wait_queue_entry_t *wait, unsigned mode, long timeout) | long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout) | ||||||
| { | { | ||||||
| 	set_current_state(mode); /* A */ | 	set_current_state(mode); /* A */ | ||||||
| 	/*
 | 	/*
 | ||||||
|  | @ -359,7 +359,7 @@ long wait_woken(wait_queue_entry_t *wait, unsigned mode, long timeout) | ||||||
| 	 * woken_wake_function() such that if we observe WQ_FLAG_WOKEN we must | 	 * woken_wake_function() such that if we observe WQ_FLAG_WOKEN we must | ||||||
| 	 * also observe all state before the wakeup. | 	 * also observe all state before the wakeup. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (!(wait->flags & WQ_FLAG_WOKEN) && !is_kthread_should_stop()) | 	if (!(wq_entry->flags & WQ_FLAG_WOKEN) && !is_kthread_should_stop()) | ||||||
| 		timeout = schedule_timeout(timeout); | 		timeout = schedule_timeout(timeout); | ||||||
| 	__set_current_state(TASK_RUNNING); | 	__set_current_state(TASK_RUNNING); | ||||||
| 
 | 
 | ||||||
|  | @ -369,13 +369,13 @@ long wait_woken(wait_queue_entry_t *wait, unsigned mode, long timeout) | ||||||
| 	 * condition being true _OR_ WQ_FLAG_WOKEN such that we will not miss | 	 * condition being true _OR_ WQ_FLAG_WOKEN such that we will not miss | ||||||
| 	 * an event. | 	 * an event. | ||||||
| 	 */ | 	 */ | ||||||
| 	smp_store_mb(wait->flags, wait->flags & ~WQ_FLAG_WOKEN); /* B */ | 	smp_store_mb(wq_entry->flags, wq_entry->flags & ~WQ_FLAG_WOKEN); /* B */ | ||||||
| 
 | 
 | ||||||
| 	return timeout; | 	return timeout; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(wait_woken); | EXPORT_SYMBOL(wait_woken); | ||||||
| 
 | 
 | ||||||
| int woken_wake_function(wait_queue_entry_t *wait, unsigned mode, int sync, void *key) | int woken_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *key) | ||||||
| { | { | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Although this function is called under waitqueue lock, LOCK | 	 * Although this function is called under waitqueue lock, LOCK | ||||||
|  | @ -385,24 +385,24 @@ int woken_wake_function(wait_queue_entry_t *wait, unsigned mode, int sync, void | ||||||
| 	 * and is paired with smp_store_mb() in wait_woken(). | 	 * and is paired with smp_store_mb() in wait_woken(). | ||||||
| 	 */ | 	 */ | ||||||
| 	smp_wmb(); /* C */ | 	smp_wmb(); /* C */ | ||||||
| 	wait->flags |= WQ_FLAG_WOKEN; | 	wq_entry->flags |= WQ_FLAG_WOKEN; | ||||||
| 
 | 
 | ||||||
| 	return default_wake_function(wait, mode, sync, key); | 	return default_wake_function(wq_entry, mode, sync, key); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(woken_wake_function); | EXPORT_SYMBOL(woken_wake_function); | ||||||
| 
 | 
 | ||||||
| int wake_bit_function(wait_queue_entry_t *wait, unsigned mode, int sync, void *arg) | int wake_bit_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *arg) | ||||||
| { | { | ||||||
| 	struct wait_bit_key *key = arg; | 	struct wait_bit_key *key = arg; | ||||||
| 	struct wait_bit_queue *wait_bit | 	struct wait_bit_queue *wait_bit | ||||||
| 		= container_of(wait, struct wait_bit_queue, wait); | 		= container_of(wq_entry, struct wait_bit_queue, wait); | ||||||
| 
 | 
 | ||||||
| 	if (wait_bit->key.flags != key->flags || | 	if (wait_bit->key.flags != key->flags || | ||||||
| 			wait_bit->key.bit_nr != key->bit_nr || | 			wait_bit->key.bit_nr != key->bit_nr || | ||||||
| 			test_bit(key->bit_nr, key->flags)) | 			test_bit(key->bit_nr, key->flags)) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	else | 	else | ||||||
| 		return autoremove_wake_function(wait, mode, sync, key); | 		return autoremove_wake_function(wq_entry, mode, sync, key); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(wake_bit_function); | EXPORT_SYMBOL(wake_bit_function); | ||||||
| 
 | 
 | ||||||
|  | @ -534,19 +534,19 @@ static inline wait_queue_head_t *atomic_t_waitqueue(atomic_t *p) | ||||||
| 	return bit_waitqueue(p, 0); | 	return bit_waitqueue(p, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int wake_atomic_t_function(wait_queue_entry_t *wait, unsigned mode, int sync, | static int wake_atomic_t_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, | ||||||
| 				  void *arg) | 				  void *arg) | ||||||
| { | { | ||||||
| 	struct wait_bit_key *key = arg; | 	struct wait_bit_key *key = arg; | ||||||
| 	struct wait_bit_queue *wait_bit | 	struct wait_bit_queue *wait_bit | ||||||
| 		= container_of(wait, struct wait_bit_queue, wait); | 		= container_of(wq_entry, struct wait_bit_queue, wait); | ||||||
| 	atomic_t *val = key->flags; | 	atomic_t *val = key->flags; | ||||||
| 
 | 
 | ||||||
| 	if (wait_bit->key.flags != key->flags || | 	if (wait_bit->key.flags != key->flags || | ||||||
| 	    wait_bit->key.bit_nr != key->bit_nr || | 	    wait_bit->key.bit_nr != key->bit_nr || | ||||||
| 	    atomic_read(val) != 0) | 	    atomic_read(val) != 0) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	return autoremove_wake_function(wait, mode, sync, key); | 	return autoremove_wake_function(wq_entry, mode, sync, key); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Ingo Molnar
						Ingo Molnar