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
1549}1549}
1550 1550
1551int parse_events_multi_pmu_add(struct parse_events_state *parse_state,1551int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
1552 const char *event_name, u64 hw_config,1552 const char *event_name,
1553 const struct parse_events_terms *const_parsed_terms,1553 const struct parse_events_terms *const_parsed_terms,
1554 struct list_head **listp, void *loc_)1554 struct list_head **listp, void *loc_)
1555{1555{
@@ -1557,8 +1557,8 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 1 unmodified line
1557 struct list_head *list = NULL;1557 struct list_head *list = NULL;
1558 struct perf_pmu *pmu = NULL;1558 struct perf_pmu *pmu = NULL;
1559 YYLTYPE *loc = loc_;1559 YYLTYPE *loc = loc_;
1560 int ok = 0, core_ok = 0;1560 int ok = 0;
1561 const char *tmp;1561 const char *config;
1562 struct parse_events_terms parsed_terms;1562 struct parse_events_terms parsed_terms;
1563 1563
1564 *listp = NULL;1564 *listp = NULL;
@@ -1571,15 +1571,15 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 6 unmodified lines
1571 return ret;1571 return ret;
1572 }1572 }
1573 1573
1574 tmp = strdup(event_name);1574 config = strdup(event_name);
1575 if (!tmp)1575 if (!config)
1576 goto out_err;1576 goto out_err;
1577 1577
1578 if (parse_events_term__num(&term,1578 if (parse_events_term__num(&term,
1579 PARSE_EVENTS__TERM_TYPE_USER,1579 PARSE_EVENTS__TERM_TYPE_USER,
1580 tmp, /*num=*/1, /*novalue=*/true,1580 config, /*num=*/1, /*novalue=*/true,
1581 loc, /*loc_val=*/NULL) < 0) {1581 loc, /*loc_val=*/NULL) < 0) {
1582 zfree(&tmp);1582 zfree(&config);
1583 goto out_err;1583 goto out_err;
1584 }1584 }
1585 list_add_tail(&term->list, &parsed_terms.terms);1585 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
1610 pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf);1610 pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf);
1611 strbuf_release(&sb);1611 strbuf_release(&sb);
1612 ok++;1612 ok++;
1613 if (pmu->is_core)
1614 core_ok++;
1615 }1613 }
1616 }1614 }
1617 1615
@@ -1628,18 +1626,6 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 10 unmodified lines
1628 }1626 }
1629 }1627 }
1630 1628
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
1643out_err:1629out_err:
1644 parse_events_terms__exit(&parsed_terms);1630 parse_events_terms__exit(&parsed_terms);
1645 if (ok)1631 if (ok)
@@ -1693,8 +1679,7 @@ int parse_events_multi_pmu_add_or_add_pmu(struct parse_events_state *parse_state · 47 unmodified lines
1693 1679
1694 /* Failure to add, assume event_or_pmu is an event name. */1680 /* Failure to add, assume event_or_pmu is an event name. */
1695 zfree(listp);1681 zfree(listp);
1696 if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, PERF_COUNT_HW_MAX,1682 if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, const_parsed_terms, listp, loc))
1697 const_parsed_terms, listp, loc))
1698 return 0;1683 return 0;
1699 1684
1700 if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", event_or_pmu) < 0)1685 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
237 struct perf_pmu *pmu);237 struct perf_pmu *pmu);
238 238
239int parse_events_multi_pmu_add(struct parse_events_state *parse_state,239int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
240 const char *event_name, u64 hw_config,240 const char *event_name,
241 const struct parse_events_terms *const_parsed_terms,241 const struct parse_events_terms *const_parsed_terms,
242 struct list_head **listp, void *loc);242 struct list_head **listp, void *loc);
243 243
tools/perf/util/parse-events.l+38−38
@@ -113,12 +113,12 @@ do { \ · 112 unmodified lines
113 yyless(0); \113 yyless(0); \
114} while (0)114} while (0)
115 115
116static int sym(yyscan_t scanner, int config)116static int sym(yyscan_t scanner, int type, int config)
117{117{
118 YYSTYPE *yylval = parse_events_get_lval(scanner);118 YYSTYPE *yylval = parse_events_get_lval(scanner);
119 119
120 yylval->num = config;120 yylval->num = (type << 16) + config;
121 return PE_VALUE_SYM_SW;121 return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
122}122}
123 123
124static int tool(yyscan_t scanner, enum perf_tool_event event)124static 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
137 return PE_TERM;137 return PE_TERM;
138}138}
139 139
140static int hw(yyscan_t scanner, int config)140static int hw_term(yyscan_t scanner, int config)
141{141{
142 YYSTYPE *yylval = parse_events_get_lval(scanner);142 YYSTYPE *yylval = parse_events_get_lval(scanner);
143 char *text = parse_events_get_text(scanner);143 char *text = parse_events_get_text(scanner);
144 144
145 yylval->hardware_event.str = strdup(text);145 yylval->hardware_term.str = strdup(text);
146 yylval->hardware_event.num = config;146 yylval->hardware_term.num = PERF_TYPE_HARDWARE + config;
147 return PE_TERM_HW;147 return PE_TERM_HW;
148}148}
149 149
@@ -330,16 +330,16 @@ percore { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); } · 180 unmodified lines
330aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); }330aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); }
331aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); }331aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); }
332metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); }332metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); }
333cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); }333cpu-cycles|cycles { return hw_term(yyscanner, PERF_COUNT_HW_CPU_CYCLES); }
334stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }334stalled-cycles-frontend|idle-cycles-frontend { return hw_term(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
335stalled-cycles-backend|idle-cycles-backend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }335stalled-cycles-backend|idle-cycles-backend { return hw_term(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
336instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); }336instructions { return hw_term(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); }
337cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); }337cache-references { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); }
338cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); }338cache-misses { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_MISSES); }
339branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }339branch-instructions|branches { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
340branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); }340branch-misses { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); }
341bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); }341bus-cycles { return hw_term(yyscanner, PERF_COUNT_HW_BUS_CYCLES); }
342ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); }342ref-cycles { return hw_term(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); }
343r{num_raw_hex} { return str(yyscanner, PE_RAW); }343r{num_raw_hex} { return str(yyscanner, PE_RAW); }
344r0x{num_raw_hex} { return str(yyscanner, PE_RAW); }344r0x{num_raw_hex} { return str(yyscanner, PE_RAW); }
345, { return ','; }345, { return ','; }
@@ -383,31 +383,31 @@ r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } · 37 unmodified lines
383<<EOF>> { BEGIN(INITIAL); }383<<EOF>> { BEGIN(INITIAL); }
384}384}
385 385
386cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); }386cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
387stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }387stalled-cycles-frontend|idle-cycles-frontend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
388stalled-cycles-backend|idle-cycles-backend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }388stalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
389instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); }389instructions { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
390cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); }390cache-references { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
391cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); }391cache-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
392branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }392branch-instructions|branches { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
393branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); }393branch-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
394bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); }394bus-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
395ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); }395ref-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
396cpu-clock { return sym(yyscanner, PERF_COUNT_SW_CPU_CLOCK); }396cpu-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
397task-clock { return sym(yyscanner, PERF_COUNT_SW_TASK_CLOCK); }397task-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
398page-faults|faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS); }398page-faults|faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
399minor-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MIN); }399minor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
400major-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }400major-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
401context-switches|cs { return sym(yyscanner, PERF_COUNT_SW_CONTEXT_SWITCHES); }401context-switches|cs { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
402cpu-migrations|migrations { return sym(yyscanner, PERF_COUNT_SW_CPU_MIGRATIONS); }402cpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
403alignment-faults { return sym(yyscanner, PERF_COUNT_SW_ALIGNMENT_FAULTS); }403alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
404emulation-faults { return sym(yyscanner, PERF_COUNT_SW_EMULATION_FAULTS); }404emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
405dummy { return sym(yyscanner, PERF_COUNT_SW_DUMMY); }405dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
406duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); }406duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); }
407user_time { return tool(yyscanner, PERF_TOOL_USER_TIME); }407user_time { return tool(yyscanner, PERF_TOOL_USER_TIME); }
408system_time { return tool(yyscanner, PERF_TOOL_SYSTEM_TIME); }408system_time { return tool(yyscanner, PERF_TOOL_SYSTEM_TIME); }
409bpf-output { return sym(yyscanner, PERF_COUNT_SW_BPF_OUTPUT); }409bpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
410cgroup-switches { return sym(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES); }410cgroup-switches { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CGROUP_SWITCHES); }
411 411
412{lc_type} { return str(yyscanner, PE_LEGACY_CACHE); }412{lc_type} { return str(yyscanner, PE_LEGACY_CACHE); }
413{lc_type}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); }413{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
55%}55%}
56 56
57%token PE_START_EVENTS PE_START_TERMS57%token PE_START_EVENTS PE_START_TERMS
58%token PE_VALUE PE_VALUE_SYM_SW PE_TERM58%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_TERM
59%token PE_VALUE_SYM_TOOL59%token PE_VALUE_SYM_TOOL
60%token PE_EVENT_NAME60%token PE_EVENT_NAME
61%token PE_RAW PE_NAME61%token PE_RAW PE_NAME
@@ -66,10 +66,12 @@ static void free_list_evsel(struct list_head* list_evsel) · 4 unmodified lines
66%token PE_DRV_CFG_TERM66%token PE_DRV_CFG_TERM
67%token PE_TERM_HW67%token PE_TERM_HW
68%type <num> PE_VALUE68%type <num> PE_VALUE
69%type <num> PE_VALUE_SYM_HW
69%type <num> PE_VALUE_SYM_SW70%type <num> PE_VALUE_SYM_SW
70%type <num> PE_VALUE_SYM_TOOL71%type <num> PE_VALUE_SYM_TOOL
71%type <mod> PE_MODIFIER_EVENT72%type <mod> PE_MODIFIER_EVENT
72%type <term_type> PE_TERM73%type <term_type> PE_TERM
74%type <num> value_sym
73%type <str> PE_RAW75%type <str> PE_RAW
74%type <str> PE_NAME76%type <str> PE_NAME
75%type <str> PE_LEGACY_CACHE77%type <str> PE_LEGACY_CACHE
@@ -85,7 +87,6 @@ static void free_list_evsel(struct list_head* list_evsel) · 9 unmodified lines
85%type <list_terms> opt_pmu_config87%type <list_terms> opt_pmu_config
86%destructor { parse_events_terms__delete ($$); } <list_terms>88%destructor { parse_events_terms__delete ($$); } <list_terms>
87%type <list_evsel> event_pmu89%type <list_evsel> event_pmu
88%type <list_evsel> event_legacy_hardware
89%type <list_evsel> event_legacy_symbol90%type <list_evsel> event_legacy_symbol
90%type <list_evsel> event_legacy_cache91%type <list_evsel> event_legacy_cache
91%type <list_evsel> event_legacy_mem92%type <list_evsel> event_legacy_mem
@@ -103,8 +104,8 @@ static void free_list_evsel(struct list_head* list_evsel) · 11 unmodified lines
103%destructor { free_list_evsel ($$); } <list_evsel>104%destructor { free_list_evsel ($$); } <list_evsel>
104%type <tracepoint_name> tracepoint_name105%type <tracepoint_name> tracepoint_name
105%destructor { free ($$.sys); free ($$.event); } <tracepoint_name>106%destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
106%type <hardware_event> PE_TERM_HW107%type <hardware_term> PE_TERM_HW
107%destructor { free ($$.str); } <hardware_event>108%destructor { free ($$.str); } <hardware_term>
108 109
109%union110%union
110{111{
@@ -119,10 +120,10 @@ static void free_list_evsel(struct list_head* list_evsel) · 8 unmodified lines
119 char *sys;120 char *sys;
120 char *event;121 char *event;
121 } tracepoint_name;122 } tracepoint_name;
122 struct hardware_event {123 struct hardware_term {
123 char *str;124 char *str;
124 u64 num;125 u64 num;
125 } hardware_event;126 } hardware_term;
126}127}
127%%128%%
128 129
@@ -265,7 +266,6 @@ PE_EVENT_NAME event_def · 136 unmodified lines
265event_def266event_def
266 267
267event_def: event_pmu |268event_def: event_pmu |
268 event_legacy_hardware |
269 event_legacy_symbol |269 event_legacy_symbol |
270 event_legacy_cache sep_dc |270 event_legacy_cache sep_dc |
271 event_legacy_mem sep_dc |271 event_legacy_mem sep_dc |
@@ -292,7 +292,7 @@ PE_NAME sep_dc · 20 unmodified lines
292 struct list_head *list;292 struct list_head *list;
293 int err;293 int err;
294 294
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);
296 if (err < 0) {296 if (err < 0) {
297 struct parse_events_state *parse_state = _parse_state;297 struct parse_events_state *parse_state = _parse_state;
298 struct parse_events_error *error = parse_state->error;298 struct parse_events_error *error = parse_state->error;
@@ -308,45 +308,24 @@ PE_NAME sep_dc · 9 unmodified lines
308 $$ = list;308 $$ = list;
309}309}
310 310
311event_legacy_hardware:311value_sym:
312PE_TERM_HW opt_pmu_config312PE_VALUE_SYM_HW
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}
325|313|
326PE_TERM_HW sep_dc314PE_VALUE_SYM_SW
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}
337 315
338event_legacy_symbol:316event_legacy_symbol:
339PE_VALUE_SYM_SW '/' event_config '/'317value_sym '/' event_config '/'
340{318{
341 struct list_head *list;319 struct list_head *list;
320 int type = $1 >> 16;
321 int config = $1 & 255;
342 int err;322 int err;
323 bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
343 324
344 list = alloc_list();325 list = alloc_list();
345 if (!list)326 if (!list)
346 YYNOMEM;327 YYNOMEM;
347 err = parse_events_add_numeric(_parse_state, list,328 err = parse_events_add_numeric(_parse_state, list, type, config, $3, wildcard);
348 /*type=*/PERF_TYPE_SOFTWARE, /*config=*/$1,
349 $3, /*wildcard=*/false);
350 parse_events_terms__delete($3);329 parse_events_terms__delete($3);
351 if (err) {330 if (err) {
352 free_list_evsel(list);331 free_list_evsel(list);
@@ -355,17 +334,18 @@ PE_VALUE_SYM_SW '/' event_config '/' · 2 unmodified lines
355 $$ = list;334 $$ = list;
356}335}
357|336|
358PE_VALUE_SYM_SW sep_slash_slash_dc337value_sym sep_slash_slash_dc
359{338{
360 struct list_head *list;339 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);
361 int err;343 int err;
362 344
363 list = alloc_list();345 list = alloc_list();
364 if (!list)346 if (!list)
365 YYNOMEM;347 YYNOMEM;
366 err = parse_events_add_numeric(_parse_state, list,348 err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard);
367 /*type=*/PERF_TYPE_SOFTWARE, /*config=*/$1,
368 /*head_config=*/NULL, /*wildcard=*/false);
369 if (err)349 if (err)
370 PE_ABORT(err);350 PE_ABORT(err);
371 $$ = list;351 $$ = list;