[DTrace-devel] [PATCH 3/6] agg: split clearing of one aggregation into its own function
Eugene Loh
eugene.loh at oracle.com
Fri Feb 24 00:50:13 UTC 2023
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
with a few minor comments below...
On 2/22/23 10:17, Kris Van Hees via DTrace-devel wrote:
> The new dt_aggregate_clear_one() function is designed to allow it to
> be passed a callback function to the aggregation walk functions. It
Is a word missing after "passed"? Like "passed in" or something?
> will be used in that manner in future patches.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_aggregate.c | 70 +++++++++++++++++++++-------------------
> libdtrace/dt_impl.h | 1 +
> 2 files changed, 37 insertions(+), 34 deletions(-)
>
> diff --git a/libdtrace/dt_aggregate.c b/libdtrace/dt_aggregate.c
> index 1f71d9d0..41fa0da1 100644
> --- a/libdtrace/dt_aggregate.c
> +++ b/libdtrace/dt_aggregate.c
> @@ -438,6 +438,40 @@ dt_agg_one_agg(dt_ident_t *aid, dtrace_recdesc_t *rec, char *dst,
> }
> }
>
> +int
> +dt_aggregate_clear_one(const dtrace_aggdata_t *agd, void *arg)
> +{
> + dtrace_hdl_t *dtp = arg;
> + dtrace_aggdesc_t *agg = agd->dtada_desc;
> + dtrace_recdesc_t *rec = &agg->dtagd_drecs[DT_AGGDATA_RECORD];
> + int64_t *vals = (int64_t *)
> + &agd->dtada_data[rec->dtrd_offset];
> + int i, max_cpus = dtp->dt_conf.max_cpuid + 1;
> +
> + switch (rec->dtrd_action) {
> + case DT_AGG_MIN:
> + *vals = INT64_MAX;
> + if (agd->dtada_percpu)
> + for (i = 0; i < max_cpus; i++)
> + *((uint64_t*)agd->dtada_percpu[i]) = INT64_MAX;
> + break;
> + case DT_AGG_MAX:
> + *vals = INT64_MIN;
> + if (agd->dtada_percpu)
> + for (i = 0; i < max_cpus; i++)
> + *((uint64_t*)agd->dtada_percpu[i]) = INT64_MIN;
> + break;
> + default:
> + memset(vals, 0, rec->dtrd_size);
> + if (agd->dtada_percpu)
> + for (i = 0; i < max_cpus; i++)
> + memset(agd->dtada_percpu[i], 0, rec->dtrd_size);
> + break;
> + }
> +
> + return 0;
dt_aggregate_clear_one() should return DTRACE_AGGWALK_NEXT rather than
0, even though they're the same thing.
> +}
> +
> static int
> dt_aggregate_snap_one(dtrace_hdl_t *dtp, int aggid, int cpu, const char *key,
> const char *data)
> @@ -1695,41 +1729,9 @@ dtrace_aggregate_clear(dtrace_hdl_t *dtp)
> dt_aggregate_t *agp = &dtp->dt_aggregate;
> dt_ahash_t *hash = &agp->dtat_hash;
> dt_ahashent_t *h;
> - int i, max_cpus = dtp->dt_conf.max_cpuid + 1;
>
> - for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
> - dtrace_aggdesc_t *agg;
> - dtrace_aggdata_t *agd;
> - dtrace_recdesc_t *rec;
> - int64_t *vals;
> -
> - agg = h->dtahe_data.dtada_desc;
> - agd = &h->dtahe_data;
> - rec = &agg->dtagd_drecs[DT_AGGDATA_RECORD];
> - vals = (int64_t *)&agd->dtada_data[rec->dtrd_offset];
> -
> - switch (rec->dtrd_action) {
> - case DT_AGG_MIN:
> - *vals = INT64_MAX;
> - if (agd->dtada_percpu)
> - for (i = 0; i < max_cpus; i++)
> - *((uint64_t*)agd->dtada_percpu[i]) = INT64_MAX;
> - break;
> - case DT_AGG_MAX:
> - *vals = INT64_MIN;
> - if (agd->dtada_percpu)
> - for (i = 0; i < max_cpus; i++)
> - *((uint64_t*)agd->dtada_percpu[i]) = INT64_MIN;
> - break;
> - default:
> - memset(vals, 0, rec->dtrd_size);
> - if (agd->dtada_percpu)
> - for (i = 0; i < max_cpus; i++)
> - memset(agd->dtada_percpu[i], 0, rec->dtrd_size);
> - break;
> - }
> -
> - }
> + for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall)
> + dt_aggregate_clear_one(&h->dtahe_data, dtp);
Should that for loop be replaced with:
dtrace_aggregate_walk(dtp, dt_aggregate_clear_one, dtp)?
You will use such a construct in a future patch anyhow.
> }
>
> void
> diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
> index 32b0c923..5d09c6e0 100644
> --- a/libdtrace/dt_impl.h
> +++ b/libdtrace/dt_impl.h
> @@ -756,6 +756,7 @@ extern dtrace_difo_t *dt_difo_copy(dtrace_hdl_t *dtp, const dtrace_difo_t *odp);
> extern int dt_aggregate_go(dtrace_hdl_t *);
> extern int dt_aggregate_init(dtrace_hdl_t *);
> extern void dt_aggregate_destroy(dtrace_hdl_t *);
> +extern int dt_aggregate_clear_one(const dtrace_aggdata_t *, void *);
>
> extern int dt_consume_init(dtrace_hdl_t *);
> extern void dt_consume_fini(dtrace_hdl_t *);
More information about the DTrace-devel
mailing list