Skip site navigation (1)Skip section navigation (2)
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>