Skip to content

Commit 6fbf718

Browse files
committed
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"
2 parents c133204 + 4f1b067 commit 6fbf718

File tree

4 files changed

+68
-103
lines changed

4 files changed

+68
-103
lines changed

tools/perf/util/parse-events.c

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,16 +1549,16 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state,
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
{
15561556
struct parse_events_term *term;
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,
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,
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,
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
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
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

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,12 @@ do { \
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)
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); }
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); }
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

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static void free_list_evsel(struct list_head* list_evsel)
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)
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)
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)
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)
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
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
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
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 '/'
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;

0 commit comments

Comments
 (0)