[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