[DTrace-devel] [PATCH v2 39/61] Move normalization value to aggregation descriptions

Kris Van Hees kris.van.hees at oracle.com
Tue Aug 9 18:19:33 UTC 2022


On Mon, Aug 08, 2022 at 05:05:49PM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> This change is being made in anticipation of adding support for
> aggregation keys, which create the possibility of an aggregation
> appearing many times (with different keys) in dt_aggregate.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

... queued for dev

> ---
>  include/dtrace/metadesc.h |  1 +
>  libdtrace/dt_aggregate.c  | 10 ---------
>  libdtrace/dt_consume.c    | 46 +++++++++------------------------------
>  libdtrace/dt_map.c        |  1 +
>  libdtrace/dt_printf.c     |  2 +-
>  libdtrace/dtrace.h        |  1 -
>  6 files changed, 13 insertions(+), 48 deletions(-)
> 
> diff --git a/include/dtrace/metadesc.h b/include/dtrace/metadesc.h
> index 0f12c4f3..97c11b7a 100644
> --- a/include/dtrace/metadesc.h
> +++ b/include/dtrace/metadesc.h
> @@ -56,6 +56,7 @@ typedef struct dtrace_aggdesc {
>  	int dtagd_flags;			/* aggregation flags */
>  	dtrace_aggid_t dtagd_id;		/* aggregation ID */
>  	uint64_t dtagd_sig;			/* aggregation signature */
> +	uint64_t dtagd_normal;			/* aggregation normalization */
>  	uint32_t dtagd_size;			/* size in bytes */
>  	int dtagd_nrecs;			/* number of records */
>  	dtrace_recdesc_t *dtagd_recs;		/* record descriptions */
> diff --git a/libdtrace/dt_aggregate.c b/libdtrace/dt_aggregate.c
> index 4a675366..727b48c6 100644
> --- a/libdtrace/dt_aggregate.c
> +++ b/libdtrace/dt_aggregate.c
> @@ -513,7 +513,6 @@ dt_aggregate_snap_one(dt_idhash_t *dhp, dt_ident_t *aid, dt_snapstate_t *st)
>  	agd->dtada_size = realsz;
>  	agd->dtada_desc = agg;
>  	agd->dtada_hdl = st->dtp;
> -	agd->dtada_normal = 1;
>  
>  	h->dtahe_hval = hval;
>  	h->dtahe_size = realsz;
> @@ -1118,14 +1117,6 @@ dt_aggwalk_rval(dtrace_hdl_t *dtp, dt_ahashent_t *h, int rval)
>  	case DTRACE_AGGWALK_ABORT:
>  		return dt_set_errno(dtp, EDT_DIRABORT);
>  
> -	case DTRACE_AGGWALK_NORMALIZE:
> -		if (h->dtahe_data.dtada_normal == 0) {
> -			h->dtahe_data.dtada_normal = 1;
> -			return dt_set_errno(dtp, EDT_BADRVAL);
> -		}
> -
> -		return 0;
> -
>  	case DTRACE_AGGWALK_REMOVE: {
>  		dtrace_aggdata_t *aggdata = &h->dtahe_data;
>  		int i, max_cpus = dtp->dt_conf.max_cpuid + 1;
> @@ -1526,7 +1517,6 @@ dtrace_aggregate_walk_joined(dtrace_hdl_t *dtp, dtrace_aggid_t *aggvars,
>  				aggdata->dtada_size = agg->dtagd_size;
>  				aggdata->dtada_desc = agg;
>  				aggdata->dtada_hdl = dtp;
> -				aggdata->dtada_normal = 1;
>  				zaggdata[i].dtahe_hval = 0;
>  				zaggdata[i].dtahe_size = agg->dtagd_size;
>  				break;
> diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
> index dbfcf9de..27268760 100644
> --- a/libdtrace/dt_consume.c
> +++ b/libdtrace/dt_consume.c
> @@ -1455,28 +1455,6 @@ dt_print_pcap(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
>  	return 0;
>  }
>  
> -typedef struct dt_normal {
> -	dtrace_aggid_t	dtnd_id;
> -	uint64_t	dtnd_normal;
> -} dt_normal_t;
> -
> -static int
> -dt_normalize_agg(const dtrace_aggdata_t *aggdata, void *arg)
> -{
> -	dt_normal_t		*normal = arg;
> -	dtrace_aggdesc_t	*agg = aggdata->dtada_desc;
> -	dtrace_aggid_t		id = normal->dtnd_id;
> -
> -	if (agg->dtagd_nrecs == 0)
> -		return DTRACE_AGGWALK_NEXT;
> -
> -	if (agg->dtagd_varid != id)
> -		return DTRACE_AGGWALK_NEXT;
> -
> -	((dtrace_aggdata_t *)aggdata)->dtada_normal = normal->dtnd_normal;
> -	return DTRACE_AGGWALK_NORMALIZE;
> -}
> -
>  /*
>   * This function is also used to denormalize aggregations, because that is
>   * equivalent to normalizing them using normal = 1.
> @@ -1485,7 +1463,8 @@ static int
>  dt_normalize(dtrace_hdl_t *dtp, caddr_t base, dtrace_recdesc_t *rec)
>  {
>  	int		act = rec->dtrd_arg;
> -	dt_normal_t	normal;
> +	dtrace_aggid_t	id;
> +	uint64_t	normal;
>  	caddr_t		addr;
>  
>  	/*
> @@ -1497,7 +1476,7 @@ dt_normalize(dtrace_hdl_t *dtp, caddr_t base, dtrace_recdesc_t *rec)
>  	if (rec->dtrd_size != sizeof(dtrace_aggid_t))
>  		return dt_set_errno(dtp, EDT_BADNORMAL);
>  
> -	normal.dtnd_id = *((dtrace_aggid_t *)addr);
> +	id = *((dtrace_aggid_t *)addr);
>  
>  	if (act == DT_ACT_NORMALIZE) {
>  		rec++;
> @@ -1512,29 +1491,24 @@ dt_normalize(dtrace_hdl_t *dtp, caddr_t base, dtrace_recdesc_t *rec)
>  
>  		switch (rec->dtrd_size) {
>  		case sizeof(uint64_t):
> -			normal.dtnd_normal = *((uint64_t *)addr);
> +			normal = *((uint64_t *)addr);
>  			break;
>  		case sizeof(uint32_t):
> -			normal.dtnd_normal = *((uint32_t *)addr);
> +			normal = *((uint32_t *)addr);
>  			break;
>  		case sizeof(uint16_t):
> -			normal.dtnd_normal = *((uint16_t *)addr);
> +			normal = *((uint16_t *)addr);
>  			break;
>  		case sizeof(uint8_t):
> -			normal.dtnd_normal = *((uint8_t *)addr);
> +			normal = *((uint8_t *)addr);
>  			break;
>  		default:
>  			return dt_set_errno(dtp, EDT_BADNORMAL);
>  		}
>  	} else
> -		normal.dtnd_normal = 1;
> +		normal = 1;
>  
> -	/*
> -	 * Retrieve a snapshot of the aggregation data, and apply the normal
> -	 * to all aggregations that need it.
> -	 */
> -	dtrace_aggregate_snap(dtp);
> -	dtrace_aggregate_walk(dtp, dt_normalize_agg, &normal);
> +	dtp->dt_adesc[id]->dtagd_normal = normal;
>  
>  	return 0;
>  }
> @@ -1766,7 +1740,7 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
>  		size = agg->dtagd_size;
>  
>  		assert(DTRACEACT_ISAGG(rec->dtrd_action));
> -		normal = aggdata->dtada_normal;
> +		normal = aggdata->dtada_desc->dtagd_normal;
>  
>  		if (dt_print_datum(dtp, fp, rec, addr, size, normal,
>  				   agg->dtagd_sig) < 0)
> diff --git a/libdtrace/dt_map.c b/libdtrace/dt_map.c
> index ea635a16..96660fd0 100644
> --- a/libdtrace/dt_map.c
> +++ b/libdtrace/dt_map.c
> @@ -282,6 +282,7 @@ dt_aggid_add(dtrace_hdl_t *dtp, const dt_ident_t *aid)
>  	agg->dtagd_id = id;
>  	agg->dtagd_name = aid->di_name;
>  	agg->dtagd_sig = ((dt_idsig_t *)aid->di_data)->dis_auxinfo;
> +	agg->dtagd_normal = 1;
>  	agg->dtagd_varid = aid->di_id;
>  	agg->dtagd_size = (aid->di_size - sizeof(uint64_t)) / DT_AGG_NUM_COPIES;
>  	agg->dtagd_nrecs = agg->dtagd_size / sizeof(uint64_t);
> diff --git a/libdtrace/dt_printf.c b/libdtrace/dt_printf.c
> index f0c09178..e7171dcc 100644
> --- a/libdtrace/dt_printf.c
> +++ b/libdtrace/dt_printf.c
> @@ -1383,7 +1383,7 @@ dt_printf_format(dtrace_hdl_t *dtp, FILE *fp, const dt_pfargv_t *pfv,
>  			rec = &agg->dtagd_recs[aggrec];
>  			addr = aggdata->dtada_data;
>  			limit = addr + aggdata->dtada_size;
> -			normal = aggdata->dtada_normal;
> +			normal = agg->dtagd_normal;
>  			size = agg->dtagd_size;
>  			sig = agg->dtagd_sig;
>  			flags = DTRACE_BUFDATA_AGGVAL;
> diff --git a/libdtrace/dtrace.h b/libdtrace/dtrace.h
> index a05cc4a9..8a3daf6a 100644
> --- a/libdtrace/dtrace.h
> +++ b/libdtrace/dtrace.h
> @@ -364,7 +364,6 @@ struct dtrace_aggdata {
>  	dtrace_hdl_t *dtada_hdl;		/* handle to DTrace library */
>  	dtrace_aggdesc_t *dtada_desc;		/* aggregation description */
>  	caddr_t dtada_data;			/* pointer to raw data */
> -	uint64_t dtada_normal;			/* the normal -- 1 for denorm */
>  	size_t dtada_size;			/* total size of the data */
>  	caddr_t *dtada_percpu;			/* per CPU data, if avail */
>  };
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list