Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Feb 2013 17:55:17 +0000 (UTC)
From:      "Justin T. Gibbs" <gibbs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r247049 - head/sys/cddl/contrib/opensolaris/uts/common/dtrace
Message-ID:  <201302201755.r1KHtHA6068794@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gibbs
Date: Wed Feb 20 17:55:17 2013
New Revision: 247049
URL: http://svnweb.freebsd.org/changeset/base/247049

Log:
  Avoid panic when tearing down the DTrace pid provider for a
  process that has crashed.
  
  sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c:
  	In fasttrap_pid_disable(), we cannot PHOLD the proc
  	structure for a process that no longer exists, but
  	we still have other, fasttrap specific, state that
  	must be cleaned up for probes that existed in the
  	dead process.  Instead of returning early if the
  	process related to our probes isn't found,
  	conditionalize the locking and carry on with a NULL
  	proc pointer.  The rest of the fasttrap code already
  	understands that a NULL proc is possible and does
  	the right things in this case.
  
  Sponsored by:	Spectra Logic Corporation
  Reviewed by:	rpaulo, gnn
  MFC after:	1 week

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

Modified: head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c	Wed Feb 20 17:46:38 2013	(r247048)
+++ head/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c	Wed Feb 20 17:55:17 2013	(r247049)
@@ -1124,14 +1124,12 @@ fasttrap_pid_disable(void *arg, dtrace_i
 	 * provider lock as a point of mutual exclusion to prevent other
 	 * DTrace consumers from disabling this probe.
 	 */
-	if ((p = pfind(probe->ftp_pid)) == NULL) {
-		mutex_exit(&provider->ftp_mtx);
-		return;
-	}
+	if ((p = pfind(probe->ftp_pid)) != NULL) {
 #ifdef __FreeBSD__
-	_PHOLD(p);
-	PROC_UNLOCK(p);
+		_PHOLD(p);
+		PROC_UNLOCK(p);
 #endif
+	}
 
 	/*
 	 * Disable all the associated tracepoints (for fully enabled probes).
@@ -1168,7 +1166,8 @@ fasttrap_pid_disable(void *arg, dtrace_i
 		fasttrap_pid_cleanup();
 
 #ifdef __FreeBSD__
-	PRELE(p);
+	if (p != NULL)
+		PRELE(p);
 #endif
 	if (!probe->ftp_enabled)
 		return;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302201755.r1KHtHA6068794>