--- a/sys/dev/misc/vkbd/vkbd.c +++ b/sys/dev/misc/vkbd/vkbd.c @@ -304,11 +304,14 @@ vkbd_dev_close(struct dev_close_args *ap) VKBD_LOCK(state); /* wait for interrupt task */ - while (state->ks_flags & TASK) - VKBD_SLEEP(state, ks_task, "vkbdc", 0); + while (state->ks_flags & TASK) { + tsleep_interlock(&state->ks_task); + if (!(state->ks_flags & TASK)) + break; + VKBD_SLEEP(state, ks_task, "vkbdc", 0); + }