[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