PERFORCE change 98849 for review

John Birrell jb at FreeBSD.org
Fri Jun 9 05:51:08 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=98849

Change 98849 by jb at jb_freebsd2 on 2006/06/09 05:48:37

	Changes to match the last integration of OpenSolaris.

Affected files ...

.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace.c#27 edit
.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_helper.c#4 edit
.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_helpprov.c#2 edit

Differences ...

==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace.c#27 (text+ko) ====

@@ -537,11 +537,11 @@
 static void dtrace_hash_destroy(dtrace_hash_t *);
 static void dtrace_hash_remove(dtrace_hash_t *, dtrace_probe_t *);
 static void dtrace_hash_resize(dtrace_hash_t *);
-static void dtrace_helper_destroy(dtrace_helper_action_t *, dtrace_vstate_t *);
+static void dtrace_helper_action_destroy(dtrace_helper_action_t *, dtrace_vstate_t *);
 static void dtrace_helper_provide(dof_helper_t *, pid_t);
 static void dtrace_helper_provide_one(dof_helper_t *, dof_sec_t *, pid_t);
-static void dtrace_helper_remove(dof_helper_t *, pid_t);
-static void dtrace_helper_remove_one(dof_helper_t *, dof_sec_t *, pid_t);
+static void dtrace_helper_provider_remove(dof_helper_t *, pid_t);
+static void dtrace_helper_provider_remove_one(dof_helper_t *, dof_sec_t *, pid_t);
 static void dtrace_helper_trace(dtrace_helper_action_t *r, dtrace_mstate_t *, dtrace_vstate_t *, int);
 static void dtrace_helpers_destroy(void);
 static void dtrace_helpers_duplicate(proc_t *, proc_t *);

==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_helper.c#4 (text+ko) ====

@@ -98,8 +98,8 @@
 	 * Also, note the calls to dtrace_dif_emulate() may allocate scratch
 	 * from machine state; this is okay, too.
 	 */
