--- src/sys/kern/kern_exit.c 2007/06/30 02:33:04 1.81 +++ src/sys/kern/kern_exit.c 2007/07/01 01:11:35 1.82 @@ -334,9 +334,15 @@ exit1(int rv) if (vm->vm_upcalls) upc_release(vm, lp); - /* clean up data related to virtual kernel operation */ - if (p->p_vkernel) + /* + * Clean up data related to virtual kernel operation. Clean up + * any vkernel context related to the current lwp now so we can + * destroy p_vkernel. + */ + if (p->p_vkernel) { + vkernel_lwp_exit(lp); vkernel_exit(p); + } /* * Release user portion of address space. @@ -518,6 +524,12 @@ lwp_exit(int masterexit) lp->lwp_flag |= LWP_WEXIT; /* + * Clean up any virtualization + */ + if (lp->lwp_vkernel) + vkernel_lwp_exit(lp); + + /* * Nobody actually wakes us when the lock * count reaches zero, so just wait one tick. */