History

Merge tag 'perf-tools-fixes-for-v6.10-1-2024-05-26' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools

Pull perf tool fix from Arnaldo Carvalho de Melo: "Revert a patch causing a regression. This made a simple 'perf record -e cycles:pp make -j199' stop working on the Ampere ARM64 system Linus uses to test ARM64 kernels". * tag 'perf-tools-fixes-for-v6.10-1-2024-05-26' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: Revert "perf parse-events: Prefer sysfs/JSON hardware events over legacy"

Linus Torvalds committed 2 years ago

Commit 6fbf7182 parents c133204 4f1b0674 files · +68 −103Browse files

Unified · Split

4 files
  1. tools/perf/util/parse-events.c +8 −23
  2. tools/perf/util/parse-events.h +1 −1
  3. tools/perf/util/parse-events.l +38 −38
  4. tools/perf/util/parse-events.y +21 −41
tools/perf/util/parse-events.c+8−23
@@ -1549,7 +1549,7 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state, · 1548 unmodified lines
15491549 }
15501550
15511551 int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
1552− const char *event_name, u64 hw_config,
1552+ const char *event_name,
15531553 const struct parse_events_terms *const_parsed_terms,
15541554 struct list_head **listp, void *loc_)
15551555 {
@@ -1557,8 +1557,8 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 1 unmodified line
15571557 struct list_head *list = NULL;
15581558 struct perf_pmu *pmu = NULL;
15591559 YYLTYPE *loc = loc_;
1560− int ok = 0, core_ok = 0;
1561− const char *tmp;
1560+ int ok = 0;
1561+ const char *config;
15621562 struct parse_events_terms parsed_terms;
15631563
15641564 *listp = NULL;
@@ -1571,15 +1571,15 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 6 unmodified lines
15711571 return ret;
15721572 }
15731573
1574− tmp = strdup(event_name);
1575− if (!tmp)
1574+ config = strdup(event_name);
1575+ if (!config)
15761576 goto out_err;
15771577
15781578 if (parse_events_term__num(&term,
15791579 PARSE_EVENTS__TERM_TYPE_USER,
1580− tmp, /*num=*/1, /*novalue=*/true,
1580+ config, /*num=*/1, /*novalue=*/true,
15811581 loc, /*loc_val=*/NULL) < 0) {
1582− zfree(&tmp);
1582+ zfree(&config);
15831583 goto out_err;
15841584 }
15851585 list_add_tail(&term->list, &parsed_terms.terms);
@@ -1610,8 +1610,6 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 24 unmodified lines
16101610 pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf);
16111611 strbuf_release(&sb);
16121612 ok++;
1613− if (pmu->is_core)
1614− core_ok++;
16151613 }
16161614 }
16171615
@@ -1628,18 +1626,6 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 10 unmodified lines
16281626 }
16291627 }
16301628
1631− if (hw_config != PERF_COUNT_HW_MAX && !core_ok) {
1632− /*
1633− * The event wasn't found on core PMUs but it has a hardware
1634− * config version to try.
1635− */
1636− if (!parse_events_add_numeric(parse_state, list,
1637− PERF_TYPE_HARDWARE, hw_config,
1638− const_parsed_terms,
1639− /*wildcard=*/true))
1640− ok++;
1641− }
1642−
16431629 out_err:
16441630 parse_events_terms__exit(&parsed_terms);
16451631 if (ok)
@@ -1693,8 +1679,7 @@ int parse_events_multi_pmu_add_or_add_pmu(struct parse_events_state *parse_state · 47 unmodified lines
16931679
16941680 /* Failure to add, assume event_or_pmu is an event name. */
16951681 zfree(listp);
1696− if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, PERF_COUNT_HW_MAX,
1697− const_parsed_terms, listp, loc))
1682+ if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, const_parsed_terms, listp, loc))
16981683 return 0;
16991684
17001685 if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", event_or_pmu) < 0)
tools/perf/util/parse-events.h+1−1
@@ -237,7 +237,7 @@ struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr, · 236 unmodified lines
237237 struct perf_pmu *pmu);
238238
239239 int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
240− const char *event_name, u64 hw_config,
240+ const char *event_name,
241241 const struct parse_events_terms *const_parsed_terms,
242242 struct list_head **listp, void *loc);
243243
tools/perf/util/parse-events.l+38−38
@@ -113,12 +113,12 @@ do { \ · 112 unmodified lines
113113 yyless(0); \
114114 } while (0)
115115
116−static int sym(yyscan_t scanner, int config)
116+static int sym(yyscan_t scanner, int type, int config)
117117 {
118118 YYSTYPE *yylval = parse_events_get_lval(scanner);
119119
120− yylval->num = config;
121− return PE_VALUE_SYM_SW;
120+ yylval->num = (type << 16) + config;
121+ return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
122122 }
123123
124124 static int tool(yyscan_t scanner, enum perf_tool_event event)
@@ -137,13 +137,13 @@ static int term(yyscan_t scanner, enum parse_events__term_type type) · 12 unmodified lines
137137 return PE_TERM;
138138 }
139139
140−static int hw(yyscan_t scanner, int config)
140+static int hw_term(yyscan_t scanner, int config)
141141 {
142142 YYSTYPE *yylval = parse_events_get_lval(scanner);
143143 char *text = parse_events_get_text(scanner);
144144
145− yylval->hardware_event.str = strdup(text);
146− yylval->hardware_event.num = config;
145+ yylval->hardware_term.str = strdup(text);
146+ yylval->hardware_term.num = PERF_TYPE_HARDWARE + config;
147147 return PE_TERM_HW;
148148 }
149149
@@ -330,16 +330,16 @@ percore { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); } · 180 unmodified lines
330330 aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); }
331331 aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); }
332332 metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); }
333−cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); }
334−stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
335−stalled-cycles-backend|idle-cycles-backend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
336−instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); }
337−cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); }
338−cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); }
339−branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
340−branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); }
341−bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); }
342−ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); }
333+cpu-cycles|cycles { return hw_term(yyscanner, PERF_COUNT_HW_CPU_CYCLES); }
334+stalled-cycles-frontend|idle-cycles-frontend { return hw_term(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
335+stalled-cycles-backend|idle-cycles-backend { return hw_term(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
336+instructions { return hw_term(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); }
337+cache-references { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); }
338+cache-misses { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_MISSES); }
339+branch-instructions|branches { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
340+branch-misses { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); }
341+bus-cycles { return hw_term(yyscanner, PERF_COUNT_HW_BUS_CYCLES); }
342+ref-cycles { return hw_term(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); }
343343 r{num_raw_hex} { return str(yyscanner, PE_RAW); }
344344 r0x{num_raw_hex} { return str(yyscanner, PE_RAW); }
345345 , { return ','; }
@@ -383,31 +383,31 @@ r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } · 37 unmodified lines
383383 <<EOF>> { BEGIN(INITIAL); }
384384 }
385385
386−cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); }
387−stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
388−stalled-cycles-backend|idle-cycles-backend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
389−instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); }
390−cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); }
391−cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); }
392−branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
393−branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); }
394−bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); }
395−ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); }
396−cpu-clock { return sym(yyscanner, PERF_COUNT_SW_CPU_CLOCK); }
397−task-clock { return sym(yyscanner, PERF_COUNT_SW_TASK_CLOCK); }
398−page-faults|faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS); }
399−minor-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
400−major-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
401−context-switches|cs { return sym(yyscanner, PERF_COUNT_SW_CONTEXT_SWITCHES); }
402−cpu-migrations|migrations { return sym(yyscanner, PERF_COUNT_SW_CPU_MIGRATIONS); }
403−alignment-faults { return sym(yyscanner, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
404−emulation-faults { return sym(yyscanner, PERF_COUNT_SW_EMULATION_FAULTS); }
405−dummy { return sym(yyscanner, PERF_COUNT_SW_DUMMY); }
386+cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
387+stalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
388+stalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
389+instructions { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
390+cache-references { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
391+cache-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
392+branch-instructions|branches { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
393+branch-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
394+bus-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
395+ref-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
396+cpu-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
397+task-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
398+page-faults|faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
399+minor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
400+major-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
401+context-switches|cs { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
402+cpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
403+alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
404+emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
405+dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
406406 duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); }
407407 user_time { return tool(yyscanner, PERF_TOOL_USER_TIME); }
408408 system_time { return tool(yyscanner, PERF_TOOL_SYSTEM_TIME); }
409−bpf-output { return sym(yyscanner, PERF_COUNT_SW_BPF_OUTPUT); }
410−cgroup-switches { return sym(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES); }
409+bpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
410+cgroup-switches { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CGROUP_SWITCHES); }
411411
412412 {lc_type} { return str(yyscanner, PE_LEGACY_CACHE); }
413413 {lc_type}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); }
tools/perf/util/parse-events.y+21−41
@@ -55,7 +55,7 @@ static void free_list_evsel(struct list_head* list_evsel) · 54 unmodified lines
5555 %}
5656
5757 %token PE_START_EVENTS PE_START_TERMS
58−%token PE_VALUE PE_VALUE_SYM_SW PE_TERM
58+%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_TERM
5959 %token PE_VALUE_SYM_TOOL
6060 %token PE_EVENT_NAME
6161 %token PE_RAW PE_NAME
@@ -66,10 +66,12 @@ static void free_list_evsel(struct list_head* list_evsel) · 4 unmodified lines
6666 %token PE_DRV_CFG_TERM
6767 %token PE_TERM_HW
6868 %type <num> PE_VALUE
69+%type <num> PE_VALUE_SYM_HW
6970 %type <num> PE_VALUE_SYM_SW
7071 %type <num> PE_VALUE_SYM_TOOL
7172 %type <mod> PE_MODIFIER_EVENT
7273 %type <term_type> PE_TERM
74+%type <num> value_sym
7375 %type <str> PE_RAW
7476 %type <str> PE_NAME
7577 %type <str> PE_LEGACY_CACHE
@@ -85,7 +87,6 @@ static void free_list_evsel(struct list_head* list_evsel) · 9 unmodified lines
8587 %type <list_terms> opt_pmu_config
8688 %destructor { parse_events_terms__delete ($$); } <list_terms>
8789 %type <list_evsel> event_pmu
88−%type <list_evsel> event_legacy_hardware
8990 %type <list_evsel> event_legacy_symbol
9091 %type <list_evsel> event_legacy_cache
9192 %type <list_evsel> event_legacy_mem
@@ -103,8 +104,8 @@ static void free_list_evsel(struct list_head* list_evsel) · 11 unmodified lines
103104 %destructor { free_list_evsel ($$); } <list_evsel>
104105 %type <tracepoint_name> tracepoint_name
105106 %destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
106−%type <hardware_event> PE_TERM_HW
107−%destructor { free ($$.str); } <hardware_event>
107+%type <hardware_term> PE_TERM_HW
108+%destructor { free ($$.str); } <hardware_term>
108109
109110 %union
110111 {
@@ -119,10 +120,10 @@ static void free_list_evsel(struct list_head* list_evsel) · 8 unmodified lines
119120 char *sys;
120121 char *event;
121122 } tracepoint_name;
122− struct hardware_event {
123+ struct hardware_term {
123124 char *str;
124125 u64 num;
125− } hardware_event;
126+ } hardware_term;
126127 }
127128 %%
128129
@@ -265,7 +266,6 @@ PE_EVENT_NAME event_def · 136 unmodified lines
265266 event_def
266267
267268 event_def: event_pmu |
268− event_legacy_hardware |
269269 event_legacy_symbol |
270270 event_legacy_cache sep_dc |
271271 event_legacy_mem sep_dc |
@@ -292,7 +292,7 @@ PE_NAME sep_dc · 20 unmodified lines
292292 struct list_head *list;
293293 int err;
294294
295− err = parse_events_multi_pmu_add(_parse_state, $1, PERF_COUNT_HW_MAX, NULL, &list, &@1);
295+ err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list, &@1);
296296 if (err < 0) {
297297 struct parse_events_state *parse_state = _parse_state;
298298 struct parse_events_error *error = parse_state->error;
@@ -308,45 +308,24 @@ PE_NAME sep_dc · 9 unmodified lines
308308 $$ = list;
309309 }
310310
311−event_legacy_hardware:
312−PE_TERM_HW opt_pmu_config
313−{
314− /* List of created evsels. */
315− struct list_head *list = NULL;
316− int err = parse_events_multi_pmu_add(_parse_state, $1.str, $1.num, $2, &list, &@1);
317−
318− free($1.str);
319− parse_events_terms__delete($2);
320− if (err)
321− PE_ABORT(err);
322−
323− $$ = list;
324−}
311+value_sym:
312+PE_VALUE_SYM_HW
325313 |
326−PE_TERM_HW sep_dc
327−{
328− struct list_head *list;
329− int err;
330−
331− err = parse_events_multi_pmu_add(_parse_state, $1.str, $1.num, NULL, &list, &@1);
332− free($1.str);
333− if (err)
334− PE_ABORT(err);
335− $$ = list;
336−}
314+PE_VALUE_SYM_SW
337315
338316 event_legacy_symbol:
339−PE_VALUE_SYM_SW '/' event_config '/'
317+value_sym '/' event_config '/'
340318 {
341319 struct list_head *list;
320+ int type = $1 >> 16;
321+ int config = $1 & 255;
342322 int err;
323+ bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
343324
344325 list = alloc_list();
345326 if (!list)
346327 YYNOMEM;
347− err = parse_events_add_numeric(_parse_state, list,
348− /*type=*/PERF_TYPE_SOFTWARE, /*config=*/$1,
349− $3, /*wildcard=*/false);
328+ err = parse_events_add_numeric(_parse_state, list, type, config, $3, wildcard);
350329 parse_events_terms__delete($3);
351330 if (err) {
352331 free_list_evsel(list);
@@ -355,17 +334,18 @@ PE_VALUE_SYM_SW '/' event_config '/' · 2 unmodified lines
355334 $$ = list;
356335 }
357336 |
358−PE_VALUE_SYM_SW sep_slash_slash_dc
337+value_sym sep_slash_slash_dc
359338 {
360339 struct list_head *list;
340+ int type = $1 >> 16;
341+ int config = $1 & 255;
342+ bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
361343 int err;
362344
363345 list = alloc_list();
364346 if (!list)
365347 YYNOMEM;
366− err = parse_events_add_numeric(_parse_state, list,
367− /*type=*/PERF_TYPE_SOFTWARE, /*config=*/$1,
368− /*head_config=*/NULL, /*wildcard=*/false);
348+ err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard);
369349 if (err)
370350 PE_ABORT(err);
371351 $$ = list;