--- src/sys/kern/lwkt_serialize.c 2005/05/25 01:44:14 1.2 +++ src/sys/kern/lwkt_serialize.c 2005/05/25 22:59:19 1.3 @@ -124,12 +124,21 @@ lwkt_serialize_handler_call(lwkt_seriali /* * Helper functions + * + * It is possible to race an interrupt which acquires and releases the + * bit, then calls wakeup before we actually go to sleep, so we + * need to try again in a critical section before actually sleeping. + * This also works in the MP case since a remote thread calling wakeup + * on us has to forward the wakeup to us with IPI forwarding. */ static void lwkt_serialize_sleep(void *info) { lwkt_serialize_t s = info; - tsleep(s, 0, "slize", 0); + crit_enter(); + if (atomic_intr_cond_try(&s->interlock) == 0) + tsleep(s, 0, "slize", 0); + crit_exit(); } static void