diff options
author | Richard Braun <rbraun@sceen.net> | 2019-01-17 01:45:15 +0100 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2019-01-17 01:45:20 +0100 |
commit | f53f22632e1ef6c6b35ed333db581248cc6b54a8 (patch) | |
tree | 576775d16eee7b4c4db4d79d4a09ce960e111441 | |
parent | 1baf7280d808feb6e25ce98ac9eefbb112de22fe (diff) |
kern/sleepq: fix wake-up chaining
Thanks to Simon Venken for reporting this issue.
-rw-r--r-- | kern/sleepq.c | 7 |
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); } |