All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Howard Chu <howardchu95@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	Ian Rogers <irogers@google.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v2 4/5] perf trace: Filter enum arguments with enum names
Date: Wed, 19 Jun 2024 10:48:48 -0300	[thread overview]
Message-ID: <ZnLhwFuQvP59p1BJ@x1> (raw)
In-Reply-To: <20240619082042.4173621-5-howardchu95@gmail.com>

On Wed, Jun 19, 2024 at 04:20:41PM +0800, Howard Chu wrote:
> Before:
> 
> perf $ ./perf trace -e timer:hrtimer_start --filter='mode!=HRTIMER_MODE_ABS_PINNED_HARD' --max-events=1
> No resolver (strtoul) for "mode" in "timer:hrtimer_start", can't set filter "(mode!=HRTIMER_MODE_ABS_PINNED_HARD) && (common_pid != 281988)"
> 
> After:
> 
> perf $ ./perf trace -e timer:hrtimer_start --filter='mode!=HRTIMER_MODE_ABS_PINNED_HARD' --max-events=1
>      0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: 0xffffffffa77a5be0, expires: 12351248764875, softexpires: 12351248764875, mode: HRTIMER_MODE_ABS)
> 
> && and ||:
> 
> perf $ ./perf trace -e timer:hrtimer_start --filter='mode != HRTIMER_MODE_ABS_PINNED_HARD && mode != HRTIMER_MODE_ABS' --max-events=1
>      0.000 Hyprland/534 timer:hrtimer_start(hrtimer: 0xffff9497801a84d0, function: 0xffffffffc04cdbe0, expires: 12639434638458, softexpires: 12639433638458, mode: HRTIMER_MODE_REL)
> 
> perf $ ./perf trace -e timer:hrtimer_start --filter='mode == HRTIMER_MODE_REL || mode == HRTIMER_MODE_PINNED' --max-events=1
>      0.000 ldlck-test/60639 timer:hrtimer_start(hrtimer: 0xffffb16404ee7bf8, function: 0xffffffffa7790420, expires: 12772614418016, softexpires: 12772614368016, mode: HRTIMER_MODE_REL)
> 
> Switching it up, using both enum name and integer value(--filter='mode == HRTIMER_MODE_ABS_PINNED_HARD || mode == 0'):
> 
> perf $ ./perf trace -e timer:hrtimer_start --filter='mode == HRTIMER_MODE_ABS_PINNED_HARD || mode == 0' --max-events=3
>      0.000 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: 0xffffffffa77a5be0, expires: 12601748739825, softexpires: 12601748739825, mode: HRTIMER_MODE_ABS_PINNED_HARD)
>      0.036 :0/0 timer:hrtimer_start(hrtimer: 0xffff9498a6ca5f18, function: 0xffffffffa77a5be0, expires: 12518758748124, softexpires: 12518758748124, mode: HRTIMER_MODE_ABS_PINNED_HARD)
>      0.172 tmux: server/41881 timer:hrtimer_start(hrtimer: 0xffffb164081e7838, function: 0xffffffffa7790420, expires: 12518768255836, softexpires: 12518768205836, mode: HRTIMER_MODE_ABS)
> 
> P.S.
> perf $ pahole hrtimer_mode
> enum hrtimer_mode {
>         HRTIMER_MODE_ABS             = 0,
>         HRTIMER_MODE_REL             = 1,
>         HRTIMER_MODE_PINNED          = 2,
>         HRTIMER_MODE_SOFT            = 4,
>         HRTIMER_MODE_HARD            = 8,
>         HRTIMER_MODE_ABS_PINNED      = 2,
>         HRTIMER_MODE_REL_PINNED      = 3,
>         HRTIMER_MODE_ABS_SOFT        = 4,
>         HRTIMER_MODE_REL_SOFT        = 5,
>         HRTIMER_MODE_ABS_PINNED_SOFT = 6,
>         HRTIMER_MODE_REL_PINNED_SOFT = 7,
>         HRTIMER_MODE_ABS_HARD        = 8,
>         HRTIMER_MODE_REL_HARD        = 9,
>         HRTIMER_MODE_ABS_PINNED_HARD = 10,
>         HRTIMER_MODE_REL_PINNED_HARD = 11,
> };
> 
> Tested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
> Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
> Reviewed-by: Arnaldo Carvalho de Melo <acme@kernel.org>
> Signed-off-by: Howard Chu <howardchu95@gmail.com>
> ---
>  tools/perf/builtin-trace.c | 89 ++++++++++++++++++++++++++++++++------
>  1 file changed, 76 insertions(+), 13 deletions(-)
> 
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index bd16679fb4c0..1148c3edee97 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -904,11 +904,36 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,
>  	    .strtoul	= STUL_STRARRAY_FLAGS, \
>  	    .parm	= &strarray__##array, }
>  
> -static int btf_enum_find_entry(struct btf *btf, char *type, struct syscall_arg_fmt *arg_fmt)
> +#define SCA_GETRANDOM_FLAGS syscall_arg__scnprintf_getrandom_flags

