summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormbr <mbr@FreeBSD.org>2006-09-19 19:25:11 +0000
committermbr <mbr@FreeBSD.org>2006-09-19 19:25:11 +0000
commitfc7fc7fa1c7291ea74d27d6f4d5984554e5ec118 (patch)
treed562c06fe3a019f5bc95a6a7ba4e7331151d1358
parent5f888e4283fc7a89c7d8215b8db38041d729df74 (diff)
downloadFreeBSD-src-fc7fc7fa1c7291ea74d27d6f4d5984554e5ec118.zip
FreeBSD-src-fc7fc7fa1c7291ea74d27d6f4d5984554e5ec118.tar.gz
Fix races between tty.c and sessrele() / doenterpgrp() / leavepgrp(). The tty
code is still under giant lock, but the session/pgrp release code just used proctree_locks. This explains why moving the proctree_lock in sys/kern/tty.c rev. 1.258 did fix the panics in our SMP systems. This should also fix some race panics with revoked ttys. Reviewed by: jhb MFC after: 1 week
-rw-r--r--sys/kern/kern_proc.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index a7386b2..e7b3460 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -401,6 +401,7 @@ doenterpgrp(p, pgrp)
fixjobc(p, pgrp, 1);
fixjobc(p, p->p_pgrp, 0);
+ mtx_lock(&Giant); /* XXX TTY */
PGRP_LOCK(pgrp);
PGRP_LOCK(savepgrp);
PROC_LOCK(p);
@@ -410,6 +411,7 @@ doenterpgrp(p, pgrp)
LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist);
PGRP_UNLOCK(savepgrp);
PGRP_UNLOCK(pgrp);
+ mtx_unlock(&Giant); /* XXX TTY */
if (LIST_EMPTY(&savepgrp->pg_members))
pgdelete(savepgrp);
}
@@ -425,12 +427,14 @@ leavepgrp(p)
sx_assert(&proctree_lock, SX_XLOCKED);
savepgrp = p->p_pgrp;
+ mtx_lock(&Giant); /* XXX TTY */
PGRP_LOCK(savepgrp);
PROC_LOCK(p);
LIST_REMOVE(p, p_pglist);
p->p_pgrp = NULL;
PROC_UNLOCK(p);
PGRP_UNLOCK(savepgrp);
+ mtx_unlock(&Giant); /* XXX TTY */
if (LIST_EMPTY(&savepgrp->pg_members))
pgdelete(savepgrp);
return (0);
@@ -455,6 +459,7 @@ pgdelete(pgrp)
*/
funsetownlst(&pgrp->pg_sigiolst);
+ mtx_lock(&Giant); /* XXX TTY */
PGRP_LOCK(pgrp);
if (pgrp->pg_session->s_ttyp != NULL &&
pgrp->pg_session->s_ttyp->t_pgrp == pgrp)
@@ -465,6 +470,7 @@ pgdelete(pgrp)
PGRP_UNLOCK(pgrp);
mtx_destroy(&pgrp->pg_mtx);
FREE(pgrp, M_PGRP);
+ mtx_unlock(&Giant); /* XXX TTY */
}
static void
OpenPOWER on IntegriCloud