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

Merge tag 'perf-core-for-mingo-4.14-20170821' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core

Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:

- Support --show-nr-samples in annotate's --stdio and --tui, using
the existing 't' toggle to circulate 'percent', 'total-period' and
'nr-samples' as the first column (Taeung Song)

- Support FCMask and PortMask in JSON vendor events (Andi Kleen)

- Fix off by one string allocation problem in 'perf trace' (Arnaldo Carvalho de Melo)

- Use just one parse events state struct in yyparse(), fixing one
reported segfault when a routine received a different data struct,
smaller than the one it expected to use (Arnaldo Carvalho de Melo)

- Remove unused cpu_relax() macros, they stopped being used when
tools/perf lived in Documentation/ (Arnaldo Carvalho de Melo)

- Fix double file test in libbpf's Makefile (Daniel Díaz):

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>

+159 -158
+2 -2
tools/lib/bpf/Makefile
··· 154 154 all_cmd: $(CMD_TARGETS) 155 155 156 156 $(BPF_IN): force elfdep bpfdep 157 - @(test -f ../../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \ 157 + @(test -f ../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \ 158 158 (diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \ 159 159 echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf.h' differs from latest version at 'include/uapi/linux/bpf.h'" >&2 )) || true 160 - @(test -f ../../../include/uapi/linux/bpf_common.h -a -f ../../../include/uapi/linux/bpf_common.h && ( \ 160 + @(test -f ../../include/uapi/linux/bpf_common.h -a -f ../../../include/uapi/linux/bpf_common.h && ( \ 161 161 (diff -B ../../include/uapi/linux/bpf_common.h ../../../include/uapi/linux/bpf_common.h >/dev/null) || \ 162 162 echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf_common.h' differs from latest version at 'include/uapi/linux/bpf_common.h'" >&2 )) || true 163 163 $(Q)$(MAKE) $(build)=libbpf
+6
tools/perf/Documentation/perf-annotate.txt
··· 43 43 --quiet:: 44 44 Do not show any message. (Suppress -v) 45 45 46 + -n:: 47 + --show-nr-samples:: 48 + Show the number of samples for each symbol 49 + 46 50 -D:: 47 51 --dump-raw-trace:: 48 52 Dump raw trace in ASCII. ··· 91 87 92 88 --asm-raw:: 93 89 Show raw instruction encoding of assembly instructions. 90 + 91 + --show-total-period:: Show a column with the sum of periods. 94 92 95 93 --source:: 96 94 Interleave source code with assembly code. Enabled by default,
+14 -2
tools/perf/builtin-annotate.c
··· 403 403 struct perf_data_file file = { 404 404 .mode = PERF_DATA_MODE_READ, 405 405 }; 406 - const struct option options[] = { 406 + struct option options[] = { 407 407 OPT_STRING('i', "input", &input_name, "file", 408 408 "input file name"), 409 409 OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]", ··· 445 445 "Show event group information together"), 446 446 OPT_BOOLEAN(0, "show-total-period", &symbol_conf.show_total_period, 447 447 "Show a column with the sum of periods"), 448 + OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples, 449 + "Show a column with the number of samples"), 448 450 OPT_CALLBACK_DEFAULT(0, "stdio-color", NULL, "mode", 449 451 "'always' (default), 'never' or 'auto' only applicable to --stdio mode", 450 452 stdio__config_color, "always"), 451 453 OPT_END() 452 454 }; 453 - int ret = hists__init(); 455 + int ret; 454 456 457 + set_option_flag(options, 0, "show-total-period", PARSE_OPT_EXCLUSIVE); 458 + set_option_flag(options, 0, "show-nr-samples", PARSE_OPT_EXCLUSIVE); 459 + 460 + 461 + ret = hists__init(); 455 462 if (ret < 0) 456 463 return ret; 457 464 ··· 472 465 usage_with_options(annotate_usage, options); 473 466 474 467 annotate.sym_hist_filter = argv[0]; 468 + } 469 + 470 + if (symbol_conf.show_nr_samples && annotate.use_gtk) { 471 + pr_err("--show-nr-samples is not available in --gtk mode at this time\n"); 472 + return ret; 475 473 } 476 474 477 475 if (quiet)
+1 -1
tools/perf/builtin-trace.c
··· 2806 2806 struct trace *trace = (struct trace *)opt->value; 2807 2807 const char *s = str; 2808 2808 char *sep = NULL, *lists[2] = { NULL, NULL, }; 2809 - int len = strlen(str), err = -1, list; 2809 + int len = strlen(str) + 1, err = -1, list; 2810 2810 char *strace_groups_dir = system_path(STRACE_GROUPS_DIR); 2811 2811 char group_name[PATH_MAX]; 2812 2812
+2 -26
tools/perf/perf-sys.h
··· 9 9 #include <linux/perf_event.h> 10 10 #include <asm/barrier.h> 11 11 12 - #if defined(__i386__) 13 - #define cpu_relax() asm volatile("rep; nop" ::: "memory"); 14 - #define CPUINFO_PROC {"model name"} 15 - #endif 16 - 17 - #if defined(__x86_64__) 18 - #define cpu_relax() asm volatile("rep; nop" ::: "memory"); 19 - #define CPUINFO_PROC {"model name"} 20 - #endif 21 - 22 12 #ifdef __powerpc__ 23 13 #define CPUINFO_PROC {"cpu"} 24 14 #endif ··· 33 43 #define CPUINFO_PROC {"cpu model"} 34 44 #endif 35 45 36 - #ifdef __ia64__ 37 - #define cpu_relax() asm volatile ("hint @pause" ::: "memory") 38 - #define CPUINFO_PROC {"model name"} 39 - #endif 40 - 41 46 #ifdef __arm__ 42 47 #define CPUINFO_PROC {"model name", "Processor"} 43 - #endif 44 - 45 - #ifdef __aarch64__ 46 - #define cpu_relax() asm volatile("yield" ::: "memory") 47 48 #endif 48 49 49 50 #ifdef __mips__ ··· 53 72 #define CPUINFO_PROC {"core ID"} 54 73 #endif 55 74 56 - #ifdef __tile__ 57 - #define cpu_relax() asm volatile ("mfspr zero, PASS" ::: "memory") 58 - #define CPUINFO_PROC {"model name"} 59 - #endif 60 - 61 - #ifndef cpu_relax 62 - #define cpu_relax() barrier() 75 + #ifndef CPUINFO_PROC 76 + #define CPUINFO_PROC { "model name", } 63 77 #endif 64 78 65 79 static inline int
+2
tools/perf/pmu-events/jevents.c
··· 137 137 { "AnyThread", "any=" }, 138 138 { "EdgeDetect", "edge=" }, 139 139 { "SampleAfterValue", "period=" }, 140 + { "FCMask", "fc_mask=" }, 141 + { "PortMask", "ch_mask=" }, 140 142 { NULL, NULL } 141 143 }; 142 144
+8 -8
tools/perf/tests/bpf.c
··· 124 124 struct perf_evlist *evlist; 125 125 int i, ret = TEST_FAIL, err = 0, count = 0; 126 126 127 - struct parse_events_evlist parse_evlist; 127 + struct parse_events_state parse_state; 128 128 struct parse_events_error parse_error; 129 129 130 130 bzero(&parse_error, sizeof(parse_error)); 131 - bzero(&parse_evlist, sizeof(parse_evlist)); 132 - parse_evlist.error = &parse_error; 133 - INIT_LIST_HEAD(&parse_evlist.list); 131 + bzero(&parse_state, sizeof(parse_state)); 132 + parse_state.error = &parse_error; 133 + INIT_LIST_HEAD(&parse_state.list); 134 134 135 - err = parse_events_load_bpf_obj(&parse_evlist, &parse_evlist.list, obj, NULL); 136 - if (err || list_empty(&parse_evlist.list)) { 135 + err = parse_events_load_bpf_obj(&parse_state, &parse_state.list, obj, NULL); 136 + if (err || list_empty(&parse_state.list)) { 137 137 pr_debug("Failed to add events selected by BPF\n"); 138 138 return TEST_FAIL; 139 139 } ··· 155 155 goto out_delete_evlist; 156 156 } 157 157 158 - perf_evlist__splice_list_tail(evlist, &parse_evlist.list); 159 - evlist->nr_groups = parse_evlist.nr_groups; 158 + perf_evlist__splice_list_tail(evlist, &parse_state.list); 159 + evlist->nr_groups = parse_state.nr_groups; 160 160 161 161 perf_evlist__config(evlist, &opts, NULL); 162 162
+19 -6
tools/perf/ui/browsers/annotate.c
··· 42 42 jump_arrows, 43 43 show_linenr, 44 44 show_nr_jumps, 45 + show_nr_samples, 45 46 show_total_period; 46 47 } annotate_browser__opts = { 47 48 .use_offset = true, ··· 156 155 if (annotate_browser__opts.show_total_period) { 157 156 ui_browser__printf(browser, "%11" PRIu64 " ", 158 157 bdl->samples[i].he.period); 158 + } else if (annotate_browser__opts.show_nr_samples) { 159 + ui_browser__printf(browser, "%6" PRIu64 " ", 160 + bdl->samples[i].he.nr_samples); 159 161 } else { 160 162 ui_browser__printf(browser, "%6.2f ", 161 163 bdl->samples[i].percent); ··· 171 167 ui_browser__write_nstring(browser, " ", pcnt_width); 172 168 else { 173 169 ui_browser__printf(browser, "%*s", pcnt_width, 174 - annotate_browser__opts.show_total_period ? "Period" : "Percent"); 170 + annotate_browser__opts.show_total_period ? "Period" : 171 + annotate_browser__opts.show_nr_samples ? "Samples" : "Percent"); 175 172 } 176 173 } 177 174 if (ab->have_cycles) { ··· 835 830 "n Search next string\n" 836 831 "o Toggle disassembler output/simplified view\n" 837 832 "s Toggle source code view\n" 838 - "t Toggle total period view\n" 833 + "t Circulate percent, total period, samples view\n" 839 834 "/ Search string\n" 840 835 "k Toggle line numbers\n" 841 836 "r Run available scripts\n" ··· 912 907 } 913 908 continue; 914 909 case 't': 915 - annotate_browser__opts.show_total_period = 916 - !annotate_browser__opts.show_total_period; 910 + if (annotate_browser__opts.show_total_period) { 911 + annotate_browser__opts.show_total_period = false; 912 + annotate_browser__opts.show_nr_samples = true; 913 + } else if (annotate_browser__opts.show_nr_samples) 914 + annotate_browser__opts.show_nr_samples = false; 915 + else 916 + annotate_browser__opts.show_total_period = true; 917 917 annotate_browser__update_addr_width(browser); 918 918 continue; 919 919 case K_LEFT: ··· 941 931 int map_symbol__tui_annotate(struct map_symbol *ms, struct perf_evsel *evsel, 942 932 struct hist_browser_timer *hbt) 943 933 { 944 - /* Set default value for show_total_period. */ 934 + /* Set default value for show_total_period and show_nr_samples */ 945 935 annotate_browser__opts.show_total_period = 946 - symbol_conf.show_total_period; 936 + symbol_conf.show_total_period; 937 + annotate_browser__opts.show_nr_samples = 938 + symbol_conf.show_nr_samples; 947 939 948 940 return symbol__tui_annotate(ms->sym, ms->map, evsel, hbt); 949 941 } ··· 1196 1184 ANNOTATE_CFG(jump_arrows), 1197 1185 ANNOTATE_CFG(show_linenr), 1198 1186 ANNOTATE_CFG(show_nr_jumps), 1187 + ANNOTATE_CFG(show_nr_samples), 1199 1188 ANNOTATE_CFG(show_total_period), 1200 1189 ANNOTATE_CFG(use_offset), 1201 1190 };
+5 -1
tools/perf/util/annotate.c
··· 1145 1145 if (symbol_conf.show_total_period) 1146 1146 color_fprintf(stdout, color, " %11" PRIu64, 1147 1147 sample.period); 1148 + else if (symbol_conf.show_nr_samples) 1149 + color_fprintf(stdout, color, " %7" PRIu64, 1150 + sample.nr_samples); 1148 1151 else 1149 1152 color_fprintf(stdout, color, " %7.2f", percent); 1150 1153 } ··· 1828 1825 width *= evsel->nr_members; 1829 1826 1830 1827 graph_dotted_len = printf(" %-*.*s| Source code & Disassembly of %s for %s (%" PRIu64 " samples)\n", 1831 - width, width, symbol_conf.show_total_period ? "Event count" : "Percent", 1828 + width, width, symbol_conf.show_total_period ? "Period" : 1829 + symbol_conf.show_nr_samples ? "Samples" : "Percent", 1832 1830 d_filename, evsel_name, h->nr_samples); 1833 1831 1834 1832 printf("%-*.*s----\n",
-3
tools/perf/util/header.c
··· 380 380 static int write_cpudesc(struct feat_fd *ff, 381 381 struct perf_evlist *evlist __maybe_unused) 382 382 { 383 - #ifndef CPUINFO_PROC 384 - #define CPUINFO_PROC {"model name", } 385 - #endif 386 383 const char *cpuinfo_procs[] = CPUINFO_PROC; 387 384 unsigned int i; 388 385
+48 -48
tools/perf/util/parse-events.c
··· 34 34 #ifdef PARSER_DEBUG 35 35 extern int parse_events_debug; 36 36 #endif 37 - int parse_events_parse(void *data, void *scanner); 37 + int parse_events_parse(void *parse_state, void *scanner); 38 38 static int get_config_terms(struct list_head *head_config, 39 39 struct list_head *head_terms __maybe_unused); 40 40 ··· 589 589 } 590 590 591 591 struct __add_bpf_event_param { 592 - struct parse_events_evlist *data; 592 + struct parse_events_state *parse_state; 593 593 struct list_head *list; 594 594 struct list_head *head_config; 595 595 }; ··· 599 599 { 600 600 LIST_HEAD(new_evsels); 601 601 struct __add_bpf_event_param *param = _param; 602 - struct parse_events_evlist *evlist = param->data; 602 + struct parse_events_state *parse_state = param->parse_state; 603 603 struct list_head *list = param->list; 604 604 struct perf_evsel *pos; 605 605 int err; ··· 607 607 pr_debug("add bpf event %s:%s and attach bpf program %d\n", 608 608 group, event, fd); 609 609 610 - err = parse_events_add_tracepoint(&new_evsels, &evlist->idx, group, 611 - event, evlist->error, 610 + err = parse_events_add_tracepoint(&new_evsels, &parse_state->idx, group, 611 + event, parse_state->error, 612 612 param->head_config); 613 613 if (err) { 614 614 struct perf_evsel *evsel, *tmp; ··· 632 632 return 0; 633 633 } 634 634 635 - int parse_events_load_bpf_obj(struct parse_events_evlist *data, 635 + int parse_events_load_bpf_obj(struct parse_events_state *parse_state, 636 636 struct list_head *list, 637 637 struct bpf_object *obj, 638 638 struct list_head *head_config) 639 639 { 640 640 int err; 641 641 char errbuf[BUFSIZ]; 642 - struct __add_bpf_event_param param = {data, list, head_config}; 642 + struct __add_bpf_event_param param = {parse_state, list, head_config}; 643 643 static bool registered_unprobe_atexit = false; 644 644 645 645 if (IS_ERR(obj) || !obj) { ··· 680 680 681 681 return 0; 682 682 errout: 683 - data->error->help = strdup("(add -v to see detail)"); 684 - data->error->str = strdup(errbuf); 683 + parse_state->error->help = strdup("(add -v to see detail)"); 684 + parse_state->error->str = strdup(errbuf); 685 685 return err; 686 686 } 687 687 688 688 static int 689 - parse_events_config_bpf(struct parse_events_evlist *data, 689 + parse_events_config_bpf(struct parse_events_state *parse_state, 690 690 struct bpf_object *obj, 691 691 struct list_head *head_config) 692 692 { ··· 705 705 "Invalid config term for BPF object"); 706 706 errbuf[BUFSIZ - 1] = '\0'; 707 707 708 - data->error->idx = term->err_term; 709 - data->error->str = strdup(errbuf); 708 + parse_state->error->idx = term->err_term; 709 + parse_state->error->str = strdup(errbuf); 710 710 return -EINVAL; 711 711 } 712 712 713 - err = bpf__config_obj(obj, term, data->evlist, &error_pos); 713 + err = bpf__config_obj(obj, term, parse_state->evlist, &error_pos); 714 714 if (err) { 715 - bpf__strerror_config_obj(obj, term, data->evlist, 715 + bpf__strerror_config_obj(obj, term, parse_state->evlist, 716 716 &error_pos, err, errbuf, 717 717 sizeof(errbuf)); 718 - data->error->help = strdup( 718 + parse_state->error->help = strdup( 719 719 "Hint:\tValid config terms:\n" 720 720 " \tmap:[<arraymap>].value<indices>=[value]\n" 721 721 " \tmap:[<eventmap>].event<indices>=[event]\n" 722 722 "\n" 723 723 " \twhere <indices> is something like [0,3...5] or [all]\n" 724 724 " \t(add -v to see detail)"); 725 - data->error->str = strdup(errbuf); 725 + parse_state->error->str = strdup(errbuf); 726 726 if (err == -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE) 727 - data->error->idx = term->err_val; 727 + parse_state->error->idx = term->err_val; 728 728 else 729 - data->error->idx = term->err_term + error_pos; 729 + parse_state->error->idx = term->err_term + error_pos; 730 730 return err; 731 731 } 732 732 } ··· 762 762 list_move_tail(&term->list, obj_head_config); 763 763 } 764 764 765 - int parse_events_load_bpf(struct parse_events_evlist *data, 765 + int parse_events_load_bpf(struct parse_events_state *parse_state, 766 766 struct list_head *list, 767 767 char *bpf_file_name, 768 768 bool source, ··· 790 790 -err, errbuf, 791 791 sizeof(errbuf)); 792 792 793 - data->error->help = strdup("(add -v to see detail)"); 794 - data->error->str = strdup(errbuf); 793 + parse_state->error->help = strdup("(add -v to see detail)"); 794 + parse_state->error->str = strdup(errbuf); 795 795 return err; 796 796 } 797 797 798 - err = parse_events_load_bpf_obj(data, list, obj, head_config); 798 + err = parse_events_load_bpf_obj(parse_state, list, obj, head_config); 799 799 if (err) 800 800 return err; 801 - err = parse_events_config_bpf(data, obj, &obj_head_config); 801 + err = parse_events_config_bpf(parse_state, obj, &obj_head_config); 802 802 803 803 /* 804 804 * Caller doesn't know anything about obj_head_config, ··· 1184 1184 err, head_config); 1185 1185 } 1186 1186 1187 - int parse_events_add_numeric(struct parse_events_evlist *data, 1187 + int parse_events_add_numeric(struct parse_events_state *parse_state, 1188 1188 struct list_head *list, 1189 1189 u32 type, u64 config, 1190 1190 struct list_head *head_config) ··· 1197 1197 attr.config = config; 1198 1198 1199 1199 if (head_config) { 1200 - if (config_attr(&attr, head_config, data->error, 1200 + if (config_attr(&attr, head_config, parse_state->error, 1201 1201 config_term_common)) 1202 1202 return -EINVAL; 1203 1203 ··· 1205 1205 return -ENOMEM; 1206 1206 } 1207 1207 1208 - return add_event(list, &data->idx, &attr, 1208 + return add_event(list, &parse_state->idx, &attr, 1209 1209 get_config_name(head_config), &config_terms); 1210 1210 } 1211 1211 1212 - int parse_events_add_pmu(struct parse_events_evlist *data, 1212 + int parse_events_add_pmu(struct parse_events_state *parse_state, 1213 1213 struct list_head *list, char *name, 1214 1214 struct list_head *head_config) 1215 1215 { ··· 1232 1232 1233 1233 if (!head_config) { 1234 1234 attr.type = pmu->type; 1235 - evsel = __add_event(list, &data->idx, &attr, NULL, pmu->cpus, NULL); 1235 + evsel = __add_event(list, &parse_state->idx, &attr, NULL, pmu->cpus, NULL); 1236 1236 return evsel ? 0 : -ENOMEM; 1237 1237 } 1238 1238 ··· 1243 1243 * Configure hardcoded terms first, no need to check 1244 1244 * return value when called with fail == 0 ;) 1245 1245 */ 1246 - if (config_attr(&attr, head_config, data->error, config_term_pmu)) 1246 + if (config_attr(&attr, head_config, parse_state->error, config_term_pmu)) 1247 1247 return -EINVAL; 1248 1248 1249 1249 if (get_config_terms(head_config, &config_terms)) 1250 1250 return -ENOMEM; 1251 1251 1252 - if (perf_pmu__config(pmu, &attr, head_config, data->error)) 1252 + if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) 1253 1253 return -EINVAL; 1254 1254 1255 - evsel = __add_event(list, &data->idx, &attr, 1255 + evsel = __add_event(list, &parse_state->idx, &attr, 1256 1256 get_config_name(head_config), pmu->cpus, 1257 1257 &config_terms); 1258 1258 if (evsel) { ··· 1267 1267 return evsel ? 0 : -ENOMEM; 1268 1268 } 1269 1269 1270 - int parse_events_multi_pmu_add(struct parse_events_evlist *data, 1270 + int parse_events_multi_pmu_add(struct parse_events_state *parse_state, 1271 1271 char *str, struct list_head **listp) 1272 1272 { 1273 1273 struct list_head *head; ··· 1296 1296 return -1; 1297 1297 list_add_tail(&term->list, head); 1298 1298 1299 - if (!parse_events_add_pmu(data, list, 1299 + if (!parse_events_add_pmu(parse_state, list, 1300 1300 pmu->name, head)) { 1301 1301 pr_debug("%s -> %s/%s/\n", str, 1302 1302 pmu->name, alias->str); ··· 1628 1628 return r ? r->type : PMU_EVENT_SYMBOL_ERR; 1629 1629 } 1630 1630 1631 - static int parse_events__scanner(const char *str, void *data, int start_token) 1631 + static int parse_events__scanner(const char *str, void *parse_state, int start_token) 1632 1632 { 1633 1633 YY_BUFFER_STATE buffer; 1634 1634 void *scanner; ··· 1643 1643 #ifdef PARSER_DEBUG 1644 1644 parse_events_debug = 1; 1645 1645 #endif 1646 - ret = parse_events_parse(data, scanner); 1646 + ret = parse_events_parse(parse_state, scanner); 1647 1647 1648 1648 parse_events__flush_buffer(buffer, scanner); 1649 1649 parse_events__delete_buffer(buffer, scanner); ··· 1656 1656 */ 1657 1657 int parse_events_terms(struct list_head *terms, const char *str) 1658 1658 { 1659 - struct parse_events_terms data = { 1659 + struct parse_events_state parse_state = { 1660 1660 .terms = NULL, 1661 1661 }; 1662 1662 int ret; 1663 1663 1664 - ret = parse_events__scanner(str, &data, PE_START_TERMS); 1664 + ret = parse_events__scanner(str, &parse_state, PE_START_TERMS); 1665 1665 if (!ret) { 1666 - list_splice(data.terms, terms); 1667 - zfree(&data.terms); 1666 + list_splice(parse_state.terms, terms); 1667 + zfree(&parse_state.terms); 1668 1668 return 0; 1669 1669 } 1670 1670 1671 - parse_events_terms__delete(data.terms); 1671 + parse_events_terms__delete(parse_state.terms); 1672 1672 return ret; 1673 1673 } 1674 1674 1675 1675 int parse_events(struct perf_evlist *evlist, const char *str, 1676 1676 struct parse_events_error *err) 1677 1677 { 1678 - struct parse_events_evlist data = { 1679 - .list = LIST_HEAD_INIT(data.list), 1678 + struct parse_events_state parse_state = { 1679 + .list = LIST_HEAD_INIT(parse_state.list), 1680 1680 .idx = evlist->nr_entries, 1681 1681 .error = err, 1682 1682 .evlist = evlist, 1683 1683 }; 1684 1684 int ret; 1685 1685 1686 - ret = parse_events__scanner(str, &data, PE_START_EVENTS); 1686 + ret = parse_events__scanner(str, &parse_state, PE_START_EVENTS); 1687 1687 perf_pmu__parse_cleanup(); 1688 1688 if (!ret) { 1689 1689 struct perf_evsel *last; 1690 1690 1691 - if (list_empty(&data.list)) { 1691 + if (list_empty(&parse_state.list)) { 1692 1692 WARN_ONCE(true, "WARNING: event parser found nothing"); 1693 1693 return -1; 1694 1694 } 1695 1695 1696 - perf_evlist__splice_list_tail(evlist, &data.list); 1697 - evlist->nr_groups += data.nr_groups; 1696 + perf_evlist__splice_list_tail(evlist, &parse_state.list); 1697 + evlist->nr_groups += parse_state.nr_groups; 1698 1698 last = perf_evlist__last(evlist); 1699 1699 last->cmdline_group_boundary = true; 1700 1700 ··· 2520 2520 zfree(&a->ranges); 2521 2521 } 2522 2522 2523 - void parse_events_evlist_error(struct parse_events_evlist *data, 2523 + void parse_events_evlist_error(struct parse_events_state *parse_state, 2524 2524 int idx, const char *str) 2525 2525 { 2526 - struct parse_events_error *err = data->error; 2526 + struct parse_events_error *err = parse_state->error; 2527 2527 2528 2528 if (!err) 2529 2529 return;
+8 -11
tools/perf/util/parse-events.h
··· 108 108 char *help; /* optional help string */ 109 109 }; 110 110 111 - struct parse_events_evlist { 111 + struct parse_events_state { 112 112 struct list_head list; 113 113 int idx; 114 114 int nr_groups; 115 115 struct parse_events_error *error; 116 116 struct perf_evlist *evlist; 117 - }; 118 - 119 - struct parse_events_terms { 120 - struct list_head *terms; 117 + struct list_head *terms; 121 118 }; 122 119 123 120 void parse_events__shrink_config_terms(void); ··· 140 143 const char *sys, const char *event, 141 144 struct parse_events_error *error, 142 145 struct list_head *head_config); 143 - int parse_events_load_bpf(struct parse_events_evlist *data, 146 + int parse_events_load_bpf(struct parse_events_state *parse_state, 144 147 struct list_head *list, 145 148 char *bpf_file_name, 146 149 bool source, 147 150 struct list_head *head_config); 148 151 /* Provide this function for perf test */ 149 152 struct bpf_object; 150 - int parse_events_load_bpf_obj(struct parse_events_evlist *data, 153 + int parse_events_load_bpf_obj(struct parse_events_state *parse_state, 151 154 struct list_head *list, 152 155 struct bpf_object *obj, 153 156 struct list_head *head_config); 154 - int parse_events_add_numeric(struct parse_events_evlist *data, 157 + int parse_events_add_numeric(struct parse_events_state *parse_state, 155 158 struct list_head *list, 156 159 u32 type, u64 config, 157 160 struct list_head *head_config); ··· 161 164 struct list_head *head_config); 162 165 int parse_events_add_breakpoint(struct list_head *list, int *idx, 163 166 void *ptr, char *type, u64 len); 164 - int parse_events_add_pmu(struct parse_events_evlist *data, 167 + int parse_events_add_pmu(struct parse_events_state *parse_state, 165 168 struct list_head *list, char *name, 166 169 struct list_head *head_config); 167 170 168 - int parse_events_multi_pmu_add(struct parse_events_evlist *data, 171 + int parse_events_multi_pmu_add(struct parse_events_state *parse_state, 169 172 char *str, 170 173 struct list_head **listp); 171 174 ··· 177 180 void parse_events__set_leader(char *name, struct list_head *list); 178 181 void parse_events_update_lists(struct list_head *list_event, 179 182 struct list_head *list_all); 180 - void parse_events_evlist_error(struct parse_events_evlist *data, 183 + void parse_events_evlist_error(struct parse_events_state *parse_state, 181 184 int idx, const char *str); 182 185 183 186 void print_events(const char *event_glob, bool name_only, bool quiet,
+44 -50
tools/perf/util/parse-events.y
··· 1 1 %pure-parser 2 - %parse-param {void *_data} 2 + %parse-param {void *_parse_state} 3 3 %parse-param {void *scanner} 4 4 %lex-param {void* scanner} 5 5 %locations ··· 17 17 #include "parse-events.h" 18 18 #include "parse-events-bison.h" 19 19 20 - void parse_events_error(YYLTYPE *loc, void *data, void *scanner, char const *msg); 20 + void parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg); 21 21 22 22 #define ABORT_ON(val) \ 23 23 do { \ ··· 33 33 } while (0) 34 34 35 35 static void inc_group_count(struct list_head *list, 36 - struct parse_events_evlist *data) 36 + struct parse_events_state *parse_state) 37 37 { 38 38 /* Count groups only have more than 1 members */ 39 39 if (!list_is_last(list->next, list)) 40 - data->nr_groups++; 40 + parse_state->nr_groups++; 41 41 } 42 42 43 43 %} ··· 115 115 116 116 start_events: groups 117 117 { 118 - struct parse_events_evlist *data = _data; 118 + struct parse_events_state *parse_state = _parse_state; 119 119 120 - parse_events_update_lists($1, &data->list); 120 + parse_events_update_lists($1, &parse_state->list); 121 121 } 122 122 123 123 groups: ··· 159 159 { 160 160 struct list_head *list = $3; 161 161 162 - inc_group_count(list, _data); 162 + inc_group_count(list, _parse_state); 163 163 parse_events__set_leader($1, list); 164 164 $$ = list; 165 165 } ··· 168 168 { 169 169 struct list_head *list = $2; 170 170 171 - inc_group_count(list, _data); 171 + inc_group_count(list, _parse_state); 172 172 parse_events__set_leader(NULL, list); 173 173 $$ = list; 174 174 } ··· 225 225 event_pmu: 226 226 PE_NAME opt_event_config 227 227 { 228 - struct parse_events_evlist *data = _data; 229 228 struct list_head *list, *orig_terms, *terms; 230 229 231 230 if (parse_events_copy_term_list($2, &orig_terms)) 232 231 YYABORT; 233 232 234 233 ALLOC_LIST(list); 235 - if (parse_events_add_pmu(data, list, $1, $2)) { 234 + if (parse_events_add_pmu(_parse_state, list, $1, $2)) { 236 235 struct perf_pmu *pmu = NULL; 237 236 int ok = 0; 238 237 ··· 244 245 if (!strncmp($1, name, strlen($1))) { 245 246 if (parse_events_copy_term_list(orig_terms, &terms)) 246 247 YYABORT; 247 - if (!parse_events_add_pmu(data, list, pmu->name, terms)) 248 + if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms)) 248 249 ok++; 249 250 parse_events_terms__delete(terms); 250 251 } ··· 261 262 { 262 263 struct list_head *list; 263 264 264 - if (parse_events_multi_pmu_add(_data, $1, &list) < 0) 265 + if (parse_events_multi_pmu_add(_parse_state, $1, &list) < 0) 265 266 YYABORT; 266 267 $$ = list; 267 268 } ··· 272 273 char pmu_name[128]; 273 274 274 275 snprintf(&pmu_name, 128, "%s-%s", $1, $3); 275 - if (parse_events_multi_pmu_add(_data, pmu_name, &list) < 0) 276 + if (parse_events_multi_pmu_add(_parse_state, pmu_name, &list) < 0) 276 277 YYABORT; 277 278 $$ = list; 278 279 } ··· 285 286 event_legacy_symbol: 286 287 value_sym '/' event_config '/' 287 288 { 288 - struct parse_events_evlist *data = _data; 289 289 struct list_head *list; 290 290 int type = $1 >> 16; 291 291 int config = $1 & 255; 292 292 293 293 ALLOC_LIST(list); 294 - ABORT_ON(parse_events_add_numeric(data, list, type, config, $3)); 294 + ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, $3)); 295 295 parse_events_terms__delete($3); 296 296 $$ = list; 297 297 } 298 298 | 299 299 value_sym sep_slash_dc 300 300 { 301 - struct parse_events_evlist *data = _data; 302 301 struct list_head *list; 303 302 int type = $1 >> 16; 304 303 int config = $1 & 255; 305 304 306 305 ALLOC_LIST(list); 307 - ABORT_ON(parse_events_add_numeric(data, list, type, config, NULL)); 306 + ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL)); 308 307 $$ = list; 309 308 } 310 309 311 310 event_legacy_cache: 312 311 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config 313 312 { 314 - struct parse_events_evlist *data = _data; 315 - struct parse_events_error *error = data->error; 313 + struct parse_events_state *parse_state = _parse_state; 314 + struct parse_events_error *error = parse_state->error; 316 315 struct list_head *list; 317 316 318 317 ALLOC_LIST(list); 319 - ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5, error, $6)); 318 + ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6)); 320 319 parse_events_terms__delete($6); 321 320 $$ = list; 322 321 } 323 322 | 324 323 PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config 325 324 { 326 - struct parse_events_evlist *data = _data; 327 - struct parse_events_error *error = data->error; 325 + struct parse_events_state *parse_state = _parse_state; 326 + struct parse_events_error *error = parse_state->error; 328 327 struct list_head *list; 329 328 330 329 ALLOC_LIST(list); 331 - ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL, error, $4)); 330 + ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4)); 332 331 parse_events_terms__delete($4); 333 332 $$ = list; 334 333 } 335 334 | 336 335 PE_NAME_CACHE_TYPE opt_event_config 337 336 { 338 - struct parse_events_evlist *data = _data; 339 - struct parse_events_error *error = data->error; 337 + struct parse_events_state *parse_state = _parse_state; 338 + struct parse_events_error *error = parse_state->error; 340 339 struct list_head *list; 341 340 342 341 ALLOC_LIST(list); 343 - ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL, error, $2)); 342 + ABORT_ON(parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2)); 344 343 parse_events_terms__delete($2); 345 344 $$ = list; 346 345 } ··· 346 349 event_legacy_mem: 347 350 PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc 348 351 { 349 - struct parse_events_evlist *data = _data; 352 + struct parse_events_state *parse_state = _parse_state; 350 353 struct list_head *list; 351 354 352 355 ALLOC_LIST(list); 353 - ABORT_ON(parse_events_add_breakpoint(list, &data->idx, 356 + ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 354 357 (void *) $2, $6, $4)); 355 358 $$ = list; 356 359 } 357 360 | 358 361 PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc 359 362 { 360 - struct parse_events_evlist *data = _data; 363 + struct parse_events_state *parse_state = _parse_state; 361 364 struct list_head *list; 362 365 363 366 ALLOC_LIST(list); 364 - ABORT_ON(parse_events_add_breakpoint(list, &data->idx, 367 + ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 365 368 (void *) $2, NULL, $4)); 366 369 $$ = list; 367 370 } 368 371 | 369 372 PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc 370 373 { 371 - struct parse_events_evlist *data = _data; 374 + struct parse_events_state *parse_state = _parse_state; 372 375 struct list_head *list; 373 376 374 377 ALLOC_LIST(list); 375 - ABORT_ON(parse_events_add_breakpoint(list, &data->idx, 378 + ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 376 379 (void *) $2, $4, 0)); 377 380 $$ = list; 378 381 } 379 382 | 380 383 PE_PREFIX_MEM PE_VALUE sep_dc 381 384 { 382 - struct parse_events_evlist *data = _data; 385 + struct parse_events_state *parse_state = _parse_state; 383 386 struct list_head *list; 384 387 385 388 ALLOC_LIST(list); 386 - ABORT_ON(parse_events_add_breakpoint(list, &data->idx, 389 + ABORT_ON(parse_events_add_breakpoint(list, &parse_state->idx, 387 390 (void *) $2, NULL, 0)); 388 391 $$ = list; 389 392 } ··· 391 394 event_legacy_tracepoint: 392 395 tracepoint_name opt_event_config 393 396 { 394 - struct parse_events_evlist *data = _data; 395 - struct parse_events_error *error = data->error; 397 + struct parse_events_state *parse_state = _parse_state; 398 + struct parse_events_error *error = parse_state->error; 396 399 struct list_head *list; 397 400 398 401 ALLOC_LIST(list); 399 402 if (error) 400 403 error->idx = @1.first_column; 401 404 402 - if (parse_events_add_tracepoint(list, &data->idx, $1.sys, $1.event, 405 + if (parse_events_add_tracepoint(list, &parse_state->idx, $1.sys, $1.event, 403 406 error, $2)) 404 407 return -1; 405 408 ··· 429 432 event_legacy_numeric: 430 433 PE_VALUE ':' PE_VALUE opt_event_config 431 434 { 432 - struct parse_events_evlist *data = _data; 433 435 struct list_head *list; 434 436 435 437 ALLOC_LIST(list); 436 - ABORT_ON(parse_events_add_numeric(data, list, (u32)$1, $3, $4)); 438 + ABORT_ON(parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4)); 437 439 parse_events_terms__delete($4); 438 440 $$ = list; 439 441 } ··· 440 444 event_legacy_raw: 441 445 PE_RAW opt_event_config 442 446 { 443 - struct parse_events_evlist *data = _data; 444 447 struct list_head *list; 445 448 446 449 ALLOC_LIST(list); 447 - ABORT_ON(parse_events_add_numeric(data, list, PERF_TYPE_RAW, $1, $2)); 450 + ABORT_ON(parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2)); 448 451 parse_events_terms__delete($2); 449 452 $$ = list; 450 453 } ··· 451 456 event_bpf_file: 452 457 PE_BPF_OBJECT opt_event_config 453 458 { 454 - struct parse_events_evlist *data = _data; 455 - struct parse_events_error *error = data->error; 459 + struct parse_events_state *parse_state = _parse_state; 460 + struct parse_events_error *error = parse_state->error; 456 461 struct list_head *list; 457 462 458 463 ALLOC_LIST(list); 459 - ABORT_ON(parse_events_load_bpf(data, list, $1, false, $2)); 464 + ABORT_ON(parse_events_load_bpf(parse_state, list, $1, false, $2)); 460 465 parse_events_terms__delete($2); 461 466 $$ = list; 462 467 } 463 468 | 464 469 PE_BPF_SOURCE opt_event_config 465 470 { 466 - struct parse_events_evlist *data = _data; 467 471 struct list_head *list; 468 472 469 473 ALLOC_LIST(list); 470 - ABORT_ON(parse_events_load_bpf(data, list, $1, true, $2)); 474 + ABORT_ON(parse_events_load_bpf(_parse_state, list, $1, true, $2)); 471 475 parse_events_terms__delete($2); 472 476 $$ = list; 473 477 } ··· 488 494 489 495 start_terms: event_config 490 496 { 491 - struct parse_events_terms *data = _data; 492 - data->terms = $1; 497 + struct parse_events_state *parse_state = _parse_state; 498 + parse_state->terms = $1; 493 499 } 494 500 495 501 event_config: ··· 679 685 680 686 %% 681 687 682 - void parse_events_error(YYLTYPE *loc, void *data, 688 + void parse_events_error(YYLTYPE *loc, void *parse_state, 683 689 void *scanner __maybe_unused, 684 690 char const *msg __maybe_unused) 685 691 { 686 - parse_events_evlist_error(data, loc->last_column, "parser error"); 692 + parse_events_evlist_error(parse_state, loc->last_column, "parser error"); 687 693 }