Date: Wed, 10 Apr 2002 14:08:44 -0700 (PDT) From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 9540 for review Message-ID: <200204102108.g3AL8im95279@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=9540 Change 9540 by jhb@jhb_laptop on 2002/04/10 14:08:41 The lock order of pgrpsess_lock and proctree_lock has become too much of a mess, so bite the bullet and merge the two locks into one proctree_lock. phk reports that an unnamed Unix uses a single lock for all of this as well. Affected files ... ... //depot/projects/smpng/sys/coda/coda_venus.c#3 edit ... //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#14 edit ... //depot/projects/smpng/sys/fs/specfs/spec_vnops.c#12 edit ... //depot/projects/smpng/sys/kern/kern_descrip.c#22 edit ... //depot/projects/smpng/sys/kern/kern_exit.c#32 edit ... //depot/projects/smpng/sys/kern/kern_fork.c#37 edit ... //depot/projects/smpng/sys/kern/kern_ktrace.c#20 edit ... //depot/projects/smpng/sys/kern/kern_proc.c#26 edit ... //depot/projects/smpng/sys/kern/kern_prot.c#58 edit ... //depot/projects/smpng/sys/kern/kern_resource.c#21 edit ... //depot/projects/smpng/sys/kern/kern_sig.c#31 edit ... //depot/projects/smpng/sys/kern/subr_witness.c#43 edit ... //depot/projects/smpng/sys/kern/tty.c#18 edit ... //depot/projects/smpng/sys/kern/tty_pty.c#15 edit ... //depot/projects/smpng/sys/kern/vfs_aio.c#19 edit ... //depot/projects/smpng/sys/kern/vfs_vnops.c#23 edit ... //depot/projects/smpng/sys/sys/proc.h#44 edit Differences ... ==== //depot/projects/smpng/sys/coda/coda_venus.c#3 (text+ko) ==== @@ -95,11 +95,11 @@ #define INIT_IN(in, op, ident, p) \ (in)->opcode = (op); \ - PGRPSESS_SLOCK(); \ + sx_slock(&proctree_lock); \ (in)->pid = p ? p->p_pid : -1; \ (in)->pgid = p ? p->p_pgid : -1; \ (in)->sid = (p && p->p_session && p->p_session->s_leader) ? (p->p_session->s_leader->p_pid) : -1; \ - PGRPSESS_SUNLOCK(); \ + sx_sunlock(&proctree_lock); \ if (ident != NOCRED) { \ (in)->cred.cr_uid = ident->cr_uid; \ (in)->cred.cr_groupid = ident->cr_gid; \ ==== //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#14 (text+ko) ==== @@ -1337,13 +1337,13 @@ * Finally finished with old proc entry. * Unlink it from its process group and free it. */ + sx_xlock(&proctree_lock); leavepgrp(q); sx_xlock(&allproc_lock); LIST_REMOVE(q, p_list); /* off zombproc */ sx_xunlock(&allproc_lock); - sx_xlock(&proctree_lock); LIST_REMOVE(q, p_sibling); sx_xunlock(&proctree_lock); ==== //depot/projects/smpng/sys/fs/specfs/spec_vnops.c#12 (text+ko) ==== @@ -587,7 +587,7 @@ * plus the session), release the reference from the session. */ oldvp = NULL; - PGRPSESS_XLOCK(); + sx_xlock(&proctree_lock); if (vcount(vp) == 2 && td && (vp->v_flag & VXLOCK) == 0 && vp == td->td_proc->p_session->s_ttyvp) { SESS_LOCK(td->td_proc->p_session); @@ -595,7 +595,7 @@ SESS_UNLOCK(td->td_proc->p_session); oldvp = vp; } - PGRPSESS_XUNLOCK(); + sx_xunlock(&proctree_lock); if (oldvp != NULL) vrele(oldvp); /* ==== //depot/projects/smpng/sys/kern/kern_descrip.c#22 (text+ko) ==== @@ -640,7 +640,7 @@ sigio->sio_ucred = crhold(curthread->td_ucred); sigio->sio_myref = sigiop; - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); if (pgid > 0) { proc = pfind(pgid); if (proc == NULL) { @@ -698,14 +698,14 @@ sigio->sio_pgrp = pgrp; PGRP_UNLOCK(pgrp); } - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); s = splhigh(); *sigiop = sigio; splx(s); return (0); fail: - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); crfree(sigio->sio_ucred); FREE(sigio, M_SIGIO); return (ret); ==== //depot/projects/smpng/sys/kern/kern_exit.c#32 (text+ko) ==== @@ -234,7 +234,7 @@ vm->vm_freer = p; } - PGRPSESS_XLOCK(); + sx_xlock(&proctree_lock); if (SESS_LEADER(p)) { register struct session *sp; @@ -254,9 +254,9 @@ PGRP_UNLOCK(sp->s_ttyp->t_pgrp); } /* XXX tp should be locked. */ - PGRPSESS_XUNLOCK(); + sx_xunlock(&proctree_lock); (void) ttywait(tp); - PGRPSESS_XLOCK(); + sx_xlock(&proctree_lock); /* * The tty could have been revoked * if we blocked. @@ -266,10 +266,10 @@ SESS_LOCK(p->p_session); sp->s_ttyvp = NULL; SESS_UNLOCK(p->p_session); - PGRPSESS_XUNLOCK(); + sx_xunlock(&proctree_lock); VOP_REVOKE(ttyvp, REVOKEALL); - PGRPSESS_XLOCK(); vrele(ttyvp); + sx_xlock(&proctree_lock); } } if (sp->s_ttyvp) { @@ -290,7 +290,7 @@ SESS_UNLOCK(p->p_session); } fixjobc(p, p->p_pgrp, 0); - PGRPSESS_XUNLOCK(); + sx_xunlock(&proctree_lock); (void)acct_process(td); #ifdef KTRACE /* ==== //depot/projects/smpng/sys/kern/kern_fork.c#37 (text+ko) ==== @@ -570,7 +570,7 @@ p2->p_limit->p_refcnt++; } - PGRPSESS_XLOCK(); + sx_xlock(&proctree_lock); PGRP_LOCK(p1->p_pgrp); PROC_LOCK(p2); PROC_LOCK(p1); @@ -589,7 +589,6 @@ LIST_INSERT_AFTER(p1, p2, p_pglist); PGRP_UNLOCK(p1->p_pgrp); - PGRPSESS_XUNLOCK(); LIST_INIT(&p2->p_children); LIST_INIT(&td2->td_contested); /* XXXKSE only 1 thread? */ @@ -623,7 +622,6 @@ */ _PHOLD(p1); PROC_UNLOCK(p1); - PROC_UNLOCK(p2); /* * Attach the new process to its parent. @@ -636,12 +634,8 @@ pptr = initproc; else pptr = p1; - sx_xlock(&proctree_lock); - PROC_LOCK(p2); p2->p_pptr = pptr; - PROC_LOCK(pptr); LIST_INSERT_HEAD(&pptr->p_children, p2, p_sibling); - PROC_UNLOCK(pptr); PROC_UNLOCK(p2); sx_xunlock(&proctree_lock); ==== //depot/projects/smpng/sys/kern/kern_ktrace.c#20 (text+ko) ==== @@ -357,16 +357,16 @@ /* * by process group */ - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); pg = pgfind(-uap->pid); if (pg == NULL) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); error = ESRCH; goto done; } /* * ktrops() may call vrele(). Lock pg_members - * by the pgrpsess_lock rather than pg_mtx. + * by the proctree_lock rather than pg_mtx. */ PGRP_UNLOCK(pg); LIST_FOREACH(p, &pg->pg_members, p_pglist) @@ -374,7 +374,7 @@ ret |= ktrsetchildren(td, p, ops, facs, vp); else ret |= ktrops(td, p, ops, facs, vp); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); } else { /* * by pid ==== //depot/projects/smpng/sys/kern/kern_proc.c#26 (text+ko) ==== @@ -80,7 +80,6 @@ struct proclist zombproc; struct sx allproc_lock; struct sx proctree_lock; -struct sx pgrpsess_lock; struct mtx pargs_ref_lock; uma_zone_t proc_zone; uma_zone_t ithread_zone; @@ -96,7 +95,6 @@ sx_init(&allproc_lock, "allproc"); sx_init(&proctree_lock, "proctree"); - sx_init(&pgrpsess_lock, "pgrpsess"); mtx_init(&pargs_ref_lock, "struct pargs.ref", NULL, MTX_DEF); LIST_INIT(&allproc); LIST_INIT(&zombproc); @@ -284,7 +282,7 @@ /* * Locate a process group by number. - * The caller must hold pgrpsess_lock. + * The caller must hold proctree_lock. */ struct pgrp * pgfind(pgid) @@ -292,7 +290,7 @@ { register struct pgrp *pgrp; - PGRPSESS_LOCK_ASSERT(SX_LOCKED); + sx_assert(&proctree_lock, SX_LOCKED); LIST_FOREACH(pgrp, PGRPHASH(pgid), pg_hash) { if (pgrp->pg_id == pgid) { @@ -317,7 +315,7 @@ { struct pgrp *pgrp2; - PGRPSESS_LOCK_ASSERT(SX_XLOCKED); + sx_assert(&proctree_lock, SX_XLOCKED); KASSERT(pgrp != NULL, ("enterpgrp: pgrp == NULL")); KASSERT(p->p_pid == pgid, @@ -362,7 +360,7 @@ LIST_INIT(&pgrp->pg_members); /* - * As we have an exclusive lock of pgrpsess_lock, + * As we have an exclusive lock of proctree_lock, * this should not deadlock. */ LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash); @@ -383,7 +381,8 @@ register struct proc *p; struct pgrp *pgrp; { - PGRPSESS_LOCK_ASSERT(SX_XLOCKED); + + sx_assert(&proctree_lock, SX_XLOCKED); PROC_LOCK_ASSERT(p, MA_NOTOWNED); PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); PGRP_LOCK_ASSERT(p->p_pgrp, MA_NOTOWNED); @@ -411,7 +410,7 @@ { struct pgrp *savepgrp; - PGRPSESS_LOCK_ASSERT(SX_XLOCKED); + sx_assert(&proctree_lock, SX_XLOCKED); PROC_LOCK_ASSERT(p, MA_NOTOWNED); PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); PGRP_LOCK_ASSERT(p->p_pgrp, MA_NOTOWNED); @@ -449,7 +448,7 @@ { struct pgrp *savepgrp; - PGRPSESS_XLOCK(); + sx_assert(&proctree_lock, SX_XLOCKED); savepgrp = p->p_pgrp; PGRP_LOCK(savepgrp); PROC_LOCK(p); @@ -459,7 +458,6 @@ PGRP_UNLOCK(savepgrp); if (LIST_EMPTY(&savepgrp->pg_members)) pgdelete(savepgrp); - PGRPSESS_XUNLOCK(); return (0); } @@ -472,7 +470,7 @@ { struct session *savesess; - PGRPSESS_LOCK_ASSERT(SX_XLOCKED); + sx_assert(&proctree_lock, SX_XLOCKED); PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED); @@ -520,7 +518,7 @@ register struct pgrp *hispgrp; register struct session *mysession; - PGRPSESS_LOCK_ASSERT(SX_LOCKED); + sx_assert(&proctree_lock, SX_LOCKED); PROC_LOCK_ASSERT(p, MA_NOTOWNED); PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED); @@ -530,7 +528,6 @@ * group; if so, adjust count for p's process group. */ mysession = pgrp->pg_session; - sx_slock(&proctree_lock); if ((hispgrp = p->p_pptr->p_pgrp) != pgrp && hispgrp->pg_session == mysession) { PGRP_LOCK(pgrp); @@ -564,7 +561,6 @@ PGRP_UNLOCK(hispgrp); } } - sx_sunlock(&proctree_lock); } /* ==== //depot/projects/smpng/sys/kern/kern_prot.c#58 (text+ko) ==== @@ -349,30 +349,28 @@ MALLOC(newpgrp, struct pgrp *, sizeof(struct pgrp), M_PGRP, M_WAITOK | M_ZERO); MALLOC(newsess, struct session *, sizeof(struct session), M_SESSION, M_WAITOK | M_ZERO); - PGRPSESS_XLOCK(); + sx_xlock(&proctree_lock); if (p->p_pgid == p->p_pid || (pgrp = pgfind(p->p_pid)) != NULL) { if (pgrp != NULL) PGRP_UNLOCK(pgrp); error = EPERM; - goto fail; } else { (void)enterpgrp(p, p->p_pid, newpgrp, newsess); td->td_retval[0] = p->p_pid; - error = 0; + newpgrp = NULL; + newsess = NULL; } - PGRPSESS_XUNLOCK(); - mtx_unlock(&Giant); - return (0); -fail: - PGRPSESS_XUNLOCK(); + sx_xunlock(&proctree_lock); - FREE(newpgrp, M_PGRP); - FREE(newsess, M_SESSION); + if (newpgrp != NULL) + FREE(newpgrp, M_PGRP); + if (newsess != NULL) + FREE(newsess, M_SESSION); mtx_unlock(&Giant); - return (0); + return (error); } /* @@ -416,45 +414,40 @@ MALLOC(newpgrp, struct pgrp *, sizeof(struct pgrp), M_PGRP, M_WAITOK | M_ZERO); - PGRPSESS_XLOCK(); - + sx_xlock(&proctree_lock); if (uap->pid != 0 && uap->pid != curp->p_pid) { - sx_slock(&proctree_lock); if ((targp = pfind(uap->pid)) == NULL) { if (targp) PROC_UNLOCK(targp); - sx_sunlock(&proctree_lock); error = ESRCH; - goto fail; + goto done; } if (!inferior(targp)) { PROC_UNLOCK(targp); - sx_sunlock(&proctree_lock); error = ESRCH; - goto fail; + goto done; } - sx_sunlock(&proctree_lock); if ((error = p_cansee(curproc, targp))) { PROC_UNLOCK(targp); - goto fail; + goto done; } if (targp->p_pgrp == NULL || targp->p_session != curp->p_session) { PROC_UNLOCK(targp); error = EPERM; - goto fail; + goto done; } if (targp->p_flag & P_EXEC) { PROC_UNLOCK(targp); error = EACCES; - goto fail; + goto done; } PROC_UNLOCK(targp); } else targp = curp; if (SESS_LEADER(targp)) { error = EPERM; - goto fail; + goto done; } if (uap->pgid == 0) uap->pgid = targp->p_pid; @@ -470,7 +463,7 @@ if (pgrp != NULL) PGRP_UNLOCK(pgrp); error = EPERM; - goto fail; + goto done; } if (pgrp == targp->p_pgrp) { PGRP_UNLOCK(pgrp); @@ -480,20 +473,12 @@ error = enterthispgrp(targp, pgrp); } done: - PGRPSESS_XUNLOCK(); + sx_xunlock(&proctree_lock); + KASSERT((error == 0) || (newpgrp != NULL), + ("setpgid failed and newpgrp is NULL")); if (newpgrp != NULL) FREE(newpgrp, M_PGRP); mtx_unlock(&Giant); - return (0); - -fail: - PGRPSESS_XUNLOCK(); - - KASSERT(newpgrp != NULL, ("setpgid failed and newpgrp is null.")); - KASSERT(error != 0, ("setpgid successfully failed?")); - FREE(newpgrp, M_PGRP); - - mtx_unlock(&Giant); return (error); } ==== //depot/projects/smpng/sys/kern/kern_resource.c#21 (text+ko) ==== @@ -110,18 +110,18 @@ case PRIO_PGRP: { register struct pgrp *pg; - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); if (uap->who == 0) { pg = td->td_proc->p_pgrp; PGRP_LOCK(pg); } else { pg = pgfind(uap->who); if (pg == NULL) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); break; } } - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); LIST_FOREACH(p, &pg->pg_members, p_pglist) { PROC_LOCK(p); if (!p_cansee(td->td_proc, p) && p->p_ksegrp.kg_nice /* XXXKSE */ < low) @@ -200,18 +200,18 @@ case PRIO_PGRP: { register struct pgrp *pg; - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); if (uap->who == 0) { pg = curp->p_pgrp; PGRP_LOCK(pg); } else { pg = pgfind(uap->who); if (pg == NULL) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); break; } } - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); LIST_FOREACH(p, &pg->pg_members, p_pglist) { PROC_LOCK(p); if (!p_cansee(td->td_proc, p)) { ==== //depot/projects/smpng/sys/kern/kern_sig.c#31 (text+ko) ==== @@ -1018,7 +1018,7 @@ } sx_sunlock(&allproc_lock); } else { - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); if (pgid == 0) { /* * zero pgid means send to my process group. @@ -1028,11 +1028,11 @@ } else { pgrp = pgfind(pgid); if (pgrp == NULL) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (ESRCH); } } - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); LIST_FOREACH(p, &pgrp->pg_members, p_pglist) { PROC_LOCK(p); if (p->p_pid <= 1 || p->p_flag & P_SYSTEM) { @@ -1144,9 +1144,9 @@ struct pgrp *pgrp; if (pgid != 0) { - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); pgrp = pgfind(pgid); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); if (pgrp != NULL) { pgsignal(pgrp, sig, 0); PGRP_UNLOCK(pgrp); ==== //depot/projects/smpng/sys/kern/subr_witness.c#43 (text+ko) ==== @@ -187,7 +187,6 @@ static struct witness_order_list_entry order_lists[] = { { "Giant", &lock_class_mtx_sleep }, - { "pgrpsess", &lock_class_sx }, { "proctree", &lock_class_sx }, { "allproc", &lock_class_sx }, { "process group", &lock_class_mtx_sleep }, ==== //depot/projects/smpng/sys/kern/tty.c#18 (text+ko) ==== @@ -731,6 +731,7 @@ { register struct proc *p; struct thread *td; + struct pgrp *pgrp; int s, error; td = curthread; /* XXX */ @@ -770,30 +771,30 @@ case TIOCSETP: case TIOCSLTC: #endif - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); PROC_LOCK(p); while (isbackground(p, tp) && !(p->p_flag & P_PPWAIT) && !SIGISMEMBER(p->p_sigignore, SIGTTOU) && !SIGISMEMBER(p->p_sigmask, SIGTTOU)) { - if (p->p_pgrp->pg_jobc == 0) { - PROC_UNLOCK(p); - PGRPSESS_SUNLOCK(); + pgrp = p->p_pgrp; + PROC_UNLOCK(p); + if (pgrp->pg_jobc == 0) { + sx_sunlock(&proctree_lock); return (EIO); } - PROC_UNLOCK(p); - PGRP_LOCK(p->p_pgrp); - PGRPSESS_SUNLOCK(); - pgsignal(p->p_pgrp, SIGTTOU, 1); - PGRP_UNLOCK(p->p_pgrp); + PGRP_LOCK(pgrp); + sx_sunlock(&proctree_lock); + pgsignal(pgrp, SIGTTOU, 1); + PGRP_UNLOCK(pgrp); error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, "ttybg1", 0); if (error) return (error); - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); PROC_LOCK(p); } PROC_UNLOCK(p); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); break; } @@ -1053,11 +1054,11 @@ break; case TIOCSCTTY: /* become controlling tty */ /* Session ctty vnode pointer set in vnode layer. */ - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); if (!SESS_LEADER(p) || ((p->p_session->s_ttyvp || tp->t_session) && (tp->t_session != p->p_session))) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (EPERM); } tp->t_session = p->p_session; @@ -1068,29 +1069,27 @@ PROC_LOCK(p); p->p_flag |= P_CONTROLT; PROC_UNLOCK(p); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); break; case TIOCSPGRP: { /* set pgrp of tty */ - register struct pgrp *pgrp; - - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); pgrp = pgfind(*(int *)data); if (!isctty(p, tp)) { if (pgrp != NULL) PGRP_UNLOCK(pgrp); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (ENOTTY); } if (pgrp == NULL) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (EPERM); } PGRP_UNLOCK(pgrp); if (pgrp->pg_session != p->p_session) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (EPERM); } - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); tp->t_pgrp = pgrp; break; } @@ -1527,7 +1526,7 @@ SET(tp->t_state, TS_ZOMBIE); CLR(tp->t_state, TS_CONNECTED); if (tp->t_session) { - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); if (tp->t_session->s_leader) { struct proc *p; @@ -1536,7 +1535,7 @@ psignal(p, SIGHUP); PROC_UNLOCK(p); } - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); } ttyflush(tp, FREAD | FWRITE); return (0); @@ -1601,6 +1600,7 @@ int has_stime = 0, last_cc = 0; long slp = 0; /* XXX this should be renamed `timo'. */ struct timeval stime; + struct pgrp *pg; loop: s = spltty(); @@ -1620,20 +1620,21 @@ */ if (isbackground(p, tp)) { splx(s); - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); PROC_LOCK(p); if (SIGISMEMBER(p->p_sigignore, SIGTTIN) || SIGISMEMBER(p->p_sigmask, SIGTTIN) || (p->p_flag & P_PPWAIT) || p->p_pgrp->pg_jobc == 0) { PROC_UNLOCK(p); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (EIO); } + pg = p->p_pgrp; PROC_UNLOCK(p); - PGRP_LOCK(p->p_pgrp); - PGRPSESS_SUNLOCK(); - pgsignal(p->p_pgrp, SIGTTIN, 1); - PGRP_UNLOCK(p->p_pgrp); + PGRP_LOCK(pg); + sx_sunlock(&proctree_lock); + pgsignal(pg, SIGTTIN, 1); + PGRP_UNLOCK(pg); error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg2", 0); if (error) return (error); @@ -1939,7 +1940,7 @@ * Hang the process if it's in the background. */ p = curproc; - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); PROC_LOCK(p); if (isbackground(p, tp) && ISSET(tp->t_lflag, TOSTOP) && !(p->p_flag & P_PPWAIT) && @@ -1947,13 +1948,13 @@ !SIGISMEMBER(p->p_sigmask, SIGTTOU)) { if (p->p_pgrp->pg_jobc == 0) { PROC_UNLOCK(p); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); error = EIO; goto out; } PROC_UNLOCK(p); PGRP_LOCK(p->p_pgrp); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); pgsignal(p->p_pgrp, SIGTTOU, 1); PGRP_UNLOCK(p->p_pgrp); error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg4", 0); @@ -1962,7 +1963,7 @@ goto loop; } else { PROC_UNLOCK(p); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); } /* * Process the user's data in at most OBUFSIZ chunks. Perform any ==== //depot/projects/smpng/sys/kern/tty_pty.c#15 (text+ko) ==== @@ -234,25 +234,27 @@ struct proc *p = td->td_proc; register struct tty *tp = dev->si_tty; register struct pt_ioctl *pti = dev->si_drv1; + struct pgrp *pg; int error = 0; again: if (pti->pt_flags & PF_REMOTE) { while (isbackground(p, tp)) { - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); PROC_LOCK(p); if (SIGISMEMBER(p->p_sigignore, SIGTTIN) || SIGISMEMBER(p->p_sigmask, SIGTTIN) || p->p_pgrp->pg_jobc == 0 || p->p_flag & P_PPWAIT) { PROC_UNLOCK(p); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (EIO); } + pg = p->p_pgrp; PROC_UNLOCK(p); - PGRP_LOCK(p->p_pgrp); - PGRPSESS_SUNLOCK(); - pgsignal(p->p_pgrp, SIGTTIN, 1); - PGRP_UNLOCK(p->p_pgrp); + PGRP_LOCK(pg); + sx_sunlock(&proctree_lock); + pgsignal(pg, SIGTTIN, 1); + PGRP_UNLOCK(pg); error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ptsbg", 0); if (error) ==== //depot/projects/smpng/sys/kern/vfs_aio.c#19 (text+ko) ==== @@ -818,9 +818,9 @@ MALLOC(newsess, struct session *, sizeof(struct session), M_SESSION, M_WAITOK | M_ZERO); - PGRPSESS_XLOCK(); + sx_xlock(&proctree_lock); enterpgrp(mycp, mycp->p_pid, newpgrp, newsess); - PGRPSESS_XUNLOCK(); + sx_xunlock(&proctree_lock); /* Mark special process type. */ mycp->p_flag |= P_SYSTEM; ==== //depot/projects/smpng/sys/kern/vfs_vnops.c#23 (text+ko) ==== @@ -701,9 +701,9 @@ if (error == 0 && com == TIOCSCTTY) { /* Do nothing if reassigning same control tty */ - PGRPSESS_SLOCK(); + sx_slock(&proctree_lock); if (td->td_proc->p_session->s_ttyvp == vp) { - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); return (0); } @@ -713,7 +713,7 @@ td->td_proc->p_session->s_ttyvp = vp; SESS_UNLOCK(td->td_proc->p_session); - PGRPSESS_SUNLOCK(); + sx_sunlock(&proctree_lock); /* Get rid of reference to old control tty */ if (vpold) ==== //depot/projects/smpng/sys/sys/proc.h#44 (text+ko) ==== @@ -64,12 +64,12 @@ * * List of locks * (m) locked by s_mtx mtx - * (ps) locked by pgrpsess_lock sx + * (e) locked by proctree_lock sx * (c) const until freeing */ struct session { int s_count; /* (m) Ref cnt; pgrps in session. */ - struct proc *s_leader; /* (m, ps) Session leader. */ + struct proc *s_leader; /* (m + e) Session leader. */ struct vnode *s_ttyvp; /* (m) Vnode of controlling terminal. */ struct tty *s_ttyp; /* (m) Controlling terminal. */ pid_t s_sid; /* (c) Session ID. */ @@ -83,12 +83,12 @@ * * List of locks * (m) locked by pg_mtx mtx - * (ps) locked by pgrpsess_lock sx + * (e) locked by proctree_lock sx * (c) const until freeing */ struct pgrp { - LIST_ENTRY(pgrp) pg_hash; /* (ps) Hash chain. */ - LIST_HEAD(, proc) pg_members; /* (m, ps) Pointer to pgrp members. */ + LIST_ENTRY(pgrp) pg_hash; /* (e) Hash chain. */ + LIST_HEAD(, proc) pg_members; /* (m + e) Pointer to pgrp members. */ struct session *pg_session; /* (c) Pointer to session. */ struct sigiolst pg_sigiolst; /* (m) List of sigio sources. */ pid_t pg_id; /* (c) Pgrp id. */ @@ -147,7 +147,6 @@ * l - the attaching proc or attaching proc parent * m - Giant * n - not locked, lazy - * o - locked by pgrpsess_lock sx * p - select lock (sellock) * * If the locking key specifies two identifiers (for example, p_pptr) then @@ -399,7 +398,7 @@ pid_t p_pid; /* (b) Process identifier. */ LIST_ENTRY(proc) p_hash; /* (d) Hash chain. */ - LIST_ENTRY(proc) p_pglist; /* (g + o) List of processes in pgrp. */ + LIST_ENTRY(proc) p_pglist; /* (g + e) List of processes in pgrp. */ struct proc *p_pptr; /* (c + e) Pointer to parent process. */ LIST_ENTRY(proc) p_sibling; /* (e) List of sibling processes. */ LIST_HEAD(, proc) p_children; /* (e) Pointer to list of children. */ @@ -438,7 +437,7 @@ stack_t p_sigstk; /* (c) Stack ptr and on-stack flag. */ int p_magic; /* (b) Magic number. */ char p_comm[MAXCOMLEN + 1]; /* (b) Process name. */ - struct pgrp *p_pgrp; /* (c + o) Pointer to process group. */ + struct pgrp *p_pgrp; /* (c + e) Pointer to process group. */ struct sysentvec *p_sysent; /* (b) Syscall dispatch info. */ struct pargs *p_args; /* (c) Process arguments. */ /* End area that is copied on creation. */ @@ -603,12 +602,6 @@ #define PROC_LOCKED(p) mtx_owned(&(p)->p_mtx) #define PROC_LOCK_ASSERT(p, type) mtx_assert(&(p)->p_mtx, (type)) -#define PGRPSESS_SLOCK() sx_slock(&pgrpsess_lock) -#define PGRPSESS_XLOCK() sx_xlock(&pgrpsess_lock) -#define PGRPSESS_SUNLOCK() sx_sunlock(&pgrpsess_lock) -#define PGRPSESS_XUNLOCK() sx_xunlock(&pgrpsess_lock) -#define PGRPSESS_LOCK_ASSERT(type) sx_assert(&pgrpsess_lock, (type)) - /* Lock and unlock a process group. */ #define PGRP_LOCK(pg) mtx_lock(&(pg)->pg_mtx) #define PGRP_UNLOCK(pg) mtx_unlock(&(pg)->pg_mtx) @@ -673,7 +666,6 @@ extern struct sx allproc_lock; extern struct sx proctree_lock; -extern struct sx pgrpsess_lock; extern struct mtx pargs_ref_lock; extern struct proc proc0; /* Process slot for swapper. */ extern struct thread thread0; /* Primary thread in proc0 */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200204102108.g3AL8im95279>