[DTrace-devel] [PATCH 1/6] bpf: add 'agggen' BPF map
Kris Van Hees
kris.van.hees at oracle.com
Wed Feb 22 15:17:09 UTC 2023
The 'agggen' BPF map associates a generation counter with an aggregation
ID. It will be used to determine whether the aggregation data in the
'aggs' map for aggregations associated with a given aggregation ID is
valid or stale.
The initial generation counter for each aggregation is 1 (because 0 is
used to indicate a no-data condition).
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_bpf.c | 38 +++++++++++++++++++++++------
libdtrace/dt_dlibs.c | 1 +
libdtrace/dt_impl.h | 1 +
test/stress/buffering/err.resize2.r | 2 +-
4 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index f0f46c5c..6587ea95 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -477,18 +477,23 @@ gmap_create_state(dtrace_hdl_t *dtp)
}
/*
- * Create the 'aggs' BPF map.
+ * Create the 'aggs' BPF map (and its companion 'agggen' BPF map).
*
- * Aggregation data buffer map, associated with each CPU. The map is
- * implemented as a global array-of-maps indexed by CPU id. The associated
- * value is a map with a singleton element (key 0).
+ * - aggs: Aggregation data buffer map, associated with each CPU. The map
+ * is implemented as a global array-of-maps indexed by CPU id.
+ * The associated value is a map with a singleton element (key 0).
+ * - agggen: Aggregation generation counters. The map associates a
+ * generation counter with each aggregation ID. The counter is
+ * used to determine whether the aggregation data is valid. The
+ * initial value is 1.
*/
static int
gmap_create_aggs(dtrace_hdl_t *dtp)
{
- size_t ncpus = dtp->dt_conf.max_cpuid + 1;
- size_t nelems = 0;
- int i;
+ size_t ncpus = dtp->dt_conf.max_cpuid + 1;
+ size_t nelems = 0;
+ uint32_t aggc = dt_idhash_peekid(dtp->dt_aggs);
+ uint32_t i;
/* Only create the map if it is used. */
if (dtp->dt_maxaggdsize == 0)
@@ -508,6 +513,8 @@ gmap_create_aggs(dtrace_hdl_t *dtp)
BPF_MAP_TYPE_HASH,
dtp->dt_maxtuplesize,
dtp->dt_maxaggdsize, nelems);
+ if (dtp->dt_aggmap_fd == -1)
+ return -1;
for (i = 0; i < dtp->dt_conf.num_online_cpus; i++) {
int cpu = dtp->dt_conf.cpus[i].cpu_id;
@@ -524,8 +531,23 @@ gmap_create_aggs(dtrace_hdl_t *dtp)
dt_bpf_map_update(dtp->dt_aggmap_fd, &cpu, &fd);
}
+ /* Create the agg generation value array. */
+ dtp->dt_genmap_fd = create_gmap(dtp, "agggen", BPF_MAP_TYPE_ARRAY,
+ sizeof(uint32_t), sizeof(uint64_t),
+ aggc);
+ if (dtp->dt_genmap_fd == -1)
+ return -1;
+
+ for (i = 0; i < aggc; i++) {
+ uint64_t val = 1;
- return dtp->dt_aggmap_fd;
+ if (dt_bpf_map_update(dtp->dt_genmap_fd, &i, &val) == -1)
+ return dt_bpf_error(dtp,
+ "cannot update BPF map 'agggen': %s\n",
+ strerror(errno));
+ }
+
+ return 0;
}
/*
diff --git a/libdtrace/dt_dlibs.c b/libdtrace/dt_dlibs.c
index c302b19c..eea0ba41 100644
--- a/libdtrace/dt_dlibs.c
+++ b/libdtrace/dt_dlibs.c
@@ -57,6 +57,7 @@ static const dt_ident_t dt_bpf_symbols[] = {
/* BPF maps */
DT_BPF_SYMBOL(aggs, DT_IDENT_PTR),
+ DT_BPF_SYMBOL(agggen, DT_IDENT_PTR),
DT_BPF_SYMBOL(buffers, DT_IDENT_PTR),
DT_BPF_SYMBOL(cpuinfo, DT_IDENT_PTR),
DT_BPF_SYMBOL(dvars, DT_IDENT_PTR),
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index 3e14d69d..32b0c923 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -380,6 +380,7 @@ struct dtrace_hdl {
int dt_proc_fd; /* file descriptor for proc eventfd */
int dt_stmap_fd; /* file descriptor for the 'state' BPF map */
int dt_aggmap_fd; /* file descriptor for the 'aggs' BPF map */
+ int dt_genmap_fd; /* file descriptor for the 'agggen' BPF map */
dtrace_handle_err_f *dt_errhdlr; /* error handler, if any */
void *dt_errarg; /* error handler argument */
dtrace_handle_drop_f *dt_drophdlr; /* drop handler, if any */
diff --git a/test/stress/buffering/err.resize2.r b/test/stress/buffering/err.resize2.r
index a4fbe390..2b5728ca 100644
--- a/test/stress/buffering/err.resize2.r
+++ b/test/stress/buffering/err.resize2.r
@@ -1,3 +1,3 @@
-- @@stderr --
dtrace: script 'test/stress/buffering/err.resize2.d' matched 1 probe
-dtrace: could not enable tracing: failed to create BPF map 'aggs_0': Too big
+dtrace: could not enable tracing: failed to create BPF map 'aggs': Too big
--
2.39.1
More information about the DTrace-devel
mailing list