[DTrace-devel] [PATCH 1/4] tp: clean up the API
Eugene Loh
eugene.loh at oracle.com
Thu Dec 5 21:01:51 UTC 2024
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
On 12/5/24 13:53, Kris Van Hees wrote:
> 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
> }
More information about the DTrace-devel
mailing list