lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aIF8OToitmp8Uj_T@google.com>
Date: Wed, 23 Jul 2025 17:20:09 -0700
From: Namhyung Kim <namhyung@...nel.org>
To: Ian Rogers <irogers@...gle.com>
Cc: Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>,
	Arnaldo Carvalho de Melo <acme@...nel.org>,
	Mark Rutland <mark.rutland@....com>,
	Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
	Jiri Olsa <jolsa@...nel.org>,
	Adrian Hunter <adrian.hunter@...el.com>,
	Kan Liang <kan.liang@...ux.intel.com>,
	James Clark <james.clark@...aro.org>, Xu Yang <xu.yang_2@....com>,
	"Masami Hiramatsu (Google)" <mhiramat@...nel.org>,
	Collin Funk <collin.funk1@...il.com>,
	Howard Chu <howardchu95@...il.com>,
	Weilin Wang <weilin.wang@...el.com>,
	Andi Kleen <ak@...ux.intel.com>,
	"Dr. David Alan Gilbert" <linux@...blig.org>,
	Thomas Richter <tmricht@...ux.ibm.com>,
	Tiezhu Yang <yangtiezhu@...ngson.cn>,
	Gautam Menghani <gautam@...ux.ibm.com>,
	Thomas Falcon <thomas.falcon@...el.com>,
	Chun-Tse Shao <ctshao@...gle.com>, linux-kernel@...r.kernel.org,
	linux-perf-users@...r.kernel.org
Subject: Re: [PATCH v7 03/16] perf parse-events: Remove non-json software
 events

On Mon, Jul 14, 2025 at 09:43:51AM -0700, Ian Rogers wrote:
> Remove the hard coded encodings from parse-events. This has the
> consequence that software events are matched using the sysfs/json
> priority, will be case insensitive and will be wildcarded across PMUs.
> As there were software and hardware types in the parsing code, the
> removal means software vs hardware logic can be removed and hardware
> assumed.
> 
> Now the perf json provides detailed descriptions of software events,
> remove the previous listing support that didn't contain event
> descriptions. When globbing is required for the "sw" option in perf
> list, use string PMU globbing as was done previously for the tool PMU.

Oh, you explained the issues here.  Great, I've seen you posted v8.
Will continue there.

Thanks,
Namhyung

