diff --git a/sys/kern/lwkt_serialize.c b/sys/kern/lwkt_serialize.c --- a/sys/kern/lwkt_serialize.c +++ b/sys/kern/lwkt_serialize.c @@ -197,6 +197,14 @@ if (atomic_intr_handler_is_enabled(&s->interlock) == 0) { logslz(try, s); if (atomic_intr_cond_try(&s->interlock) == 0) { + /* Re-check the handler-enabled bit after acquiring, to close + * the window between the pre-acquire check and a concurrent + * handler_disable(). Matches lwkt_serialize_handler_call(). */ + if (atomic_intr_handler_is_enabled(&s->interlock) != 0) { + atomic_intr_cond_exit(&s->interlock, lwkt_serialize_wakeup, s); + logslz(tryfail, s); + return(1); + } s->last_td = curthread; logslz(tryok, s);