[DTrace-devel] [PATCH 1/4] tp: clean up the API

Kris Van Hees kris.van.hees at oracle.com
Thu Dec 5 18:53:26 UTC 2024


All functions that can operate on a tracepoint object had a convenience
function for probes that are purely tracepoint-based, except the setting
and getting of the (event of BTF) id.  We now have dt_tp_probe_* and
dt_tp_* variants for that.

Also renamed event_id/event_fd to be id/fd.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_prov_fbt.c    |   6 +-
 libdtrace/dt_prov_rawtp.c  |   2 +-
 libdtrace/dt_prov_sdt.c    |   2 +-
 libdtrace/dt_provider_tp.c | 129 +++++++++++++++++++++++--------------
 libdtrace/dt_provider_tp.h |   9 ++-
 5 files changed, 90 insertions(+), 58 deletions(-)

diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 21f63ddf..da288401 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -208,7 +208,7 @@ static int fprobe_trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 		 */
 		dmp = dt_module_lookup_by_name(dtp, prp->desc->mod);
 		if (dmp && prp->argc == 2) {
-			int32_t	btf_id = dt_tp_get_event_id(prp);
+			int32_t	btf_id = dt_tp_probe_get_id(prp);
 			int	i = dt_btf_func_argc(dtp, dmp->dm_btf, btf_id);
 
 			emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, i * 8));
@@ -239,7 +239,7 @@ static int fprobe_probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	if (btf_id <= 0)
 		goto done;
 
