[DTrace-devel] [PATCH] Make it possible to add BPF variables dynamically
Kris Van Hees
kris.van.hees at oracle.com
Mon Mar 29 10:28:32 PDT 2021
Future development needs to be able to create BPF variable identifiers
dynamically during compilation. The dt_dlib_add_var() function can be
used to do thid. Both a name and an unsigned int value are to be
provided when adding a BPF variable.
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_dlibs.c | 26 ++++++++++++++++++++++----
libdtrace/dt_impl.h | 4 +++-
2 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/libdtrace/dt_dlibs.c b/libdtrace/dt_dlibs.c
index 8536704d..bfa0e861 100644
--- a/libdtrace/dt_dlibs.c
+++ b/libdtrace/dt_dlibs.c
@@ -134,15 +134,15 @@ dt_dlib_get_xsym(dtrace_hdl_t *dtp, const char *name, int kind)
}
/*
- * Add a BPF identifier of a given type.
+ * Add a BPF identifier of a given type with given id.
*/
-dt_ident_t *
-dt_dlib_add_sym(dtrace_hdl_t *dtp, const char *name, int kind)
+static dt_ident_t *
+dt_dlib_add_sym_id(dtrace_hdl_t *dtp, const char *name, int kind, uint_t id)
{
dt_idhash_t *dhp = dtp->dt_bpfsyms;
dt_ident_t *idp;
- idp = dt_idhash_insert(dhp, name, kind, DT_IDFLG_BPF, DT_IDENT_UNDEF,
+ idp = dt_idhash_insert(dhp, name, kind, DT_IDFLG_BPF, id,
dt_bpf_attr, DT_VERS_2_0,
kind == DT_IDENT_SYMBOL ? &dt_idops_difo : NULL,
dtp, 0);
@@ -150,6 +150,15 @@ dt_dlib_add_sym(dtrace_hdl_t *dtp, const char *name, int kind)
return idp;
}
+/*
+ * Add a BPF identifier of a given type.
+ */
+static dt_ident_t *
+dt_dlib_add_sym(dtrace_hdl_t *dtp, const char *name, int kind)
+{
+ return dt_dlib_add_sym_id(dtp, name, kind, DT_IDENT_UNDEF);
+}
+
/*
* Lookup a BPF function identifier by name. We first match against built-in
* functions, and if not found there, we try external symbols.
@@ -201,6 +210,15 @@ dt_dlib_get_var(dtrace_hdl_t *dtp, const char *name)
return dt_dlib_get_xsym(dtp, name, DT_IDENT_SCALAR);
}
+/*
+ * Add a BPF variable.
+ */
+dt_ident_t *
+dt_dlib_add_var(dtrace_hdl_t *dtp, const char *name, uint_t id)
+{
+ return dt_dlib_add_sym_id(dtp, name, DT_IDENT_SCALAR, id);
+}
+
/*
* Return the DIFO for an external symbol.
*/
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index 71b4c6c6..c7b09ac9 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -698,11 +698,13 @@ extern void dt_setcontext(dtrace_hdl_t *, dtrace_probedesc_t *);
extern void dt_endcontext(dtrace_hdl_t *);
extern void dt_dlib_init(dtrace_hdl_t *dtp);
+extern dt_ident_t *dt_dlib_get_sym(dtrace_hdl_t *, const char *);
extern dt_ident_t *dt_dlib_add_func(dtrace_hdl_t *, const char *);
extern dt_ident_t *dt_dlib_get_func(dtrace_hdl_t *, const char *);
extern dt_ident_t *dt_dlib_get_map(dtrace_hdl_t *, const char *);
extern dt_ident_t *dt_dlib_get_var(dtrace_hdl_t *, const char *);
-extern dt_ident_t *dt_dlib_get_sym(dtrace_hdl_t *, const char *);
+extern dt_ident_t *dt_dlib_add_var(dtrace_hdl_t *dtp, const char *name,
+ uint_t id);
extern dtrace_difo_t *dt_dlib_get_func_difo(dtrace_hdl_t *, const dt_ident_t *);
extern void dt_dlib_reset(dtrace_hdl_t *dtp, boolean_t);
extern int dt_load_libs(dtrace_hdl_t *dtp);
--
2.28.0
More information about the DTrace-devel
mailing list