[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