The above seems unrelated? (The definition of SCA_GETRANDOM_FLAGS) as it
is not used in any other place in this patch, right?

- Arnaldo

> +
> +static const struct btf_type *btf_find_type(struct btf *btf, char *type)
>  {
>  	const struct btf_type *bt;
> +	int id = btf__find_by_name(btf, type);
> +
> +	if (id < 0)
> +		return NULL;
> +
> +	bt = btf__type_by_id(btf, id);
> +	if (bt == NULL)
> +		return NULL;
> +
> +	return bt;
> +}
> +
> +struct btf_parm {
> +	struct btf *btf;
> +	char *type;
> +};
> +
> +static bool syscall_arg__strtoul_btf_enum(char *bf, size_t size, struct syscall_arg *arg, u64 *val)
> +{
> +	struct btf_parm *bparm = arg->parm;
> +	struct btf *btf = bparm->btf;
> +	char *type      = bparm->type;
>  	char enum_prefix[][16] = { "enum", "const enum" }, *ep;
> -	int id;
> +	struct btf_enum *be;
> +	const struct btf_type *bt;
>  	size_t i;
>  
>  	for (i = 0; i < ARRAY_SIZE(enum_prefix); i++) {
> @@ -917,11 +942,38 @@ static int btf_enum_find_entry(struct btf *btf, char *type, struct syscall_arg_f
>  			type += strlen(ep) + 1;
>  	}
>  
> -	id = btf__find_by_name(btf, type);
> -	if (id < 0)
> -		return -1;
> +	bt = btf_find_type(btf, type);
> +	if (bt == NULL)
> +		return false;
>  
> -	bt = btf__type_by_id(btf, id);
> +	for (be = btf_enum(bt), i = 0; i < btf_vlen(bt); ++i, ++be) {
> +		const char *name = btf__name_by_offset(btf, be->name_off);
> +		int max_len = max(size, strlen(name));
> +
> +		if (strncmp(name, bf, max_len) == 0) {
> +			*val = be->val;
> +			return true;
> +		}
> +	}
> +
> +	return false;
> +}
> +
> +#define STUL_BTF_ENUM syscall_arg__strtoul_btf_enum
> +
> +static int btf_enum_find_entry(struct btf *btf, char *type, struct syscall_arg_fmt *arg_fmt)
> +{
> +	char enum_prefix[][16] = { "enum", "const enum" }, *ep;
> +	const struct btf_type *bt;
> +	size_t i;
> +
> +	for (i = 0; i < ARRAY_SIZE(enum_prefix); i++) {
> +		ep = enum_prefix[i];
> +		if (strlen(type) > strlen(ep) + 1 && strstarts(type, ep))
> +			type += strlen(ep) + 1;
> +	}
> +
> +	bt = btf_find_type(btf, type);
>  	if (bt == NULL)
>  		return -1;
>  
> @@ -1850,6 +1902,7 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
>  			arg->scnprintf = SCA_FD;
>  		} else if (strstr(field->type, "enum") && use_btf != NULL) {
>  			*use_btf = arg->is_enum = true;
> +			arg->strtoul = STUL_BTF_ENUM;
>  		} else {
>  			const struct syscall_arg_fmt *fmt =
>  				syscall_arg_fmt__find_by_name(field->name);
> @@ -3776,7 +3829,8 @@ static int ordered_events__deliver_event(struct ordered_events *oe,
>  	return __trace__deliver_event(trace, event->event);
>  }
>  
> -static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel *evsel, char *arg)
> +static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel *evsel, char *arg,
> +								   char **type)
>  {
>  	struct tep_format_field *field;
>  	struct syscall_arg_fmt *fmt = __evsel__syscall_arg_fmt(evsel);
> @@ -3785,8 +3839,10 @@ static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel
>  		return NULL;
>  
>  	for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
> -		if (strcmp(field->name, arg) == 0)
> +		if (strcmp(field->name, arg) == 0) {
> +			*type = field->type;
>  			return fmt;
> +		}
>  
>  	return NULL;
>  }
> @@ -3824,14 +3880,14 @@ static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel
>  			struct syscall_arg_fmt *fmt;
>  			int left_size = tok - left,
>  			    right_size = right_end - right;
> -			char arg[128];
> +			char arg[128], *type;
>  
>  			while (isspace(left[left_size - 1]))
>  				--left_size;
>  
>  			scnprintf(arg, sizeof(arg), "%.*s", left_size, left);
>  
> -			fmt = evsel__find_syscall_arg_fmt_by_name(evsel, arg);
> +			fmt = evsel__find_syscall_arg_fmt_by_name(evsel, arg, &type);
>  			if (fmt == NULL) {
>  				pr_err("\"%s\" not found in \"%s\", can't set filter \"%s\"\n",
>  				       arg, evsel->name, evsel->filter);
> @@ -3843,9 +3899,16 @@ static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel
>  
>  			if (fmt->strtoul) {
>  				u64 val;
> -				struct syscall_arg syscall_arg = {
> -					.parm = fmt->parm,
> -				};
> +				struct syscall_arg syscall_arg;
> +				struct btf_parm bparm;
> +
> +				if (fmt->is_enum) {
> +					bparm.btf  = trace->btf;
> +					bparm.type = type;
> +					syscall_arg.parm = &bparm;
> +				} else {
> +					syscall_arg.parm = fmt->parm;
> +				}
>  
>  				if (fmt->strtoul(right, right_size, &syscall_arg, &val)) {
>  					char *n, expansion[19];
> -- 
> 2.45.2
> 

  reply	other threads:[~2024-06-19 13:48 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-19  8:20 [PATCH v2 0/5] perf trace: Augment enum arguments with BTF Howard Chu
2024-06-19  8:20 ` [PATCH v2 1/5] perf trace: Fix iteration of syscall ids in syscalltbl->entries Howard Chu
2024-06-19  8:20 ` [PATCH v2 2/5] perf trace: Augment enum syscall arguments with BTF Howard Chu
2024-06-19 13:44   ` Arnaldo Carvalho de Melo
2024-06-19 17:59     ` Howard Chu
2024-06-20 16:34       ` Howard Chu
2024-06-20 19:16         ` Howard Chu
2024-06-21 13:40           ` Arnaldo Carvalho de Melo
2024-06-21 16:18             ` Howard Chu
2024-06-22 18:28               ` Arnaldo Carvalho de Melo
2024-06-23 11:34                 ` Howard Chu
2024-06-21 18:03       ` Arnaldo Carvalho de Melo
2024-06-19  8:20 ` [PATCH v2 3/5] perf trace: Augment enum tracepoint " Howard Chu
2024-06-19 13:46   ` Arnaldo Carvalho de Melo
2024-06-19 18:00     ` Howard Chu
2024-06-19  8:20 ` [PATCH v2 4/5] perf trace: Filter enum arguments with enum names Howard Chu
2024-06-19 13:48   ` Arnaldo Carvalho de Melo [this message]
2024-06-19 18:18     ` Howard Chu
2024-06-19  8:20 ` [PATCH v2 5/5] perf trace: Add test for enum augmentation Howard Chu
2024-06-19 13:51   ` Arnaldo Carvalho de Melo
2024-06-19 14:36     ` Namhyung Kim
2024-06-19 18:26       ` Howard Chu
2024-06-21 16:07   ` Namhyung Kim
2024-06-21 16:43     ` Howard Chu
2024-06-21 17:15       ` Namhyung Kim
2024-06-28  6:37   ` kernel test robot
2024-06-19 13:55 ` [PATCH v2 0/5] perf trace: Augment enum arguments with BTF Arnaldo Carvalho de Melo
2024-06-19 18:19   ` Namhyung Kim
2024-06-19 18:25     ` Howard Chu
2024-06-20 19:12       ` Howard Chu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZnLhwFuQvP59p1BJ@x1 \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=howardchu95@gmail.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=namhyung@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.