svn commit: r212494 - in head/sys/cddl/contrib/opensolaris/uts: common/dtrace intel/dtrace

Rui Paulo rpaulo at FreeBSD.org
Sun Sep 12 14:12:17 UTC 2010


Author: rpaulo
Date: Sun Sep 12 14:12:16 2010
New Revision: 212494
URL: http://svn.freebsd.org/changeset/base/212494

Log:
  Revamp locking a bit. This fixes three problems:
  * processes now can't go away while we are inserting probes (fixes a panic)
  * if a trap happens, we won't be holding the process lock (fixes a hang)
  * fix a LOR between the process lock and the fasttrap bucket list lock
  
  Thanks to kib for pointing some problems.
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
  head/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c	Sun Sep 12 14:04:54 2010	(r212493)
+++ head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c	Sun Sep 12 14:12:16 2010	(r212494)
@@ -460,11 +460,13 @@ fasttrap_fork(proc_t *p, proc_t *cp)
 		/*
 		 * dtrace_helpers_duplicate() allocates memory.
 		 */
+		_PHOLD(cp);
 		PROC_UNLOCK(p);
 		PROC_UNLOCK(cp);
 		dtrace_helpers_duplicate(p, cp);
 		PROC_LOCK(cp);
 		PROC_LOCK(p);
+		_PRELE(cp);
 	}
 	/*
 	 * This check is purposely here instead of in kern_fork.c because,
@@ -494,6 +496,8 @@ fasttrap_fork(proc_t *p, proc_t *cp)
 	mtx_lock_spin(&cp->p_slock);
 	sprlock_proc(cp);
 	mtx_unlock_spin(&cp->p_slock);
+#else
+	_PHOLD(cp);
 #endif
 
 	/*
@@ -527,6 +531,8 @@ fasttrap_fork(proc_t *p, proc_t *cp)
 #if defined(sun)
 	mutex_enter(&cp->p_lock);
 	sprunlock(cp);
+#else
+	_PRELE(cp);
 #endif
 }
 
@@ -542,6 +548,7 @@ fasttrap_exec_exit(proc_t *p)
 	ASSERT(p == curproc);
 #endif
 	PROC_LOCK_ASSERT(p, MA_OWNED);
+	_PHOLD(p);
 	PROC_UNLOCK(p);
 
 	/*
@@ -554,6 +561,7 @@ fasttrap_exec_exit(proc_t *p)
 		dtrace_helpers_destroy(p);
 #endif
 	PROC_LOCK(p);
+	_PRELE(p);
 }
 
 
@@ -591,9 +599,7 @@ fasttrap_tracepoint_enable(proc_t *p, fa
 	 * Before we make any modifications, make sure we've imposed a barrier
 	 * on the generation in which this probe was last modified.
 	 */
-	PROC_UNLOCK(p);
 	fasttrap_mod_barrier(probe->ftp_gen);
-	PROC_LOCK(p);
 
 	bucket = &fasttrap_tpoints.fth_table[FASTTRAP_TPOINTS_INDEX(pid, pc)];
 
@@ -695,8 +701,6 @@ again:
 		 */
 #if defined(sun)
 		ASSERT(p->p_proc_flag & P_PR_LOCK);
-#else
-		PROC_LOCK_ASSERT(p, MA_OWNED);
 #endif
 		p->p_dtrace_count++;
 
@@ -889,8 +893,6 @@ fasttrap_tracepoint_disable(proc_t *p, f
 		 */
 #if defined(sun)
 		ASSERT(p->p_proc_flag & P_PR_LOCK);
-#else
-		PROC_LOCK_ASSERT(p, MA_OWNED);
 #endif
 		p->p_dtrace_count--;
 	}
@@ -1044,9 +1046,14 @@ fasttrap_pid_enable(void *arg, dtrace_id
 	 * the chance to execute the trap instruction we're about to place
 	 * in their process's text.
 	 */
+#ifdef __FreeBSD__
+	/*
+	 * pfind() returns a locked process.
+	 */
+	_PHOLD(p);
 	PROC_UNLOCK(p);
+#endif
 	fasttrap_enable_callbacks();
-	PROC_LOCK(p);
 
 	/*
 	 * Enable all the tracepoints and add this probe's id to each
@@ -1077,7 +1084,7 @@ fasttrap_pid_enable(void *arg, dtrace_id
 			mutex_enter(&p->p_lock);
 			sprunlock(p);
 #else
-			PROC_UNLOCK(p);
+			PRELE(p);
 #endif
 
 			/*
@@ -1092,7 +1099,7 @@ fasttrap_pid_enable(void *arg, dtrace_id
 	mutex_enter(&p->p_lock);
 	sprunlock(p);
 #else
-	PROC_UNLOCK(p);
+	PRELE(p);
 #endif
 
 	probe->ftp_enabled = 1;
@@ -1121,6 +1128,10 @@ fasttrap_pid_disable(void *arg, dtrace_i
 		mutex_exit(&provider->ftp_mtx);
 		return;
 	}
+#ifdef __FreeBSD__
+	_PHOLD(p);
+	PROC_UNLOCK(p);
+#endif
 
 	/*
 	 * Disable all the associated tracepoints (for fully enabled probes).
@@ -1152,13 +1163,13 @@ fasttrap_pid_disable(void *arg, dtrace_i
 			whack = provider->ftp_marked = 1;
 		mutex_exit(&provider->ftp_mtx);
 	}
-#if !defined(sun)
-	PROC_UNLOCK(p);
-#endif
 
 	if (whack)
 		fasttrap_pid_cleanup();
 
+#ifdef __FreeBSD__
+	PRELE(p);
+#endif
 	if (!probe->ftp_enabled)
 		return;
 

Modified: head/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c	Sun Sep 12 14:04:54 2010	(r212493)
+++ head/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c	Sun Sep 12 14:12:16 2010	(r212494)
@@ -74,15 +74,12 @@ proc_ops(int op, proc_t *p, void *kaddr,
 	uio.uio_segflg = UIO_SYSSPACE;
 	uio.uio_td = curthread;
 	uio.uio_rw = op;
-	_PHOLD(p);
-	PROC_UNLOCK(p);
+	PHOLD(p);
 	if (proc_rwmem(p, &uio) < 0) {
-		PROC_LOCK(p);
-		_PRELE(p);
+		PRELE(p);
 		return (-1);
 	}
-	PROC_LOCK(p);
-	_PRELE(p);
+	PRELE(p);
 
 	return (0);
 }


More information about the svn-src-all mailing list