lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <1445078910-73699-5-git-send-email-wangnan0@huawei.com> Date: Sat, 17 Oct 2015 10:48:27 +0000 From: Wang Nan <wangnan0@...wei.com> To: <acme@...nel.org>, <ast@...mgrid.com>, <brendan.d.gregg@...il.com> CC: <a.p.zijlstra@...llo.nl>, <daniel@...earbox.net>, <dsahern@...il.com>, <hekuang@...wei.com>, <jolsa@...nel.org>, <lizefan@...wei.com>, <masami.hiramatsu.pt@...achi.com>, <namhyung@...nel.org>, <paulus@...ba.org>, <linux-kernel@...r.kernel.org>, <pi3orama@....com>, <xiakaixu@...wei.com>, Wang Nan <wangnan0@...wei.com>, Arnaldo Carvalho de Melo <acme@...hat.com> Subject: [RFC PATCH 4/7] perf tools: Enable BPF object configure syntax This patch adds the final step for BPF map configuration. A new syntax is appended into parser so user can config BPF objects through '/' '/' enclosed config terms. After this patch, BPF programs for perf are able to get value through perf cmdline like: # perf record -e bpf_file.c/maps.mymap.value=123/ ... Signed-off-by: Wang Nan <wangnan0@...wei.com> Signed-off-by: He Kuang <hekuang@...wei.com> Cc: Arnaldo Carvalho de Melo <acme@...hat.com> Cc: Alexei Starovoitov <ast@...mgrid.com> Cc: Brendan Gregg <brendan.d.gregg@...il.com> Cc: Daniel Borkmann <daniel@...earbox.net> Cc: David Ahern <dsahern@...il.com> Cc: He Kuang <hekuang@...wei.com> Cc: Jiri Olsa <jolsa@...nel.org> Cc: Kaixu Xia <xiakaixu@...wei.com> Cc: Masami Hiramatsu <masami.hiramatsu.pt@...achi.com> Cc: Namhyung Kim <namhyung@...nel.org> Cc: Paul Mackerras <paulus@...ba.org> Cc: Peter Zijlstra <a.p.zijlstra@...llo.nl> Cc: Zefan Li <lizefan@...wei.com> Cc: pi3orama@....com Link: http://lkml.kernel.org/n/ebpf-2mjd96mowgzslkj8jrwbnwg7@git.kernel.org --- tools/perf/util/parse-events.c | 54 +++++++++++++++++++++++++++++++++++++++--- tools/perf/util/parse-events.h | 3 ++- tools/perf/util/parse-events.y | 21 ++++++++++++---- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 06ba5a6..9f081a1 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -624,17 +624,62 @@ errout: return err; } +static int +parse_events_config_bpf(struct parse_events_evlist *data, + struct bpf_object *obj, + struct list_head *head_config) +{ + struct parse_events_term *term; + + if (!head_config || list_empty(head_config)) + return 0; + + list_for_each_entry(term, head_config, list) { + char errbuf[BUFSIZ]; + int err; + + if (term->type_term != PARSE_EVENTS__TERM_TYPE_USER) { + snprintf(errbuf, sizeof(errbuf), + "Invalid config term for BPF object"); + errbuf[BUFSIZ - 1] = '\0'; + + data->error->idx = term->err_term; + data->error->str = strdup(errbuf); + return -EINVAL; + } + + err = bpf__config_obj(obj, term, data->evlist); + if (err) { + bpf__strerror_config_obj(obj, term, data->evlist, + err, errbuf, sizeof(errbuf)); + data->error->help = strdup( +"Hint:\tValid config term:\n" +" \tmaps.<mapname>.value\n" +" \t(add -v to see detail)"); + data->error->str = strdup(errbuf); + if (err == -EINVAL) + data->error->idx = term->err_val; + else + data->error->idx = term->err_term; + return err; + } + } + return 0; + +} + int parse_events_load_bpf(struct parse_events_evlist *data, struct list_head *list, char *bpf_file_name, - bool source) + bool source, + struct list_head *head_config) { struct bpf_object *obj; + int err; obj = bpf__prepare_load(bpf_file_name, source); if (IS_ERR(obj) || !obj) { char errbuf[BUFSIZ]; - int err; err = obj ? PTR_ERR(obj) : -EINVAL; @@ -651,7 +696,10 @@ int parse_events_load_bpf(struct parse_events_evlist *data, return err; } - return parse_events_load_bpf_obj(data, list, obj); + err = parse_events_load_bpf_obj(data, list, obj); + if (err) + return err; + return parse_events_config_bpf(data, obj, head_config); } static int diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index b525353..d4aa88e 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -125,7 +125,8 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx, int parse_events_load_bpf(struct parse_events_evlist *data, struct list_head *list, char *bpf_file_name, - bool source); + bool source, + struct list_head *head_config); /* Provide this function for perf test */ struct bpf_object; int parse_events_load_bpf_obj(struct parse_events_evlist *data, diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 90e382f..255387a 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -64,6 +64,7 @@ static inc_group_count(struct list_head *list, %type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type <num> value_sym %type <head> event_config +%type <head> event_bpf_config %type <term> event_term %type <head> event_pmu %type <head> event_legacy_symbol @@ -468,27 +469,39 @@ PE_RAW } event_bpf_file: -PE_BPF_OBJECT +PE_BPF_OBJECT event_bpf_config { struct parse_events_evlist *data = _data; struct parse_events_error *error = data->error; struct list_head *list; ALLOC_LIST(list); - ABORT_ON(parse_events_load_bpf(data, list, $1, false)); + ABORT_ON(parse_events_load_bpf(data, list, $1, false, $2)); + parse_events__free_terms($2); $$ = list; } | -PE_BPF_SOURCE +PE_BPF_SOURCE event_bpf_config { struct parse_events_evlist *data = _data; struct list_head *list; ALLOC_LIST(list); - ABORT_ON(parse_events_load_bpf(data, list, $1, true)); + ABORT_ON(parse_events_load_bpf(data, list, $1, true, $2)); + parse_events__free_terms($2); $$ = list; } +event_bpf_config: +'/' event_config '/' +{ + $$ = $2; +} +| +{ + $$ = NULL; +} + start_terms: event_config { struct parse_events_terms *data = _data; -- 1.8.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists