[DTrace-devel] [PATCH v2 39/61] Move normalization value to aggregation descriptions
eugene.loh at oracle.com
eugene.loh at oracle.com
Mon Aug 8 21:05:49 UTC 2022
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>
---
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
More information about the DTrace-devel
mailing list