Index: sys/kern/tty.c =================================================================== RCS file: /cvsroot/src/sys/kern/tty.c,v retrieving revision 1.283 diff -u -p -r1.283 tty.c --- sys/kern/tty.c 2 Jan 2020 16:52:55 -0000 1.283 +++ sys/kern/tty.c 2 Jan 2020 16:55:14 -0000 @@ -2551,27 +2551,35 @@ ttygetinfo(struct tty *tp, int fromsig, if (pick == NULL) { pick = p; + mutex_enter(p->p_lock); continue; } - if (pick->p_lock < p->p_lock) { - mutex_enter(pick->p_lock); - mutex_enter(p->p_lock); - } else if (pick->p_lock > p->p_lock) { - mutex_enter(p->p_lock); - mutex_enter(pick->p_lock); - } else + + if (p->p_lock < pick->p_lock) { + if (!mutex_tryenter(p->p_lock)) { + mutex_exit(pick->p_lock); + mutex_enter(p->p_lock); + mutex_enter(pick->p_lock); + } + } else if (p->p_lock > pick->p_lock) { mutex_enter(p->p_lock); + } + oldpick = pick; - if (proc_compare_wrapper(pick, p)) + if (proc_compare_wrapper(pick, p)) { pick = p; - mutex_exit(p->p_lock); - if (p->p_lock != oldpick->p_lock) mutex_exit(oldpick->p_lock); + } else { + mutex_exit(p->p_lock); + } } + if (fromsig && (SIGACTION_PS(pick->p_sigacts, SIGINFO).sa_flags & - SA_NOKERNINFO)) + SA_NOKERNINFO)) { + mutex_exit(pick->p_lock); return; + } msg = NULL; } @@ -2589,7 +2597,7 @@ ttygetinfo(struct tty *tp, int fromsig, pick->p_pid); strlcat(buf, lmsg, bufsz); - mutex_enter(pick->p_lock); + KASSERT(mutex_owned(pick->p_lock)); LIST_FOREACH(l, &pick->p_lwps, l_sibling) { const char *lp; lwp_lock(l); @@ -2679,11 +2687,8 @@ proc_compare_wrapper(struct proc *p1, st KASSERT(mutex_owned(p1->p_lock)); KASSERT(mutex_owned(p2->p_lock)); - if ((l1 = LIST_FIRST(&p1->p_lwps)) == NULL) - return 1; - - if ((l2 = LIST_FIRST(&p2->p_lwps)) == NULL) - return 0; + l1 = LIST_FIRST(&p1->p_lwps); + l2 = LIST_FIRST(&p2->p_lwps); return proc_compare(p1, l1, p2, l2); } Index: common/lib/libutil/proc_compare.c =================================================================== RCS file: /cvsroot/src/common/lib/libutil/proc_compare.c,v retrieving revision 1.1 diff -u -p -r1.1 proc_compare.c --- common/lib/libutil/proc_compare.c 21 Oct 2011 02:09:00 -0000 1.1 +++ common/lib/libutil/proc_compare.c 2 Jan 2020 16:55:14 -0000 @@ -89,6 +89,17 @@ int proc_compare(const PROC *p1, const LWP *l1, const PROC *p2, const LWP *l2) { /* + * weed out zombies + */ + switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) { + case ONLYA: + return 1; + case ONLYB: + return 0; + case BOTH: + goto out; + } + /* * see if at least one of them is runnable */ switch (TESTAB(ISRUN(p1), ISRUN(p2))) { @@ -105,17 +116,6 @@ proc_compare(const PROC *p1, const LWP * goto out; } /* - * weed out zombies - */ - switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) { - case ONLYA: - return 1; - case ONLYB: - return 0; - case BOTH: - goto out; - } - /* * pick the one with the smallest sleep time */ if (l1->l_slptime < l2->l_slptime)