diff options
Diffstat (limited to 'kernel/sched/wait.c')
| -rw-r--r-- | kernel/sched/wait.c | 18 | 
1 files changed, 11 insertions, 7 deletions
| diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c index 9860bb9a847c..133b74730738 100644 --- a/kernel/sched/wait.c +++ b/kernel/sched/wait.c @@ -121,11 +121,12 @@ static int __wake_up_common(struct wait_queue_head *wq_head, unsigned int mode,  	return nr_exclusive;  } -static void __wake_up_common_lock(struct wait_queue_head *wq_head, unsigned int mode, +static int __wake_up_common_lock(struct wait_queue_head *wq_head, unsigned int mode,  			int nr_exclusive, int wake_flags, void *key)  {  	unsigned long flags;  	wait_queue_entry_t bookmark; +	int remaining = nr_exclusive;  	bookmark.flags = 0;  	bookmark.private = NULL; @@ -134,10 +135,12 @@ static void __wake_up_common_lock(struct wait_queue_head *wq_head, unsigned int  	do {  		spin_lock_irqsave(&wq_head->lock, flags); -		nr_exclusive = __wake_up_common(wq_head, mode, nr_exclusive, +		remaining = __wake_up_common(wq_head, mode, remaining,  						wake_flags, key, &bookmark);  		spin_unlock_irqrestore(&wq_head->lock, flags);  	} while (bookmark.flags & WQ_FLAG_BOOKMARK); + +	return nr_exclusive - remaining;  }  /** @@ -147,13 +150,14 @@ static void __wake_up_common_lock(struct wait_queue_head *wq_head, unsigned int   * @nr_exclusive: how many wake-one or wake-many threads to wake up   * @key: is directly passed to the wakeup function   * - * If this function wakes up a task, it executes a full memory barrier before - * accessing the task state. + * If this function wakes up a task, it executes a full memory barrier + * before accessing the task state.  Returns the number of exclusive + * tasks that were awaken.   */ -void __wake_up(struct wait_queue_head *wq_head, unsigned int mode, -			int nr_exclusive, void *key) +int __wake_up(struct wait_queue_head *wq_head, unsigned int mode, +	      int nr_exclusive, void *key)  { -	__wake_up_common_lock(wq_head, mode, nr_exclusive, 0, key); +	return __wake_up_common_lock(wq_head, mode, nr_exclusive, 0, key);  }  EXPORT_SYMBOL(__wake_up); |