Thread (78 messages) 78 messages, 3 authors, 2021-11-08
STALE1685d

[PATCH 22/59] perf tools: Add evsel__new callback to parse_state_ops

From: Jiri Olsa <hidden>
Date: 2021-11-08 13:39:40
Subsystem: performance events subsystem, the rest · Maintainers: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Linus Torvalds

Adding evsel__new callback to parse_state_ops to allow
custom event allocation for event parsing.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 13 ++++++++++---
 tools/perf/util/parse-events.h |  5 +++++
 2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 8f8151738a78..e782a329484e 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -154,6 +154,10 @@ struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
 	},
 };
 
+static struct parse_events_ops parse_state_ops = {
+	.evsel__new = evsel__new_idx,
+};
+
 #define __PERF_EVENT_FIELD(config, name) \
 	((config & PERF_EVENT_##name##_MASK) >> PERF_EVENT_##name##_SHIFT)
 
@@ -376,7 +380,7 @@ __add_event(struct parse_events_state *parse_state,
 	if (init_attr)
 		event_attr_init(attr);
 
-	evsel = evsel__new_idx(attr, *idx);
+	evsel = parse_state->ops->evsel__new(attr, *idx);
 	if (!evsel) {
 		perf_cpu_map__put(cpus);
 		return NULL;
@@ -2256,8 +2260,9 @@ static int parse_events__scanner(const char *str,
 int parse_events_terms(struct list_head *terms, const char *str)
 {
 	struct parse_events_state parse_state = {
-		.terms  = NULL,
-		.stoken = PE_START_TERMS,
+		.ops     = &parse_state_ops,
+		.terms   = NULL,
+		.stoken  = PE_START_TERMS,
 	};
 	int ret;
 
@@ -2283,6 +2288,7 @@ static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
 		.stoken          = PE_START_EVENTS,
 		.hybrid_pmu_name = pmu_name,
 		.idx             = parse_state->idx,
+		.ops             = &parse_state_ops,
 	};
 	int ret;
 
@@ -2311,6 +2317,7 @@ int __parse_events(struct evlist *evlist, const char *str,
 		.evlist	  = evlist,
 		.stoken	  = PE_START_EVENTS,
 		.fake_pmu = fake_pmu,
+		.ops	  = &parse_state_ops,
 	};
 	int ret;
 
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index aedb1153a1a1..346c3a8cd381 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -130,6 +130,10 @@ struct parse_events_error {
 	char *first_help;
 };
 
+struct parse_events_ops {
+	struct evsel* (*evsel__new)(struct perf_event_attr *attr, int idx);
+};
+
 struct parse_events_state {
 	struct list_head	   list;
 	int			   idx;
@@ -140,6 +144,7 @@ struct parse_events_state {
 	int			   stoken;
 	struct perf_pmu		  *fake_pmu;
 	char			  *hybrid_pmu_name;
+	struct parse_events_ops	  *ops;
 };
 
 void parse_events__handle_error(struct parse_events_error *err, int idx,
-- 
2.31.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help