[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