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