Index: kern/sys_lwp.c =================================================================== RCS file: /cvsroot/src/sys/kern/sys_lwp.c,v retrieving revision 1.49 diff -u -p -u -r1.49 sys_lwp.c --- kern/sys_lwp.c 23 Apr 2010 19:18:09 -0000 1.49 +++ kern/sys_lwp.c 3 Jun 2010 06:52:31 -0000 @@ -82,6 +82,7 @@ sys__lwp_create(struct lwp *l, const str } */ struct proc *p = l->l_proc; struct lwp *l2; + struct schedstate_percpu *spc; vaddr_t uaddr; ucontext_t *newuc; int error, lid; @@ -133,20 +134,23 @@ sys__lwp_create(struct lwp *l, const str */ mutex_enter(p->p_lock); lwp_lock(l2); + spc = &l2->l_cpu->ci_schedstate; if ((SCARG(uap, flags) & LWP_SUSPENDED) == 0 && (l->l_flag & (LW_WREBOOT | LW_WSUSPEND | LW_WEXIT)) == 0) { - if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) + if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) { + KASSERT(l2->l_wchan == NULL); l2->l_stat = LSSTOP; - else { - KASSERT(lwp_locked(l2, l2->l_cpu->ci_schedstate.spc_mutex)); + lwp_unlock_to(l2, spc->spc_lwplock); + } else { + KASSERT(lwp_locked(l2, spc->spc_mutex)); p->p_nrlwps++; l2->l_stat = LSRUN; sched_enqueue(l2, false); + lwp_unlock(l2); } - lwp_unlock(l2); } else { l2->l_stat = LSSUSPENDED; - lwp_unlock_to(l2, l2->l_cpu->ci_schedstate.spc_lwplock); + lwp_unlock_to(l2, spc->spc_lwplock); } mutex_exit(p->p_lock);