-	dt_tp_set_event_id(prp, btf_id);
+	dt_tp_probe_set_id(prp, btf_id);
 
 	if (strcmp(desc->prb, "return") == 0) {
 		/* Void function return probes only provide 1 argument. */
@@ -306,7 +306,7 @@ static int fprobe_prog_load(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 		return fd;
 
 	rc = dt_bpf_prog_attach(prp->prov->impl->prog_type, atype, fd,
-				dt_tp_get_event_id(prp), dp, lvl, buf, sz);
+				dt_tp_probe_get_id(prp), dp, lvl, buf, sz);
 	close(fd);
 
 	return rc;
diff --git a/libdtrace/dt_prov_rawtp.c b/libdtrace/dt_prov_rawtp.c
index 778a6f9c..f1d3b6bc 100644
--- a/libdtrace/dt_prov_rawtp.c
+++ b/libdtrace/dt_prov_rawtp.c
@@ -221,7 +221,7 @@ done:
 static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 		      int *argcp, dt_argdesc_t **argvp)
 {
-	dt_tp_set_event_id(prp, UINT32_MAX);
+	dt_tp_probe_set_id(prp, UINT32_MAX);
 
 #ifdef HAVE_LIBCTF
 	int			rc, i;
diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
index 675e0458..74555f5b 100644
--- a/libdtrace/dt_prov_sdt.c
+++ b/libdtrace/dt_prov_sdt.c
@@ -241,7 +241,7 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
 	if (rc < 0 || id == 0)
 		return dt_set_errno(dtp, EDT_ENABLING_ERR);
 
-	dt_tp_set_event_id(prp, id);
+	dt_tp_probe_set_id(prp, id);
 
 	if (asprintf(&str, "struct trace_event_raw_%s", prp->desc->prb) == -1)
 		return dt_set_errno(dtp, EDT_NOMEM);
diff --git a/libdtrace/dt_provider_tp.c b/libdtrace/dt_provider_tp.c
index 50df2328..3d4ec1e0 100644
--- a/libdtrace/dt_provider_tp.c
+++ b/libdtrace/dt_provider_tp.c
@@ -31,8 +31,8 @@
  * a tracepoint or BTF type exists yet.
  */
 struct tp_probe {
-	uint32_t	event_id;	/* tracepoint event id or BTF id */
-	int		event_fd;	/* tracepoint perf event fd */
+	uint32_t	id;	/* tracepoint event id or BTF id */
+	int		fd;	/* tracepoint perf event fd */
 };
 
 /*
@@ -47,8 +47,8 @@ dt_tp_alloc(dtrace_hdl_t *dtp)
 	if (tpp == NULL)
 		return NULL;
 
-	tpp->event_id = 0;
-	tpp->event_fd = -1;
+	tpp->id = 0;
+	tpp->fd = -1;
 
 	return tpp;
 }
@@ -62,10 +62,10 @@ dt_tp_alloc(dtrace_hdl_t *dtp)
 int
 dt_tp_attach(dtrace_hdl_t *dtp, tp_probe_t *tpp, int bpf_fd)
 {
-	if (tpp->event_id == 0)
+	if (tpp->id == 0)
 		return 0;
 
-	if (tpp->event_fd == -1) {
+	if (tpp->fd == -1) {
 		int			fd;
 		struct perf_event_attr	attr = { 0, };
 
@@ -73,21 +73,45 @@ dt_tp_attach(dtrace_hdl_t *dtp, tp_probe_t *tpp, int bpf_fd)
 		attr.size = sizeof(attr);
 		attr.sample_period = 1;
 		attr.wakeup_events = 1;
-		attr.config = tpp->event_id;
+		attr.config = tpp->id;
 
 		fd = dt_perf_event_open(&attr, -1, 0, -1, 0);
 		if (fd < 0)
 			return fd;
 
-		tpp->event_fd = fd;
+		tpp->fd = fd;
 	}
 
-	if (ioctl(tpp->event_fd, PERF_EVENT_IOC_SET_BPF, bpf_fd) < 0)
+	if (ioctl(tpp->fd, PERF_EVENT_IOC_SET_BPF, bpf_fd) < 0)
 		return -errno;
 
 	return 0;
 }
 
+/*
+ * Attach the given (loaded) BPF program to the given raw tracepoint.  The
+ * raw tracepoint is identified by name (tpp->id is UINT_MAX) or BTF id
+ * (tpp->id).
+ */
+int
+dt_tp_attach_raw(dtrace_hdl_t *dtp, tp_probe_t *tpp, const char *name,
+		 int bpf_fd)
+{
+	if (tpp->fd == -1) {
+		int	fd;
+
+		fd = dt_bpf_raw_tracepoint_open(
+			tpp->id == UINT_MAX ? name : NULL,
+			bpf_fd);
+		if (fd < 0)
+			return -errno;
+
+		tpp->fd = fd;
+	}
+
+	return 0;
+}
+
 /*
  * Parse a EVENTSFS/<group>/<event>/format file to determine the event id and
  * the argument types.
@@ -120,7 +144,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
 	size_t		argsz = 0;
 	dt_argdesc_t	*argv = NULL;
 
-	tpp->event_id = 0;
+	tpp->id = 0;
 
 	/*
 	 * Let skip be the total number of fields to skip.
@@ -136,7 +160,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
 	while (getline(&buf, &bufsz, f) >= 0) {
 		char	*p = buf;
 
-		if (sscanf(buf, "ID: %u\n", &tpp->event_id) == 1)
+		if (sscanf(buf, "ID: %u\n", &tpp->id) == 1)
 			continue;
 
 		if (sscanf(buf, " field:%[^;]", p) <= 0)
@@ -287,7 +311,7 @@ done:
 int
 dt_tp_has_info(const tp_probe_t *tpp)
 {
-	return tpp->event_id > 0;
+	return tpp->id > 0;
 }
 
 /*
@@ -297,11 +321,11 @@ dt_tp_has_info(const tp_probe_t *tpp)
 void
 dt_tp_detach(dtrace_hdl_t *dtp, tp_probe_t *tpp)
 {
-	tpp->event_id = 0;
+	tpp->id = 0;
 
-	if (tpp->event_fd != -1) {
-		close(tpp->event_fd);
-		tpp->event_fd = -1;
+	if (tpp->fd != -1) {
+		close(tpp->fd);
+		tpp->fd = -1;
 	}
 }
 
@@ -316,6 +340,24 @@ dt_tp_destroy(dtrace_hdl_t *dtp, tp_probe_t *tpp)
 	dt_free(dtp, tpp);
 }
 
+/*
+ * Return the (event or BTF) id for the tracepoint.
+ */
+uint32_t
+dt_tp_get_id(const tp_probe_t *tpp)
+{
+	return tpp->id;
+}
+
+/*
+ * Set the (event or BTF) id for the tracepoint.
+ */
+void
+dt_tp_set_id(tp_probe_t *tpp, uint32_t id)
+{
+	tpp->id = id;
+}
+
 /*
  * Create a tracepoint-based probe.  This function is called from any provider
  * that handles tracepoint-based probes.  It allocates tracepoint-specific data
@@ -334,22 +376,6 @@ dt_tp_probe_insert(dtrace_hdl_t *dtp, dt_provider_t *prov, const char *prv,
 	return dt_probe_insert(dtp, prov, prv, mod, fun, prb, tpp);
 }
 
-uint32_t
-dt_tp_get_event_id(const dt_probe_t *prp)
-{
-	tp_probe_t	*tpp = prp->prv_data;
-
-	return tpp->event_id;
-}
-
-void
-dt_tp_set_event_id(const dt_probe_t *prp, uint32_t id)
-{
-	tp_probe_t	*tpp = prp->prv_data;
-
-	tpp->event_id = id;
-}
-
 /*
  * Parse a EVENTSFS/<group>/<event>/format file to determine the event id and
  * the argument types for a given probe.
@@ -385,28 +411,11 @@ dt_tp_probe_attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
 
 /*
  * Convenience function for raw tracepoint-based probe attach.
- * This function is also used to attach to BPF ids, because those are also
- * handled through the raw tracepoint interface.  These probes are identified
- * by event_id being a value other than UINT_MAX.
  */
 int
 dt_tp_probe_attach_raw(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
 {
-	tp_probe_t	*tpp = prp->prv_data;
-
-	if (tpp->event_fd == -1) {
-		int	fd;
-
-		fd = dt_bpf_raw_tracepoint_open(
-			tpp->event_id == UINT_MAX ? prp->desc->prb : NULL,
-			bpf_fd);
-		if (fd < 0)
-			return -errno;
-
-		tpp->event_fd = fd;
-	}
-
-	return 0;
+	return dt_tp_attach_raw(dtp, prp->prv_data, prp->desc->prb, bpf_fd);
 }
 
 /*
@@ -426,3 +435,23 @@ dt_tp_probe_destroy(dtrace_hdl_t *dtp, void *datap)
 {
 	dt_tp_destroy(dtp, datap);
 }
+
+/*
+ * Convenience function to get the (event or BTF) id for the tracepoint of a
+ * probe.
+ */
+uint32_t
+dt_tp_probe_get_id(const dt_probe_t *prp)
+{
+	return dt_tp_get_id(prp->prv_data);
+}
+
+/*
+ * Convenience function to set the (event or BTF) id for the tracepoint of a
+ * probe.
+ */
+void
+dt_tp_probe_set_id(const dt_probe_t *prp, uint32_t id)
+{
+	dt_tp_set_id(prp->prv_data, id);
+}
diff --git a/libdtrace/dt_provider_tp.h b/libdtrace/dt_provider_tp.h
index e7d52876..f131b1e0 100644
--- a/libdtrace/dt_provider_tp.h
+++ b/libdtrace/dt_provider_tp.h
@@ -30,19 +30,20 @@ typedef struct tp_probe tp_probe_t;
 
 extern tp_probe_t *dt_tp_alloc(dtrace_hdl_t *dtp);
 extern int dt_tp_attach(dtrace_hdl_t *dtp, tp_probe_t *tpp, int bpf_fd);
-extern void dt_tp_set_event_id(const struct dt_probe *prp, uint32_t id);
+extern int dt_tp_attach_raw(dtrace_hdl_t *dtp, tp_probe_t *tpp,
+			    const char *name, int bpf_fd);
 extern int dt_tp_has_info(const tp_probe_t *tpp);
 extern int dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip,
 			    tp_probe_t *tpp, int *argcp, dt_argdesc_t **argvp);
 extern void dt_tp_detach(dtrace_hdl_t *dtp, tp_probe_t *tpp);
 extern void dt_tp_destroy(dtrace_hdl_t *dtp, tp_probe_t *tpp);
+extern uint32_t dt_tp_get_id(const tp_probe_t *prp);
+extern void dt_tp_set_id(tp_probe_t *prp, uint32_t id);
 
 extern struct dt_probe *dt_tp_probe_insert(dtrace_hdl_t *dtp,
 					   dt_provider_t *prov,
 					   const char *prv, const char *mod,
 					   const char *fun, const char *prb);
-extern uint32_t dt_tp_get_event_id(const struct dt_probe *prp);
-extern void dt_tp_set_event_id(const struct dt_probe *prp, uint32_t id);
 extern int dt_tp_probe_info(dtrace_hdl_t *dtp, FILE *f, int skip,
 			    const struct dt_probe *prp, int *argcp,
 			    dt_argdesc_t **argvp);
@@ -53,6 +54,8 @@ extern int dt_tp_probe_attach_raw(dtrace_hdl_t *dtp, const struct dt_probe *prp,
 				  int bpf_fd);
 extern void dt_tp_probe_detach(dtrace_hdl_t *dtp, const struct dt_probe *prp);
 extern void dt_tp_probe_destroy(dtrace_hdl_t *dtp, void *datap);
+extern uint32_t dt_tp_probe_get_id(const struct dt_probe *prp);
+extern void dt_tp_probe_set_id(const struct dt_probe *prp, uint32_t id);
 
 #ifdef	__cplusplus
 }
-- 
2.45.2




More information about the DTrace-devel mailing list