aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2017-08-22 06:16:39 -0400
committerIngo Molnar <mingo@kernel.org>2017-08-22 06:16:39 -0400
commitba63f76e22ee723819c8cec86b31f7ea3182b2ed (patch)
tree3479a2ddb3fd04e9d61e230d1466b0a26572d057
parent9881223c6cc0644cc3aeea41e1f19ea7e3041f33 (diff)
parent3a555c7799de69d73826eccc9a21948a5775d4d3 (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/Makefile4
-rw-r--r--tools/perf/Documentation/perf-annotate.txt6
-rw-r--r--tools/perf/builtin-annotate.c16
-rw-r--r--tools/perf/builtin-trace.c2
-rw-r--r--tools/perf/perf-sys.h28
-rw-r--r--tools/perf/pmu-events/jevents.c2
-rw-r--r--tools/perf/tests/bpf.c16
-rw-r--r--tools/perf/ui/browsers/annotate.c25
-rw-r--r--tools/perf/util/annotate.c6
-rw-r--r--tools/perf/util/header.c3
-rw-r--r--tools/perf/util/parse-events.c96
-rw-r--r--tools/perf/util/parse-events.h19
-rw-r--r--tools/perf/util/parse-events.y94
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
154all_cmd: $(CMD_TARGETS) 154all_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
84static inline int 60static 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:
931int map_symbol__tui_annotate(struct map_symbol *ms, struct perf_evsel *evsel, 941int 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:
380static int write_cpudesc(struct feat_fd *ff, 380static 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
35extern int parse_events_debug; 35extern int parse_events_debug;
36#endif 36#endif
37int parse_events_parse(void *data, void *scanner); 37int parse_events_parse(void *parse_state, void *scanner);
38static int get_config_terms(struct list_head *head_config, 38static 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
591struct __add_bpf_event_param { 591struct __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
635int parse_events_load_bpf_obj(struct parse_events_evlist *data, 635int 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;
682errout: 682errout:
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
688static int 688static int
689parse_events_config_bpf(struct parse_events_evlist *data, 689parse_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
765int parse_events_load_bpf(struct parse_events_evlist *data, 765int 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
1187int parse_events_add_numeric(struct parse_events_evlist *data, 1187int 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
1212int parse_events_add_pmu(struct parse_events_evlist *data, 1212int 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
1270int parse_events_multi_pmu_add(struct parse_events_evlist *data, 1270int 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
1631static int parse_events__scanner(const char *str, void *data, int start_token) 1631static 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 */
1657int parse_events_terms(struct list_head *terms, const char *str) 1657int 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
1675int parse_events(struct perf_evlist *evlist, const char *str, 1675int 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
2523void parse_events_evlist_error(struct parse_events_evlist *data, 2523void 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
111struct parse_events_evlist { 111struct 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
119struct parse_events_terms {
120 struct list_head *terms;
121}; 118};
122 119
123void parse_events__shrink_config_terms(void); 120void 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);
146int parse_events_load_bpf(struct parse_events_evlist *data, 143int 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 */
152struct bpf_object; 149struct bpf_object;
153int parse_events_load_bpf_obj(struct parse_events_evlist *data, 150int 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);
157int parse_events_add_numeric(struct parse_events_evlist *data, 154int 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);
165int parse_events_add_breakpoint(struct list_head *list, int *idx, 162int parse_events_add_breakpoint(struct list_head *list, int *idx,
166 void *ptr, char *type, u64 len); 163 void *ptr, char *type, u64 len);
167int parse_events_add_pmu(struct parse_events_evlist *data, 164int 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
171int parse_events_multi_pmu_add(struct parse_events_evlist *data, 168int 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);
180void parse_events__set_leader(char *name, struct list_head *list); 177void parse_events__set_leader(char *name, struct list_head *list);
181void parse_events_update_lists(struct list_head *list_event, 178void parse_events_update_lists(struct list_head *list_event,
182 struct list_head *list_all); 179 struct list_head *list_all);
183void parse_events_evlist_error(struct parse_events_evlist *data, 180void parse_events_evlist_error(struct parse_events_state *parse_state,
184 int idx, const char *str); 181 int idx, const char *str);
185 182
186void print_events(const char *event_glob, bool name_only, bool quiet, 183void 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
20void parse_events_error(YYLTYPE *loc, void *data, void *scanner, char const *msg); 20void 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) \
23do { \ 23do { \
@@ -33,11 +33,11 @@ do { \
33} while (0) 33} while (0)
34 34
35static void inc_group_count(struct list_head *list, 35static 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
116start_events: groups 116start_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
123groups: 123groups:
@@ -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 |
225event_pmu: 225event_pmu:
226PE_NAME opt_event_config 226PE_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
286event_legacy_symbol: 285event_legacy_symbol:
287value_sym '/' event_config '/' 286value_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|
300value_sym sep_slash_dc 298value_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
312event_legacy_cache: 309event_legacy_cache:
313PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config 310PE_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|
325PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config 322PE_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|
337PE_NAME_CACHE_TYPE opt_event_config 334PE_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
349event_legacy_mem: 346event_legacy_mem:
350PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc 347PE_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|
361PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc 358PE_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|
372PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc 369PE_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|
383PE_PREFIX_MEM PE_VALUE sep_dc 380PE_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
394event_legacy_tracepoint: 391event_legacy_tracepoint:
395tracepoint_name opt_event_config 392tracepoint_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
432event_legacy_numeric: 429event_legacy_numeric:
433PE_VALUE ':' PE_VALUE opt_event_config 430PE_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
444event_legacy_raw: 440event_legacy_raw:
445PE_RAW opt_event_config 441PE_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
456event_bpf_file: 451event_bpf_file:
457PE_BPF_OBJECT opt_event_config 452PE_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|
469PE_BPF_SOURCE opt_event_config 464PE_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
495start_terms: event_config 489start_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
501event_config: 495event_config:
@@ -685,9 +679,9 @@ sep_slash_dc: '/' | ':' |
685 679
686%% 680%%
687 681
688void parse_events_error(YYLTYPE *loc, void *data, 682void 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}