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);
 	}
 
 	/*