Skip to content

Commit 4f1b067

Browse files
committed
Revert "perf parse-events: Prefer sysfs/JSON hardware events over legacy"
This reverts commit 617824a. This made a simple 'perf record -e cycles:pp make -j199' stop working on the Ampere ARM64 system Linus uses to test ARM64 kernels, as discussed at length in the threads in the Link tags below. The fix provided by Ian wasn't acceptable and work to fix this will take time we don't have at this point, so lets revert this and work on it on the next devel cycle. Reported-by: Linus Torvalds <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Bhaskar Chowdhury <[email protected]> Cc: Ethan Adams <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: James Clark <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Kan Liang <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Thomas Richter <[email protected]> Cc: Tycho Andersen <[email protected]> Cc: Yang Jihong <[email protected]> Link: https://lore.kernel.org/lkml/CAHk-=wi5Ri=yR2jBVk-4HzTzpoAWOgstr1LEvg_-OXtJvXXJOA@mail.gmail.com Link: https://lore.kernel.org/lkml/CAHk-=wiWvtFyedDNpoV7a8Fq_FpbB+F5KmWK2xPY3QoYseOf_A@mail.gmail.com Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 29c73fc commit 4f1b067

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)