> 
> Signed-off-by: Ian Rogers <irogers@...gle.com>
> ---
>  tools/perf/builtin-list.c      | 19 ++++++-------
>  tools/perf/util/parse-events.c | 51 ----------------------------------
>  tools/perf/util/parse-events.h |  1 -
>  tools/perf/util/parse-events.l | 38 +++++++++----------------
>  tools/perf/util/parse-events.y | 29 ++++++++-----------
>  tools/perf/util/print-events.c |  2 --
>  6 files changed, 33 insertions(+), 107 deletions(-)
> 
> diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c
> index e9b595d75df2..674bb0afbf93 100644
> --- a/tools/perf/builtin-list.c
> +++ b/tools/perf/builtin-list.c
> @@ -623,16 +623,17 @@ int cmd_list(int argc, const char **argv)
>  		else if (strcmp(argv[i], "sw") == 0 ||
>  			 strcmp(argv[i], "software") == 0) {
>  			char *old_pmu_glob = default_ps.pmu_glob;
> +			static const char * const sw_globs[] = { "software", "tool" };
>  
> -			print_symbol_events(&print_cb, ps, PERF_TYPE_SOFTWARE,
> -					event_symbols_sw, PERF_COUNT_SW_MAX);
> -			default_ps.pmu_glob = strdup("tool");
> -			if (!default_ps.pmu_glob) {
> -				ret = -1;
> -				goto out;
> +			for (size_t j = 0; j < ARRAY_SIZE(sw_globs); j++) {
> +				default_ps.pmu_glob = strdup(sw_globs[j]);
> +				if (!default_ps.pmu_glob) {
> +					ret = -1;
> +					goto out;
> +				}
> +				perf_pmus__print_pmu_events(&print_cb, ps);
> +				zfree(&default_ps.pmu_glob);
>  			}
> -			perf_pmus__print_pmu_events(&print_cb, ps);
> -			zfree(&default_ps.pmu_glob);
>  			default_ps.pmu_glob = old_pmu_glob;
>  		} else if (strcmp(argv[i], "cache") == 0 ||
>  			 strcmp(argv[i], "hwcache") == 0)
> @@ -679,8 +680,6 @@ int cmd_list(int argc, const char **argv)
>  			default_ps.event_glob = s;
>  			print_symbol_events(&print_cb, ps, PERF_TYPE_HARDWARE,
>  					event_symbols_hw, PERF_COUNT_HW_MAX);
> -			print_symbol_events(&print_cb, ps, PERF_TYPE_SOFTWARE,
> -					event_symbols_sw, PERF_COUNT_SW_MAX);
>  			print_hwcache_events(&print_cb, ps);
>  			perf_pmus__print_pmu_events(&print_cb, ps);
>  			print_tracepoint_events(&print_cb, ps);
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index a59ae5ca0f89..1ae481c9802b 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -84,57 +84,6 @@ const struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
>  	},
>  };
>  
> -const struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
> -	[PERF_COUNT_SW_CPU_CLOCK] = {
> -		.symbol = "cpu-clock",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_TASK_CLOCK] = {
> -		.symbol = "task-clock",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_PAGE_FAULTS] = {
> -		.symbol = "page-faults",
> -		.alias  = "faults",
> -	},
> -	[PERF_COUNT_SW_CONTEXT_SWITCHES] = {
> -		.symbol = "context-switches",
> -		.alias  = "cs",
> -	},
> -	[PERF_COUNT_SW_CPU_MIGRATIONS] = {
> -		.symbol = "cpu-migrations",
> -		.alias  = "migrations",
> -	},
> -	[PERF_COUNT_SW_PAGE_FAULTS_MIN] = {
> -		.symbol = "minor-faults",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_PAGE_FAULTS_MAJ] = {
> -		.symbol = "major-faults",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_ALIGNMENT_FAULTS] = {
> -		.symbol = "alignment-faults",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_EMULATION_FAULTS] = {
> -		.symbol = "emulation-faults",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_DUMMY] = {
> -		.symbol = "dummy",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_BPF_OUTPUT] = {
> -		.symbol = "bpf-output",
> -		.alias  = "",
> -	},
> -	[PERF_COUNT_SW_CGROUP_SWITCHES] = {
> -		.symbol = "cgroup-switches",
> -		.alias  = "",
> -	},
> -};
> -
>  static const char *const event_types[] = {
>  	[PERF_TYPE_HARDWARE]	= "hardware",
>  	[PERF_TYPE_SOFTWARE]	= "software",
> diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> index b47bf2810112..62dc7202e3ba 100644
> --- a/tools/perf/util/parse-events.h
> +++ b/tools/perf/util/parse-events.h
> @@ -264,7 +264,6 @@ struct event_symbol {
>  	const char	*alias;
>  };
>  extern const struct event_symbol event_symbols_hw[];
> -extern const struct event_symbol event_symbols_sw[];
>  
>  char *parse_events_formats_error_string(char *additional_terms);
>  
> diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
> index 4af7b9c1f44d..2034590eb789 100644
> --- a/tools/perf/util/parse-events.l
> +++ b/tools/perf/util/parse-events.l
> @@ -117,12 +117,12 @@ do {								\
>  	yyless(0);						\
>  } while (0)
>  
> -static int sym(yyscan_t scanner, int type, int config)
> +static int sym(yyscan_t scanner, int config)
>  {
>  	YYSTYPE *yylval = parse_events_get_lval(scanner);
>  
> -	yylval->num = (type << 16) + config;
> -	return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
> +	yylval->num = config;
> +	return PE_VALUE_SYM_HW;
>  }
>  
>  static int term(yyscan_t scanner, enum parse_events__term_type type)
> @@ -391,28 +391,16 @@ r0x{num_raw_hex}	{ return str(yyscanner, PE_RAW); }
>  <<EOF>>			{ BEGIN(INITIAL); }
>  }
>  
> -cpu-cycles|cycles				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
> -stalled-cycles-frontend|idle-cycles-frontend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
> -stalled-cycles-backend|idle-cycles-backend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
> -instructions					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
> -cache-references				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
> -cache-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
> -branch-instructions|branches			{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
> -branch-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
> -bus-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
> -ref-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
> -cpu-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
> -task-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
> -page-faults|faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
> -minor-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
> -major-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
> -context-switches|cs				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
> -cpu-migrations|migrations			{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
> -alignment-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
> -emulation-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
> -dummy						{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
> -bpf-output					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
> -cgroup-switches					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CGROUP_SWITCHES); }
> +cpu-cycles|cycles				{ return sym(yyscanner, PERF_COUNT_HW_CPU_CYCLES); }
> +stalled-cycles-frontend|idle-cycles-frontend	{ return sym(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
> +stalled-cycles-backend|idle-cycles-backend	{ return sym(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
> +instructions					{ return sym(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); }
> +cache-references				{ return sym(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); }
> +cache-misses					{ return sym(yyscanner, PERF_COUNT_HW_CACHE_MISSES); }
> +branch-instructions|branches			{ return sym(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
> +branch-misses					{ return sym(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); }
> +bus-cycles					{ return sym(yyscanner, PERF_COUNT_HW_BUS_CYCLES); }
> +ref-cycles					{ return sym(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); }
>  
>  {lc_type}			{ return str(yyscanner, PE_LEGACY_CACHE); }
>  {lc_type}-{lc_op_result}	{ return str(yyscanner, PE_LEGACY_CACHE); }
> diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
> index f888cbb076d6..a2361c0040d7 100644
> --- a/tools/perf/util/parse-events.y
> +++ b/tools/perf/util/parse-events.y
> @@ -55,7 +55,7 @@ static void free_list_evsel(struct list_head* list_evsel)
>  %}
>  
>  %token PE_START_EVENTS PE_START_TERMS
> -%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_TERM
> +%token PE_VALUE PE_VALUE_SYM_HW PE_TERM
>  %token PE_EVENT_NAME
>  %token PE_RAW PE_NAME
>  %token PE_MODIFIER_EVENT PE_MODIFIER_BP PE_BP_COLON PE_BP_SLASH
> @@ -66,10 +66,8 @@ static void free_list_evsel(struct list_head* list_evsel)
>  %token PE_TERM_HW
>  %type <num> PE_VALUE
>  %type <num> PE_VALUE_SYM_HW
> -%type <num> PE_VALUE_SYM_SW
>  %type <mod> PE_MODIFIER_EVENT
>  %type <term_type> PE_TERM
> -%type <num> value_sym
>  %type <str> PE_RAW
>  %type <str> PE_NAME
>  %type <str> PE_LEGACY_CACHE
> @@ -306,24 +304,19 @@ PE_NAME sep_dc
>  	$$ = list;
>  }
>  
> -value_sym:
> -PE_VALUE_SYM_HW
> -|
> -PE_VALUE_SYM_SW
> -
>  event_legacy_symbol:
> -value_sym '/' event_config '/'
> +PE_VALUE_SYM_HW '/' event_config '/'
>  {
>  	struct list_head *list;
> -	int type = $1 >> 16;
> -	int config = $1 & 255;
>  	int err;
> -	bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
>  
>  	list = alloc_list();
>  	if (!list)
>  		YYNOMEM;
> -	err = parse_events_add_numeric(_parse_state, list, type, config, $3, wildcard);
> +	err = parse_events_add_numeric(_parse_state, list,
> +				       PERF_TYPE_HARDWARE, $1,
> +				       $3,
> +				       /*wildcard=*/true);
>  	parse_events_terms__delete($3);
>  	if (err) {
>  		free_list_evsel(list);
> @@ -332,18 +325,18 @@ value_sym '/' event_config '/'
>  	$$ = list;
>  }
>  |
> -value_sym sep_slash_slash_dc
> +PE_VALUE_SYM_HW sep_slash_slash_dc
>  {
>  	struct list_head *list;
> -	int type = $1 >> 16;
> -	int config = $1 & 255;
> -	bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
>  	int err;
>  
>  	list = alloc_list();
>  	if (!list)
>  		YYNOMEM;
> -	err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard);
> +	err = parse_events_add_numeric(_parse_state, list,
> +				       PERF_TYPE_HARDWARE, $1,
> +				       /*head_config=*/NULL,
> +				       /*wildcard=*/true);
>  	if (err)
>  		PE_ABORT(err);
>  	$$ = list;
> diff --git a/tools/perf/util/print-events.c b/tools/perf/util/print-events.c
> index e233bacaa641..c1a8708b55ab 100644
> --- a/tools/perf/util/print-events.c
> +++ b/tools/perf/util/print-events.c
> @@ -521,8 +521,6 @@ void print_events(const struct print_callbacks *print_cb, void *print_state)
>  {
>  	print_symbol_events(print_cb, print_state, PERF_TYPE_HARDWARE,
>  			event_symbols_hw, PERF_COUNT_HW_MAX);
> -	print_symbol_events(print_cb, print_state, PERF_TYPE_SOFTWARE,
> -			event_symbols_sw, PERF_COUNT_SW_MAX);
>  
>  	print_hwcache_events(print_cb, print_state);
>  
> -- 
> 2.50.0.727.gbf7dc18ff4-goog
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