summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2019-01-17 01:45:15 +0100
committerRichard Braun <rbraun@sceen.net>2019-01-17 01:45:20 +0100
commitf53f22632e1ef6c6b35ed333db581248cc6b54a8 (patch)
tree576775d16eee7b4c4db4d79d4a09ce960e111441
parent1baf7280d808feb6e25ce98ac9eefbb112de22fe (diff)
kern/sleepq: fix wake-up chaining
Thanks to Simon Venken for reporting this issue.
-rw-r--r--kern/sleepq.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/kern/sleepq.c b/kern/sleepq.c
index ca80e07b..8abd84c4 100644
--- a/kern/sleepq.c
+++ b/kern/sleepq.c
@@ -570,7 +570,12 @@ sleepq_wait_common(struct sleepq *sleepq, const char *wchan,
*/
next = sleepq_get_last_waiter(sleepq);
- if (next) {
+ /*
+ * Checking against the oldest waiter is enough as waiters are awaken
+ * in strict FIFO order.
+ */
+ if (next && (next != sleepq->oldest_waiter)) {
+ sleepq_waiter_set_pending_wakeup(next);
sleepq_waiter_wakeup(next);
}