Index: kernel/generic/src/synch/condvar.c
===================================================================
--- kernel/generic/src/synch/condvar.c	(revision 4f5e1c7c92f197446ceb7d6406c1f5233ad02527)
+++ kernel/generic/src/synch/condvar.c	(revision 497bd656d30dfa5181c542cab4d9d1807cbe1bbd)
@@ -91,4 +91,5 @@
 
 	ipl = waitq_sleep_prepare(&cv->wq);
+	/* Unlock only after the waitq is locked so we don't miss a wakeup. */
 	mutex_unlock(mtx);
 
@@ -96,6 +97,7 @@
 	rc = waitq_sleep_timeout_unsafe(&cv->wq, usec, flags);
 
+	waitq_sleep_finish(&cv->wq, rc, ipl);
+	/* Lock only after releasing the waitq to avoid a possible deadlock. */
 	mutex_lock(mtx);
-	waitq_sleep_finish(&cv->wq, rc, ipl);
 
 	return rc;
@@ -128,4 +130,5 @@
 	ipl = waitq_sleep_prepare(&cv->wq);
 
+	/* Unlock only after the waitq is locked so we don't miss a wakeup. */
 	spinlock_unlock(lock);
 
@@ -134,5 +137,5 @@
 
 	waitq_sleep_finish(&cv->wq, rc, ipl);
-	
+	/* Lock only after releasing the waitq to avoid a possible deadlock. */
 	spinlock_lock(lock);
 	
