diff --git a/sys/kern/condvar.c b/sys/kern/condvar.c index fb80172cd6..245ee68d9e 100644 --- a/sys/kern/condvar.c +++ b/sys/kern/condvar.c @@ -1,6 +1,7 @@ #include #include #include +#include #include void cv_init(condvar_t *cv, const char *name) { @@ -9,9 +10,12 @@ void cv_init(condvar_t *cv, const char *name) { } void cv_wait(condvar_t *cv, lock_t m) { - WITH_NO_PREEMPTION { + WITH_INTR_DISABLED { cv->waiters++; lk_release(m); + /* If we got interrupted here and an interrupt filter called + * cv_signal, we would have a lost wakeup, so we need interrupts + * to be disabled. Same goes for cv_wait_timed. */ sleepq_wait(cv, __caller(0)); } lk_acquire(m, __caller(0)); @@ -19,7 +23,7 @@ void cv_wait(condvar_t *cv, lock_t m) { int cv_wait_timed(condvar_t *cv, lock_t m, systime_t timeout) { int status; - WITH_NO_PREEMPTION { + WITH_INTR_DISABLED { cv->waiters++; lk_release(m); status = sleepq_wait_timed(cv, __caller(0), timeout);