From owner-p4-projects@FreeBSD.ORG Fri Jun 9 05:51:08 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E6DAE16A46F; Fri, 9 Jun 2006 05:51:07 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 91CE416A41B for ; Fri, 9 Jun 2006 05:51:07 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 45B4543D70 for ; Fri, 9 Jun 2006 05:51:07 +0000 (GMT) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k595n77q031691 for ; Fri, 9 Jun 2006 05:49:07 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k595n7T4031688 for perforce@freebsd.org; Fri, 9 Jun 2006 05:49:07 GMT (envelope-from jb@freebsd.org) Date: Fri, 9 Jun 2006 05:49:07 GMT Message-Id: <200606090549.k595n7T4031688@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 98849 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Jun 2006 05:51:08 -0000 http://perforce.freebsd.org/chv.cgi?CH=98849 Change 98849 by jb@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); } }