[<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