[DTrace-devel] [PATCH 02/05] tp: handle tracepoint argument datatypes with symbolic array size

Eugene Loh eugene.loh at oracle.com
Fri May 5 19:11:21 UTC 2023


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
but I have some questions.  (You can decide if any of the questions 
warrants rescinding the R-b!)

The main question is why not use this approach for every [] field, even 
if the arrsize spec is strictly numerical... that is, even if it's [4] 
or something?  Using the same approach in each case could simplify this 
code a little: no alternate code path for !alpha, don't care if it is 
alpha, etc.

Also, is the name "alpha" right?  !isdigit() could also mean ' ' or '+' 
and I see some arrsize specs like "[32 + 2]", which would be handled by 
the new mechanism even though the name "alpha" does not quite make sense.

But basically looks fine.

On 5/5/23 11:30, Kris Van Hees via DTrace-devel wrote:
> Some kernels expose datatypes for tracepoint elements like this:
>
>    field:char oldcomm[TASK_COMM_LEN]; offset:12; size:16; signed:1;
>
> Since the type compiler and CTF type parser) cannot resolve the value
> of TASK_COMM_LEN, we synthesize the type ourselves based on the base
> type (char in this case) and the argument size (16 in this case).
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
>   libdtrace/dt_provider_tp.c | 41 ++++++++++++++++++++++++++++++--------
>   1 file changed, 33 insertions(+), 8 deletions(-)
>
> diff --git a/libdtrace/dt_provider_tp.c b/libdtrace/dt_provider_tp.c
> index a08550ab..ff4cc56b 100644
> --- a/libdtrace/dt_provider_tp.c
> +++ b/libdtrace/dt_provider_tp.c
> @@ -7,6 +7,7 @@
>    * Provider support code for tracepoint-based probes.
>    */
>   #include <errno.h>
> +#include <ctype.h>
>   #include <stdio.h>
>   #include <sys/ioctl.h>
>   #include <linux/perf_event.h>
> @@ -111,7 +112,7 @@ dt_tp_is_created(const tp_probe_t *tpp)
>    * the identifier isn't as easy because it may be suffixed by one or more
>    * array dimension specifiers (and those are part of the type).
>    *
> - * All events include a number of fields that we are not interested and that
> + * All events include a number of fields that we are not interested in and that
>    * need to be skipped (SKIP_FIELDS_COUNT).  Callers of this function can
>    * specify an additional number of fields to skip (using the 'skip' parameter)
>    * before we get to the actual arguments.
> @@ -187,8 +188,13 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   	rewind(f);
>   	argc = -skip;
>   	while (getline(&buf, &bufsz, f) >= 0) {
> -		char	*p = buf;
> +		char	*p;
>   		size_t	l;
> +		size_t	size = 0;
> +
> +		p = strstr(buf, "size:");
> +		if (p != NULL)
> +			size = strtol(p + 5, NULL, 10);
>   
>   		if (sscanf(buf, " field:%[^;]", p) <= 0)
>   			continue;
> @@ -214,6 +220,7 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   		} else {
>   			char	*s, *q;
>   			int	n;
> +			int	alpha = 0;
>   
>   			/*
>   			 * The identifier is followed by at least one array
> @@ -223,7 +230,10 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   			 */
>   			s = p + l - 1;
>   			for (;;) {
> -				while (*(--s) != '[') ;
> +				while (*(--s) != '[') {
> +					if (!isdigit(*s))
> +						alpha = 1;
> +				}
>   				while (*(--s) == ' ') ;
>   				if (*s != ']')
>   					break;
> @@ -240,11 +250,26 @@ dt_tp_event_info(dtrace_hdl_t *dtp, FILE *f, int skip, tp_probe_t *tpp,
>   			if ((q = strrchr(p, ' ')))
>   				*q = '\0';
>   
> -			l = q - p;
> -			memcpy(strp, p, l);
> -			n = strlen(s);
> -			memcpy(strp + l, s, n);
> -			l += n;
> +			if (alpha) {
> +				ctf_file_t	*ctfp = dtp->dt_shared_ctf;
> +				ctf_id_t	type;
> +				size_t		esize = 1;
> +
> +				type = ctf_lookup_by_name(ctfp, p);
> +				if (type != CTF_ERR)
> +					esize = ctf_type_size(ctfp, type);
> +				if (esize != 0)
> +					size /= esize;
> +
> +				l = snprintf(strp, q - p + strlen(s), "%s[%lu]",
> +					     p, size);
> +			} else {
> +				l = q - p;
> +				memcpy(strp, p, l);
> +				n = strlen(s);
> +				memcpy(strp + l, s, n);
> +				l += n;
> +			}
>   		}
>   
>   		argv[argc].mapping = argc;



More information about the DTrace-devel mailing list