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

[PATCH 56/59] libperf: Move in parse_events_add_breakpoint function

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

Moving parse_events_add_breakpoint function to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  |  3 +
 tools/lib/perf/parse-events.c                 | 72 +++++++++++++++++++
 tools/perf/util/parse-events.c                | 70 ------------------
 3 files changed, 75 insertions(+), 70 deletions(-)
diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 5020a1b2bff2..e6af1ad6e7ac 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -197,4 +197,7 @@ int parse_events_name(struct list_head *list, const char *name);
 int parse_events__scanner(const char *str,
 			  struct parse_events_state *parse_state,
 			  bool terms);
+int parse_events_add_breakpoint(struct parse_events_state *parse_state,
+				struct list_head *list,
+				u64 addr, char *type, u64 len);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index da684023b273..1c1fbbeb7182 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -2,6 +2,7 @@
 
 #include <internal/parse-events.h>
 #include <linux/perf_event.h>
+#include <linux/hw_breakpoint.h>
 #include <linux/zalloc.h>
 #include <string.h>
 #include <internal/parse-events.h>
@@ -630,3 +631,74 @@ int parse_events__scanner(const char *str,
 	parse_events_lex_destroy(scanner);
 	return ret;
 }
+
+static int
+parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
+{
+	int i;
+
+	for (i = 0; i < 3; i++) {
+		if (!type || !type[i])
+			break;
+
+#define CHECK_SET_TYPE(bit)		\
+do {					\
+	if (attr->bp_type & bit)	\
+		return -EINVAL;		\
+	else				\
+		attr->bp_type |= bit;	\
+} while (0)
+
+		switch (type[i]) {
+		case 'r':
+			CHECK_SET_TYPE(HW_BREAKPOINT_R);
+			break;
+		case 'w':
+			CHECK_SET_TYPE(HW_BREAKPOINT_W);
+			break;
+		case 'x':
+			CHECK_SET_TYPE(HW_BREAKPOINT_X);
+			break;
+		default:
+			return -EINVAL;
+		}
+	}
+
+#undef CHECK_SET_TYPE
+
+	if (!attr->bp_type) /* Default */
+		attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W;
+
+	return 0;
+}
+
+int parse_events_add_breakpoint(struct parse_events_state *parse_state,
+				struct list_head *list,
+				u64 addr, char *type, u64 len)
+{
+	struct perf_event_attr attr;
+
+	memset(&attr, 0, sizeof(attr));
+	attr.bp_addr = addr;
+
+	if (parse_breakpoint_type(type, &attr))
+		return -EINVAL;
+
+	/* Provide some defaults if len is not specified */
+	if (!len) {
+		if (attr.bp_type == HW_BREAKPOINT_X)
+			len = sizeof(long);
+		else
+			len = HW_BREAKPOINT_LEN_4;
+	}
+
+	attr.bp_len = len;
+
+	attr.type = PERF_TYPE_BREAKPOINT;
+	attr.sample_period = 1;
+
+	return perf_evsel__add_event(parse_state, list, &attr,
+				     /*init_attr*/true, /*name=*/NULL, /*mertic_id=*/NULL,
+				     /*pmu=*/NULL, /*config_terms=*/NULL,
+				     /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOENT;
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 44980b34e367..02f46689f483 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -844,76 +844,6 @@ int parse_events_load_bpf(struct parse_events_state *parse_state,
 }
 #endif // HAVE_LIBBPF_SUPPORT
 
-static int
-parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
-{
-	int i;
-
-	for (i = 0; i < 3; i++) {
-		if (!type || !type[i])
-			break;
-
-#define CHECK_SET_TYPE(bit)		\
-do {					\
-	if (attr->bp_type & bit)	\
-		return -EINVAL;		\
-	else				\
-		attr->bp_type |= bit;	\
-} while (0)
-
-		switch (type[i]) {
-		case 'r':
-			CHECK_SET_TYPE(HW_BREAKPOINT_R);
-			break;
-		case 'w':
-			CHECK_SET_TYPE(HW_BREAKPOINT_W);
-			break;
-		case 'x':
-			CHECK_SET_TYPE(HW_BREAKPOINT_X);
-			break;
-		default:
-			return -EINVAL;
-		}
-	}
-
-#undef CHECK_SET_TYPE
-
-	if (!attr->bp_type) /* Default */
-		attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W;
-
-	return 0;
-}
-
-static
-int parse_events_add_breakpoint(struct parse_events_state *parse_state,
-				struct list_head *list,
-				u64 addr, char *type, u64 len)
-{
-	struct perf_event_attr attr;
-
-	memset(&attr, 0, sizeof(attr));
-	attr.bp_addr = addr;
-
-	if (parse_breakpoint_type(type, &attr))
-		return -EINVAL;
-
-	/* Provide some defaults if len is not specified */
-	if (!len) {
-		if (attr.bp_type == HW_BREAKPOINT_X)
-			len = sizeof(long);
-		else
-			len = HW_BREAKPOINT_LEN_4;
-	}
-
-	attr.bp_len = len;
-
-	attr.type = PERF_TYPE_BREAKPOINT;
-	attr.sample_period = 1;
-
-	return add_event(parse_state, list, &attr, /*name=*/NULL, /*mertic_id=*/NULL,
-			 /*config_terms=*/NULL);
-}
-
 static int check_type_val(struct parse_events_term *term,
 			  struct parse_events_error *err,
 			  int type)
-- 
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