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 | int parse_events_multi_pmu_add(struct parse_events_state *parse_state, | 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 | 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 | |||
| 1643 | out_err: | 1629 | out_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) |
| @@ -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 | ||
| 239 | int parse_events_multi_pmu_add(struct parse_events_state *parse_state, | 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 | 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 | ||
| @@ -113,12 +113,12 @@ do { \ · 112 unmodified lines | |||
| 113 | yyless(0); \ | 113 | yyless(0); \ |
| 114 | } while (0) | 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 | 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 | ||
| 124 | static int tool(yyscan_t scanner, enum perf_tool_event event) | 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 | return PE_TERM; | 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 | 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 | |||
| 330 | aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); } | 330 | aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); } |
| 331 | aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); } | 331 | aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); } |
| 332 | metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); } | 332 | metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); } |
| 333 | cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); } | 333 | cpu-cycles|cycles { return hw_term(yyscanner, PERF_COUNT_HW_CPU_CYCLES); } |
| 334 | stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } | 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(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } | 335 | stalled-cycles-backend|idle-cycles-backend { return hw_term(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } |
| 336 | instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); } | 336 | instructions { return hw_term(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); } |
| 337 | cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); } | 337 | cache-references { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); } |
| 338 | cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); } | 338 | cache-misses { return hw_term(yyscanner, PERF_COUNT_HW_CACHE_MISSES); } |
| 339 | branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } | 339 | branch-instructions|branches { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } |
| 340 | branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } | 340 | branch-misses { return hw_term(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } |
| 341 | bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } | 341 | bus-cycles { return hw_term(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } |
| 342 | ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } | 342 | ref-cycles { return hw_term(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } |
| 343 | r{num_raw_hex} { return str(yyscanner, PE_RAW); } | 343 | r{num_raw_hex} { return str(yyscanner, PE_RAW); } |
| 344 | r0x{num_raw_hex} { return str(yyscanner, PE_RAW); } | 344 | r0x{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 | ||
| 386 | cpu-cycles|cycles { return hw(yyscanner, PERF_COUNT_HW_CPU_CYCLES); } | 386 | cpu-cycles|cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } |
| 387 | stalled-cycles-frontend|idle-cycles-frontend { return hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } | 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 hw(yyscanner, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } | 388 | stalled-cycles-backend|idle-cycles-backend { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } |
| 389 | instructions { return hw(yyscanner, PERF_COUNT_HW_INSTRUCTIONS); } | 389 | instructions { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); } |
| 390 | cache-references { return hw(yyscanner, PERF_COUNT_HW_CACHE_REFERENCES); } | 390 | cache-references { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); } |
| 391 | cache-misses { return hw(yyscanner, PERF_COUNT_HW_CACHE_MISSES); } | 391 | cache-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); } |
| 392 | branch-instructions|branches { return hw(yyscanner, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } | 392 | branch-instructions|branches { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } |
| 393 | branch-misses { return hw(yyscanner, PERF_COUNT_HW_BRANCH_MISSES); } | 393 | branch-misses { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); } |
| 394 | bus-cycles { return hw(yyscanner, PERF_COUNT_HW_BUS_CYCLES); } | 394 | bus-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); } |
| 395 | ref-cycles { return hw(yyscanner, PERF_COUNT_HW_REF_CPU_CYCLES); } | 395 | ref-cycles { return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); } |
| 396 | cpu-clock { return sym(yyscanner, PERF_COUNT_SW_CPU_CLOCK); } | 396 | cpu-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); } |
| 397 | task-clock { return sym(yyscanner, PERF_COUNT_SW_TASK_CLOCK); } | 397 | task-clock { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); } |
| 398 | page-faults|faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS); } | 398 | page-faults|faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); } |
| 399 | minor-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MIN); } | 399 | minor-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); } |
| 400 | major-faults { return sym(yyscanner, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } | 400 | major-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } |
| 401 | context-switches|cs { return sym(yyscanner, PERF_COUNT_SW_CONTEXT_SWITCHES); } | 401 | context-switches|cs { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); } |
| 402 | cpu-migrations|migrations { return sym(yyscanner, PERF_COUNT_SW_CPU_MIGRATIONS); } | 402 | cpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); } |
| 403 | alignment-faults { return sym(yyscanner, PERF_COUNT_SW_ALIGNMENT_FAULTS); } | 403 | alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); } |
| 404 | emulation-faults { return sym(yyscanner, PERF_COUNT_SW_EMULATION_FAULTS); } | 404 | emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } |
| 405 | dummy { return sym(yyscanner, PERF_COUNT_SW_DUMMY); } | 405 | dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); } |
| 406 | duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); } | 406 | duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); } |
| 407 | user_time { return tool(yyscanner, PERF_TOOL_USER_TIME); } | 407 | user_time { return tool(yyscanner, PERF_TOOL_USER_TIME); } |
| 408 | system_time { return tool(yyscanner, PERF_TOOL_SYSTEM_TIME); } | 408 | system_time { return tool(yyscanner, PERF_TOOL_SYSTEM_TIME); } |
| 409 | bpf-output { return sym(yyscanner, PERF_COUNT_SW_BPF_OUTPUT); } | 409 | bpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); } |
| 410 | cgroup-switches { return sym(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES); } | 410 | cgroup-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); } |
| @@ -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_TERMS | 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 | %token PE_VALUE_SYM_TOOL | 59 | %token PE_VALUE_SYM_TOOL |
| 60 | %token PE_EVENT_NAME | 60 | %token PE_EVENT_NAME |
| 61 | %token PE_RAW PE_NAME | 61 | %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_TERM | 66 | %token PE_DRV_CFG_TERM |
| 67 | %token PE_TERM_HW | 67 | %token PE_TERM_HW |
| 68 | %type <num> PE_VALUE | 68 | %type <num> PE_VALUE |
| 69 | %type <num> PE_VALUE_SYM_HW | ||
| 69 | %type <num> PE_VALUE_SYM_SW | 70 | %type <num> PE_VALUE_SYM_SW |
| 70 | %type <num> PE_VALUE_SYM_TOOL | 71 | %type <num> PE_VALUE_SYM_TOOL |
| 71 | %type <mod> PE_MODIFIER_EVENT | 72 | %type <mod> PE_MODIFIER_EVENT |
| 72 | %type <term_type> PE_TERM | 73 | %type <term_type> PE_TERM |
| 74 | %type <num> value_sym | ||
| 73 | %type <str> PE_RAW | 75 | %type <str> PE_RAW |
| 74 | %type <str> PE_NAME | 76 | %type <str> PE_NAME |
| 75 | %type <str> PE_LEGACY_CACHE | 77 | %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_config | 87 | %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_pmu | 89 | %type <list_evsel> event_pmu |
| 88 | %type <list_evsel> event_legacy_hardware | ||
| 89 | %type <list_evsel> event_legacy_symbol | 90 | %type <list_evsel> event_legacy_symbol |
| 90 | %type <list_evsel> event_legacy_cache | 91 | %type <list_evsel> event_legacy_cache |
| 91 | %type <list_evsel> event_legacy_mem | 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 | %destructor { free_list_evsel ($$); } <list_evsel> | 104 | %destructor { free_list_evsel ($$); } <list_evsel> |
| 104 | %type <tracepoint_name> tracepoint_name | 105 | %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_HW | 107 | %type <hardware_term> PE_TERM_HW |
| 107 | %destructor { free ($$.str); } <hardware_event> | 108 | %destructor { free ($$.str); } <hardware_term> |
| 108 | 109 | ||
| 109 | %union | 110 | %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 | |||
| 265 | event_def | 266 | event_def |
| 266 | 267 | ||
| 267 | event_def: event_pmu | | 268 | event_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 | ||
| 311 | event_legacy_hardware: | 311 | value_sym: |
| 312 | PE_TERM_HW opt_pmu_config | 312 | PE_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 | | |
| 326 | PE_TERM_HW sep_dc | 314 | PE_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 | ||
| 338 | event_legacy_symbol: | 316 | event_legacy_symbol: |
| 339 | PE_VALUE_SYM_SW '/' event_config '/' | 317 | value_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 | | |
| 358 | PE_VALUE_SYM_SW sep_slash_slash_dc | 337 | value_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; |