Mercurial > illumos > illumos-gate
changeset 10720:c45747dcac4f
6871629 3-way deadlock with mod_lock, dtrace_lock and sprlock
author | Ethindra Ramamurthy <Ethindra.Ramamurthy@Sun.COM> |
---|---|
date | Mon, 05 Oct 2009 17:27:50 -0700 |
parents | 203f5727fba9 |
children | 2a4f0c5ca772 |
files | usr/src/uts/common/os/fork.c |
diffstat | 1 files changed, 11 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/os/fork.c Mon Oct 05 12:36:45 2009 -0700 +++ b/usr/src/uts/common/os/fork.c Mon Oct 05 17:27:50 2009 -0700 @@ -307,10 +307,6 @@ goto forkerr; } - /* Duplicate parent's shared memory */ - if (p->p_segacct) - shmfork(p, cp); - /* * Remove all DTrace tracepoints from the child process. We * need to do this _before_ duplicating USDT providers since @@ -319,26 +315,26 @@ if (p->p_dtrace_count > 0) dtrace_fasttrap_fork(p, cp); + mutex_enter(&p->p_lock); + sprunlock(p); + + /* Duplicate parent's shared memory */ + if (p->p_segacct) + shmfork(p, cp); + /* * Duplicate any helper actions and providers. The SFORKING * we set above informs the code to enable USDT probes that * sprlock() may fail because the child is being forked. */ if (p->p_dtrace_helpers != NULL) { - mutex_enter(&p->p_lock); - sprunlock(p); - ASSERT(dtrace_helpers_fork != NULL); (*dtrace_helpers_fork)(p, cp); + } - mutex_enter(&p->p_lock); - p->p_flag &= ~SFORKING; - mutex_exit(&p->p_lock); - } else { - mutex_enter(&p->p_lock); - p->p_flag &= ~SFORKING; - sprunlock(p); - } + mutex_enter(&p->p_lock); + p->p_flag &= ~SFORKING; + mutex_exit(&p->p_lock); } /*