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