diff options
author | mbr <mbr@FreeBSD.org> | 2006-09-19 19:25:11 +0000 |
---|---|---|
committer | mbr <mbr@FreeBSD.org> | 2006-09-19 19:25:11 +0000 |
commit | fc7fc7fa1c7291ea74d27d6f4d5984554e5ec118 (patch) | |
tree | d562c06fe3a019f5bc95a6a7ba4e7331151d1358 | |
parent | 5f888e4283fc7a89c7d8215b8db38041d729df74 (diff) | |
download | FreeBSD-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.c | 6 |
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 |