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"
Unified · Split
| @@ -1549,7 +1549,7 @@ static int parse_events_add_pmu(struct parse_events_state *parse_state, · 1548 unmodified lines | ||
| 1549 | 1549 | } |
| 1550 | 1550 | |
| 1551 | 1551 | 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, | |
| 1553 | 1553 | const struct parse_events_terms *const_parsed_terms, |
| 1554 | 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 | 1557 | struct list_head *list = NULL; |
| 1558 | 1558 | struct perf_pmu *pmu = NULL; |
| 1559 | 1559 | YYLTYPE *loc = loc_; |
| 1560 | − int ok = 0, core_ok = 0; | |
| 1561 | − const char *tmp; | |
| 1560 | + int ok = 0; | |
| 1561 | + const char *config; | |
| 1562 | 1562 | struct parse_events_terms parsed_terms; |
| 1563 | 1563 | |
| 1564 | 1564 | *listp = NULL; |
| @@ -1571,15 +1571,15 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, · 6 unmodified lines | ||
| 1571 | 1571 | return ret; |
| 1572 | 1572 | } |
| 1573 | 1573 | |
| 1574 | − tmp = strdup(event_name); | |
| 1575 | − if (!tmp) | |
| 1574 | + config = strdup(event_name); | |
| 1575 | + if (!config) | |
| 1576 | 1576 | goto out_err; |
| 1577 | 1577 | |
| 1578 | 1578 | if (parse_events_term__num(&term, |
| 1579 | 1579 | PARSE_EVENTS__TERM_TYPE_USER, |
| 1580 | − tmp, /*num=*/1, /*novalue=*/true, | |
| 1580 | + config, /*num=*/1, /*novalue=*/true, | |
| 1581 | 1581 | loc, /*loc_val=*/NULL) < 0) { |
| 1582 | − zfree(&tmp); | |
| 1582 | + zfree(&config); | |
| 1583 | 1583 | goto out_err; |
| 1584 | 1584 | } |
| 1585 | 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 | 1610 | pr_debug("%s -> %s/%s/\n", event_name, pmu->name, sb.buf); |
| 1611 | 1611 | strbuf_release(&sb); |
| 1612 | 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 | − | |
| 1643 | 1629 | out_err: |
| 1644 | 1630 | parse_events_terms__exit(&parsed_terms); |
| 1645 | 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 | 1680 | /* Failure to add, assume event_or_pmu is an event name. */ |
| 1695 | 1681 | 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)) | |
| 1698 | 1683 | return 0; |
| 1699 | 1684 | |
| 1700 | 1685 | if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", event_or_pmu) < 0) |
| @@ -237,7 +237,7 @@ struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr, · 236 unmodified lines | ||
| 237 | 237 | struct perf_pmu *pmu); |
| 238 | 238 | |
| 239 | 239 | 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, | |
| 241 | 241 | const struct parse_events_terms *const_parsed_terms, |
| 242 | 242 | struct list_head **listp, void *loc); |
| 243 | 243 | |
| @@ -113,12 +113,12 @@ do { \ · 112 unmodified lines | ||
| 113 | 113 | yyless(0); \ |
| 114 | 114 | } while (0) |
| 115 | 115 | |
| 116 | −static int sym(yyscan_t scanner, int config) | |
| 116 | +static int sym(yyscan_t scanner, int type, int config) | |
| 117 | 117 | { |
| 118 | 118 | YYSTYPE *yylval = parse_events_get_lval(scanner); |
| 119 | 119 | |
| 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; | |
| 122 | 122 | } |
| 123 | 123 | |
| 124 | 124 | 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 | ||
| 137 | 137 | return PE_TERM; |
| 138 | 138 | } |
| 139 | 139 | |
| 140 | −static int hw(yyscan_t scanner, int config) | |
| 140 | +static int hw_term(yyscan_t scanner, int config) | |
| 141 | 141 | { |
| 142 | 142 | YYSTYPE *yylval = parse_events_get_lval(scanner); |
| 143 | 143 | char *text = parse_events_get_text(scanner); |
| 144 | 144 | |
| 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; | |
| 147 | 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 | ||
| 330 | 330 | aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); } |
| 331 | 331 | aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); } |
| 332 | 332 | 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); } | |
| 343 | 343 | r{num_raw_hex} { return str(yyscanner, PE_RAW); } |
| 344 | 344 | r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } |
| 345 | 345 | , { return ','; } |
| @@ -383,31 +383,31 @@ r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } · 37 unmodified lines | ||
| 383 | 383 | <<EOF>> { BEGIN(INITIAL); } |
| 384 | 384 | } |
| 385 | 385 | |
| 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); } | |
| 406 | 406 | duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); } |
| 407 | 407 | user_time { return tool(yyscanner, PERF_TOOL_USER_TIME); } |
| 408 | 408 | 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); } | |
| 411 | 411 | |
| 412 | 412 | {lc_type} { return str(yyscanner, PE_LEGACY_CACHE); } |
| 413 | 413 | {lc_type}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); } |
| @@ -55,7 +55,7 @@ static void free_list_evsel(struct list_head* list_evsel) · 54 unmodified lines | ||
| 55 | 55 | %} |
| 56 | 56 | |
| 57 | 57 | %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 | |
| 59 | 59 | %token PE_VALUE_SYM_TOOL |
| 60 | 60 | %token PE_EVENT_NAME |
| 61 | 61 | %token PE_RAW PE_NAME |
| @@ -66,10 +66,12 @@ static void free_list_evsel(struct list_head* list_evsel) · 4 unmodified lines | ||
| 66 | 66 | %token PE_DRV_CFG_TERM |
| 67 | 67 | %token PE_TERM_HW |
| 68 | 68 | %type <num> PE_VALUE |
| 69 | +%type <num> PE_VALUE_SYM_HW | |
| 69 | 70 | %type <num> PE_VALUE_SYM_SW |
| 70 | 71 | %type <num> PE_VALUE_SYM_TOOL |
| 71 | 72 | %type <mod> PE_MODIFIER_EVENT |
| 72 | 73 | %type <term_type> PE_TERM |
| 74 | +%type <num> value_sym | |
| 73 | 75 | %type <str> PE_RAW |
| 74 | 76 | %type <str> PE_NAME |
| 75 | 77 | %type <str> PE_LEGACY_CACHE |
| @@ -85,7 +87,6 @@ static void free_list_evsel(struct list_head* list_evsel) · 9 unmodified lines | ||
| 85 | 87 | %type <list_terms> opt_pmu_config |
| 86 | 88 | %destructor { parse_events_terms__delete ($$); } <list_terms> |
| 87 | 89 | %type <list_evsel> event_pmu |
| 88 | −%type <list_evsel> event_legacy_hardware | |
| 89 | 90 | %type <list_evsel> event_legacy_symbol |
| 90 | 91 | %type <list_evsel> event_legacy_cache |
| 91 | 92 | %type <list_evsel> event_legacy_mem |
| @@ -103,8 +104,8 @@ static void free_list_evsel(struct list_head* list_evsel) · 11 unmodified lines | ||
| 103 | 104 | %destructor { free_list_evsel ($$); } <list_evsel> |
| 104 | 105 | %type <tracepoint_name> tracepoint_name |
| 105 | 106 | %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> | |
| 108 | 109 | |
| 109 | 110 | %union |
| 110 | 111 | { |
| @@ -119,10 +120,10 @@ static void free_list_evsel(struct list_head* list_evsel) · 8 unmodified lines | ||
| 119 | 120 | char *sys; |
| 120 | 121 | char *event; |
| 121 | 122 | } tracepoint_name; |
| 122 | − struct hardware_event { | |
| 123 | + struct hardware_term { | |
| 123 | 124 | char *str; |
| 124 | 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 | ||
| 265 | 266 | event_def |
| 266 | 267 | |
| 267 | 268 | event_def: event_pmu | |
| 268 | − event_legacy_hardware | | |
| 269 | 269 | event_legacy_symbol | |
| 270 | 270 | event_legacy_cache sep_dc | |
| 271 | 271 | event_legacy_mem sep_dc | |
| @@ -292,7 +292,7 @@ PE_NAME sep_dc · 20 unmodified lines | ||
| 292 | 292 | struct list_head *list; |
| 293 | 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 | 296 | if (err < 0) { |
| 297 | 297 | struct parse_events_state *parse_state = _parse_state; |
| 298 | 298 | struct parse_events_error *error = parse_state->error; |
| @@ -308,45 +308,24 @@ PE_NAME sep_dc · 9 unmodified lines | ||
| 308 | 308 | $$ = list; |
| 309 | 309 | } |
| 310 | 310 | |
| 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 | |
| 325 | 313 | | |
| 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 | |
| 337 | 315 | |
| 338 | 316 | event_legacy_symbol: |
| 339 | −PE_VALUE_SYM_SW '/' event_config '/' | |
| 317 | +value_sym '/' event_config '/' | |
| 340 | 318 | { |
| 341 | 319 | struct list_head *list; |
| 320 | + int type = $1 >> 16; | |
| 321 | + int config = $1 & 255; | |
| 342 | 322 | int err; |
| 323 | + bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE); | |
| 343 | 324 | |
| 344 | 325 | list = alloc_list(); |
| 345 | 326 | if (!list) |
| 346 | 327 | 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); | |
| 350 | 329 | parse_events_terms__delete($3); |
| 351 | 330 | if (err) { |
| 352 | 331 | free_list_evsel(list); |
| @@ -355,17 +334,18 @@ PE_VALUE_SYM_SW '/' event_config '/' · 2 unmodified lines | ||
| 355 | 334 | $$ = list; |
| 356 | 335 | } |
| 357 | 336 | | |
| 358 | −PE_VALUE_SYM_SW sep_slash_slash_dc | |
| 337 | +value_sym sep_slash_slash_dc | |
| 359 | 338 | { |
| 360 | 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 | 343 | int err; |
| 362 | 344 | |
| 363 | 345 | list = alloc_list(); |
| 364 | 346 | if (!list) |
| 365 | 347 | 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); | |
| 369 | 349 | if (err) |
| 370 | 350 | PE_ABORT(err); |
| 371 | 351 | $$ = list; |