-	for (; helper != NULL; helper = helper->dthp_next) {
-		if ((pred = helper->dthp_predicate) != NULL) {
+	for (; helper != NULL; helper = helper->dtha_next) {
+		if ((pred = helper->dtha_predicate) != NULL) {
 			if (trace)
 				dtrace_helper_trace(helper, mstate, vstate, 0);
 
@@ -110,12 +110,12 @@
 				goto err;
 		}
 
-		for (i = 0; i < helper->dthp_nactions; i++) {
+		for (i = 0; i < helper->dtha_nactions; i++) {
 			if (trace)
 				dtrace_helper_trace(helper,
 				    mstate, vstate, i + 1);
 
-			rval = dtrace_dif_emulate(helper->dthp_actions[i],
+			rval = dtrace_dif_emulate(helper->dtha_actions[i],
 			    mstate, vstate, state);
 
 			if (*flags & CPU_DTRACE_FAULT)
@@ -155,27 +155,28 @@
 }
 
 static void
-dtrace_helper_destroy(dtrace_helper_action_t *helper, dtrace_vstate_t *vstate)
+dtrace_helper_action_destroy(dtrace_helper_action_t *helper, dtrace_vstate_t *vstate)
 {
 	int i;
 
-	if (helper->dthp_predicate != NULL)
-		dtrace_difo_release(helper->dthp_predicate, vstate);
+	if (helper->dtha_predicate != NULL)
+		dtrace_difo_release(helper->dtha_predicate, vstate);
 
-	for (i = 0; i < helper->dthp_nactions; i++) {
-		ASSERT(helper->dthp_actions[i] != NULL);
-		dtrace_difo_release(helper->dthp_actions[i], vstate);
+	for (i = 0; i < helper->dtha_nactions; i++) {
+		ASSERT(helper->dtha_actions[i] != NULL);
+		dtrace_difo_release(helper->dtha_actions[i], vstate);
 	}
 
-	kmem_free(helper->dthp_actions,
-	    helper->dthp_nactions * sizeof (dtrace_difo_t *));
+	kmem_free(helper->dtha_actions,
+	    helper->dtha_nactions * sizeof (dtrace_difo_t *));
 	kmem_free(helper, sizeof (dtrace_helper_action_t));
 }
 
 static int
 dtrace_helper_destroygen(int gen)
 {
-	dtrace_helpers_t *help = curproc->p_dtrace_helpers;
+	proc_t *p = curproc;
+	dtrace_helpers_t *help = p->p_dtrace_helpers;
 	dtrace_vstate_t *vstate;
 	int i;
 
@@ -190,22 +191,68 @@
 		dtrace_helper_action_t *last = NULL, *h, *next;
 
 		for (h = help->dthps_actions[i]; h != NULL; h = next) {
-			next = h->dthp_next;
+			next = h->dtha_next;
 
-			if (h->dthp_generation == gen) {
+			if (h->dtha_generation == gen) {
 				if (last != NULL) {
-					last->dthp_next = next;
+					last->dtha_next = next;
 				} else {
 					help->dthps_actions[i] = next;
 				}
 
-				dtrace_helper_destroy(h, vstate);
+				dtrace_helper_action_destroy(h, vstate);
 			} else {
 				last = h;
 			}
 		}
 	}
 
+	/*
+	 * Interate until we've cleared out all helper providers with the
+	 * given generation number.
+	 */
+	for (;;) {
+		dtrace_helper_provider_t *prov = NULL;
+
+		/*
+		 * Look for a helper provider with the right generation.
+		 */
+		for (i = 0; i < help->dthps_nprovs; i++) {
+			prov = help->dthps_provs[i];
+
+			if (prov->dthp_generation == gen)
+				break;
+		}
+
+		/*
+		 * If there were no matches, we're done.
+		 */
+		if (i == help->dthps_nprovs)
+			break;
+
+		/*
+		 * Move the last helper provider into this slot.
+		 */
+		help->dthps_nprovs--;
+		help->dthps_provs[i] = help->dthps_provs[help->dthps_nprovs];
+		help->dthps_provs[help->dthps_nprovs] = NULL;
+
+		mutex_exit(&dtrace_lock);
+
+		/*
+		 * If we have a meta provider, remove this helper provider.
+		 */
+		mutex_enter(&dtrace_meta_lock);
+		if (dtrace_meta_pid != NULL) {
+			ASSERT(dtrace_deferred_pid == NULL);
+			dtrace_helper_provider_remove(&prov->dthp_prov,
+			    p->p_pid);
+		}
+		mutex_exit(&dtrace_meta_lock);
+
+		mutex_enter(&dtrace_lock);
+	}
+
 	return (0);
 }
 
@@ -215,11 +262,11 @@
 	int err = 0, i;
 	dtrace_difo_t *dp;
 
-	if ((dp = helper->dthp_predicate) != NULL)
+	if ((dp = helper->dtha_predicate) != NULL)
 		err += dtrace_difo_validate_helper(dp);
 
-	for (i = 0; i < helper->dthp_nactions; i++)
-		err += dtrace_difo_validate_helper(helper->dthp_actions[i]);
+	for (i = 0; i < helper->dtha_nactions; i++)
+		err += dtrace_difo_validate_helper(helper->dtha_actions[i]);
 
 	return (err == 0);
 }
@@ -241,9 +288,9 @@
 	last = help->dthps_actions[which];
 	vstate = &help->dthps_vstate;
 
-	for (count = 0; last != NULL; last = last->dthp_next) {
+	for (count = 0; last != NULL; last = last->dtha_next) {
 		count++;
-		if (last->dthp_next == NULL)
+		if (last->dtha_next == NULL)
 			break;
 	}
 
@@ -255,12 +302,12 @@
 		return (ENOSPC);
 
 	helper = kmem_zalloc(sizeof (dtrace_helper_action_t), KM_SLEEP);
-	helper->dthp_generation = help->dthps_generation;
+	helper->dtha_generation = help->dthps_generation;
 
 	if ((pred = ep->dted_pred.dtpdd_predicate) != NULL) {
 		ASSERT(pred->dtp_difo != NULL);
 		dtrace_difo_hold(pred->dtp_difo);
-		helper->dthp_predicate = pred->dtp_difo;
+		helper->dtha_predicate = pred->dtp_difo;
 	}
 
 	for (act = ep->dted_action; act != NULL; act = act->dtad_next) {
@@ -273,12 +320,12 @@
 		nactions++;
 	}
 
-	helper->dthp_actions = kmem_zalloc(sizeof (dtrace_difo_t *) *
-	    (helper->dthp_nactions = nactions), KM_SLEEP);
+	helper->dtha_actions = kmem_zalloc(sizeof (dtrace_difo_t *) *
+	    (helper->dtha_nactions = nactions), KM_SLEEP);
 
 	for (act = ep->dted_action, i = 0; act != NULL; act = act->dtad_next) {
 		dtrace_difo_hold(act->dtad_difo);
-		helper->dthp_actions[i++] = act->dtad_difo;
+		helper->dtha_actions[i++] = act->dtad_difo;
 	}
 
 	if (!dtrace_helper_validate(helper))
@@ -287,7 +334,7 @@
 	if (last == NULL) {
 		help->dthps_actions[which] = helper;
 	} else {
-		last->dthp_next = helper;
+		last->dtha_next = helper;
 	}
 
 	if (vstate->dtvs_nlocals > dtrace_helptrace_nlocals) {
@@ -297,7 +344,7 @@
 
 	return (0);
 err:
-	dtrace_helper_destroy(helper, vstate);
+	dtrace_helper_action_destroy(helper, vstate);
 	return (EINVAL);
 }
 
@@ -361,11 +408,13 @@
 }
 
 static int
-dtrace_helper_provider_add(dof_helper_t *dofhp)
+dtrace_helper_provider_add(dof_helper_t *dofhp, int gen)
 {
 	dtrace_helpers_t *help;
 	dtrace_helper_provider_t *hprov, **tmp_provs;
-	uint_t tmp_nprovs, i;
+	uint_t tmp_maxprovs, i;
+
+	ASSERT(MUTEX_HELD(&dtrace_lock));
 
 	help = curproc->p_dtrace_helpers;
 	ASSERT(help != NULL);
@@ -389,26 +438,43 @@
 	hprov = kmem_zalloc(sizeof (dtrace_helper_provider_t), KM_SLEEP);
 	hprov->dthp_prov = *dofhp;
 	hprov->dthp_ref = 1;
+	hprov->dthp_generation = gen;
+
+	/*
+	 * Allocate a bigger table for helper providers if it's already full.
+	 */
+	if (help->dthps_maxprovs == help->dthps_nprovs) {
+		tmp_maxprovs = help->dthps_maxprovs;
+		tmp_provs = help->dthps_provs;
+
+		if (help->dthps_maxprovs == 0)
+			help->dthps_maxprovs = 2;
+		else
+			help->dthps_maxprovs *= 2;
+		if (help->dthps_maxprovs > dtrace_helper_providers_max)
+			help->dthps_maxprovs = dtrace_helper_providers_max;
 
-	tmp_nprovs = help->dthps_nprovs;
-	tmp_provs = help->dthps_provs;
-	help->dthps_nprovs++;
-	help->dthps_provs = kmem_zalloc(help->dthps_nprovs *
-	    sizeof (dtrace_helper_provider_t *), KM_SLEEP);
+		ASSERT(tmp_maxprovs < help->dthps_maxprovs);
+
+		help->dthps_provs = kmem_zalloc(help->dthps_maxprovs *
+		    sizeof (dtrace_helper_provider_t *), KM_SLEEP);
 
-	help->dthps_provs[tmp_nprovs] = hprov;
-	if (tmp_provs != NULL) {
-		bcopy(tmp_provs, help->dthps_provs, tmp_nprovs *
-		    sizeof (dtrace_helper_provider_t *));
-		kmem_free(tmp_provs, tmp_nprovs *
-		    sizeof (dtrace_helper_provider_t *));
+		if (tmp_provs != NULL) {
+			bcopy(tmp_provs, help->dthps_provs, tmp_maxprovs *
+			    sizeof (dtrace_helper_provider_t *));
+			kmem_free(tmp_provs, tmp_maxprovs *
+			    sizeof (dtrace_helper_provider_t *));
+		}
 	}
 
+	help->dthps_provs[help->dthps_nprovs] = hprov;
+	help->dthps_nprovs++;
+
 	return (0);
 }
 
 static void
-dtrace_helper_provider_remove(dtrace_helper_provider_t *hprov)
+dtrace_helper_provider_destroy(dtrace_helper_provider_t *hprov)
 {
 	mutex_enter(&dtrace_lock);
 
@@ -710,7 +776,7 @@
 
 	if (dhp != NULL && nprovs > 0) {
 		dhp->dofhp_dof = (uint64_t)(uintptr_t)dof;
-		if (dtrace_helper_provider_add(dhp) == 0) {
+		if (dtrace_helper_provider_add(dhp, gen) == 0) {
 			mutex_exit(&dtrace_lock);
 			dtrace_helper_provider_register(curproc, help, dhp);
 			mutex_enter(&dtrace_lock);
@@ -772,8 +838,8 @@
 		dtrace_helper_action_t *h, *next;
 
 		for (h = help->dthps_actions[i]; h != NULL; h = next) {
-			next = h->dthp_next;
-			dtrace_helper_destroy(h, vstate);
+			next = h->dtha_next;
+			dtrace_helper_action_destroy(h, vstate);
 			h = next;
 		}
 	}
@@ -783,13 +849,13 @@
 	/*
 	 * Destroy the helper providers.
 	 */
-	if (help->dthps_nprovs > 0) {
+	if (help->dthps_maxprovs > 0) {
 		mutex_enter(&dtrace_meta_lock);
 		if (dtrace_meta_pid != NULL) {
 			ASSERT(dtrace_deferred_pid == NULL);
 
 			for (i = 0; i < help->dthps_nprovs; i++) {
-				dtrace_helper_remove(
+				dtrace_helper_provider_remove(
 				    &help->dthps_provs[i]->dthp_prov, p->p_pid);
 			}
 		} else {
@@ -816,11 +882,11 @@
 
 		mutex_exit(&dtrace_meta_lock);
 
-		for (i = 0; i < help->dthps_nprovs; i++) {
-			dtrace_helper_provider_remove(help->dthps_provs[i]);
+		for (i = 0; i < help->dthps_maxprovs; i++) {
+			dtrace_helper_provider_destroy(help->dthps_provs[i]);
 		}
 
-		kmem_free(help->dthps_provs, help->dthps_nprovs *
+		kmem_free(help->dthps_provs, help->dthps_maxprovs *
 		    sizeof (dtrace_helper_provider_t *));
 	}
 
@@ -862,30 +928,30 @@
 		if ((helper = help->dthps_actions[i]) == NULL)
 			continue;
 
-		for (last = NULL; helper != NULL; helper = helper->dthp_next) {
+		for (last = NULL; helper != NULL; helper = helper->dtha_next) {
 			new = kmem_zalloc(sizeof (dtrace_helper_action_t),
 			    KM_SLEEP);
-			new->dthp_generation = helper->dthp_generation;
+			new->dtha_generation = helper->dtha_generation;
 
-			if ((dp = helper->dthp_predicate) != NULL) {
+			if ((dp = helper->dtha_predicate) != NULL) {
 				dp = dtrace_difo_duplicate(dp, vstate);
-				new->dthp_predicate = dp;
+				new->dtha_predicate = dp;
 			}
 
-			new->dthp_nactions = helper->dthp_nactions;
-			sz = sizeof (dtrace_difo_t *) * new->dthp_nactions;
-			new->dthp_actions = kmem_alloc(sz, KM_SLEEP);
+			new->dtha_nactions = helper->dtha_nactions;
+			sz = sizeof (dtrace_difo_t *) * new->dtha_nactions;
+			new->dtha_actions = kmem_alloc(sz, KM_SLEEP);
 
-			for (j = 0; j < new->dthp_nactions; j++) {
-				dtrace_difo_t *dp = helper->dthp_actions[j];
+			for (j = 0; j < new->dtha_nactions; j++) {
+				dtrace_difo_t *dp = helper->dtha_actions[j];
 
 				ASSERT(dp != NULL);
 				dp = dtrace_difo_duplicate(dp, vstate);
-				new->dthp_actions[j] = dp;
+				new->dtha_actions[j] = dp;
 			}
 
 			if (last != NULL) {
-				last->dthp_next = new;
+				last->dtha_next = new;
 			} else {
 				newhelp->dthps_actions[i] = new;
 			}
@@ -900,6 +966,7 @@
 	 */
 	if (help->dthps_nprovs > 0) {
 		newhelp->dthps_nprovs = help->dthps_nprovs;
+		newhelp->dthps_maxprovs = help->dthps_nprovs;
 		newhelp->dthps_provs = kmem_alloc(newhelp->dthps_nprovs *
 		    sizeof (dtrace_helper_provider_t *), KM_SLEEP);
 		for (i = 0; i < newhelp->dthps_nprovs; i++) {

==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_helpprov.c#2 (text+ko) ====

@@ -142,7 +142,7 @@
 }
 
 static void
-dtrace_helper_remove_one(dof_helper_t *dhp, dof_sec_t *sec, pid_t pid)
+dtrace_helper_provider_remove_one(dof_helper_t *dhp, dof_sec_t *sec, pid_t pid)
 {
 	uintptr_t daddr = (uintptr_t)dhp->dofhp_dof;
 	dof_hdr_t *dof = (dof_hdr_t *)daddr;
@@ -170,7 +170,7 @@
 }
 
 static void
-dtrace_helper_remove(dof_helper_t *dhp, pid_t pid)
+dtrace_helper_provider_remove(dof_helper_t *dhp, pid_t pid)
 {
 	uintptr_t daddr = (uintptr_t)dhp->dofhp_dof;
 	dof_hdr_t *dof = (dof_hdr_t *)daddr;
@@ -185,6 +185,6 @@
 		if (sec->dofs_type != DOF_SECT_PROVIDER)
 			continue;
 
-		dtrace_helper_remove_one(dhp, sec, pid);
+		dtrace_helper_provider_remove_one(dhp, sec, pid);
 	}
 }


More information about the p4-projects mailing list