Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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"

+68 -103
+8 -23
tools/perf/util/parse-events.c
··· 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 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 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 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 ··· 1624 1626 strbuf_release(&sb); 1625 1627 ok++; 1626 1628 } 1627 - } 1628 - 1629 - if (hw_config != PERF_COUNT_HW_MAX && !core_ok) { 1630 - /* 1631 - * The event wasn't found on core PMUs but it has a hardware 1632 - * config version to try. 1633 - */ 1634 - if (!parse_events_add_numeric(parse_state, list, 1635 - PERF_TYPE_HARDWARE, hw_config, 1636 - const_parsed_terms, 1637 - /*wildcard=*/true)) 1638 - ok++; 1639 1629 } 1640 1630 1641 1631 out_err: ··· 1679 1693 1680 1694 /* Failure to add, assume event_or_pmu is an event name. */ 1681 1695 zfree(listp); 1682 - if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, PERF_COUNT_HW_MAX, 1683 - const_parsed_terms, listp, loc)) 1696 + if (!parse_events_multi_pmu_add(parse_state, event_or_pmu, const_parsed_terms, listp, loc)) 1684 1697 return 0; 1685 1698 1686 1699 if (asprintf(&help, "Unable to find PMU or event on a PMU of '%s'", event_or_pmu) < 0)
+1 -1
tools/perf/util/parse-events.h
··· 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
+38 -38
tools/perf/util/parse-events.l
··· 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 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 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 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); }
+21 -41
tools/perf/util/parse-events.y
··· 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 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 ··· 87 85 %type <list_terms> opt_pmu_config 88 86 %destructor { parse_events_terms__delete ($$); } <list_terms> 89 87 %type <list_evsel> event_pmu 90 - %type <list_evsel> event_legacy_hardware 91 88 %type <list_evsel> event_legacy_symbol 92 89 %type <list_evsel> event_legacy_cache 93 90 %type <list_evsel> event_legacy_mem ··· 104 103 %destructor { free_list_evsel ($$); } <list_evsel> 105 104 %type <tracepoint_name> tracepoint_name 106 105 %destructor { free ($$.sys); free ($$.event); } <tracepoint_name> 107 - %type <hardware_event> PE_TERM_HW 108 - %destructor { free ($$.str); } <hardware_event> 106 + %type <hardware_term> PE_TERM_HW 107 + %destructor { free ($$.str); } <hardware_term> 109 108 110 109 %union 111 110 { ··· 120 119 char *sys; 121 120 char *event; 122 121 } tracepoint_name; 123 - struct hardware_event { 122 + struct hardware_term { 124 123 char *str; 125 124 u64 num; 126 - } hardware_event; 125 + } hardware_term; 127 126 } 128 127 %% 129 128 ··· 266 265 event_def 267 266 268 267 event_def: event_pmu | 269 - event_legacy_hardware | 270 268 event_legacy_symbol | 271 269 event_legacy_cache sep_dc | 272 270 event_legacy_mem sep_dc | ··· 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 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); ··· 334 355 $$ = list; 335 356 } 336 357 | 337 - PE_VALUE_SYM_SW sep_slash_slash_dc 358 + value_sym sep_slash_slash_dc 338 359 { 339 360 struct list_head *list; 361 + int type = $1 >> 16; 362 + int config = $1 & 255; 363 + bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE); 340 364 int err; 341 365 342 366 list = alloc_list(); 343 367 if (!list) 344 368 YYNOMEM; 345 - err = parse_events_add_numeric(_parse_state, list, 346 - /*type=*/PERF_TYPE_SOFTWARE, /*config=*/$1, 347 - /*head_config=*/NULL, /*wildcard=*/false); 369 + err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard); 348 370 if (err) 349 371 PE_ABORT(err); 350 372 $$ = list;