aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/parse-events.c
diff options
context:
space:
mode:
authorWang Nan <wangnan0@huawei.com>2015-10-14 08:41:14 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-10-28 11:48:12 -0400
commit84c86ca12b2189df751eed7b2d67cb63bc8feda5 (patch)
tree428334c3c12ff87391c478220cdf6985bc1c5a77 /tools/perf/util/parse-events.c
parent69d262a93a25cf475012ea2e00aeb29f4932c028 (diff)
perf tools: Enable passing bpf object file to --event
By introducing new rules in tools/perf/util/parse-events.[ly], this patch enables 'perf record --event bpf_file.o' to select events by an eBPF object file. It calls parse_events_load_bpf() to load that file, which uses bpf__prepare_load() and finally calls bpf_object__open() for the object files. After applying this patch, commands like: # perf record --event foo.o sleep become possible. However, at this point it is unable to link any useful things onto the evsel list because the creating of probe points and BPF program attaching have not been implemented. Before real events are possible to be extracted, to avoid perf report error because of empty evsel list, this patch link a dummy evsel. The dummy event related code will be removed when probing and extracting code is ready. Commiter notes: Using it: $ ls -la foo.o ls: cannot access foo.o: No such file or directory $ perf record --event foo.o sleep libbpf: failed to open foo.o: No such file or directory event syntax error: 'foo.o' \___ BPF object file 'foo.o' is invalid (add -v to see detail) Run 'perf list' for a list of valid events Usage: perf record [<options>] [<command>] or: perf record [<options>] -- <command> [<options>] -e, --event <event> event selector. use 'perf list' to list available events $ $ file /tmp/build/perf/perf.o /tmp/build/perf/perf.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped $ perf record --event /tmp/build/perf/perf.o sleep libbpf: /tmp/build/perf/perf.o is not an eBPF object file event syntax error: '/tmp/build/perf/perf.o' \___ BPF object file '/tmp/build/perf/perf.o' is invalid (add -v to see detail) Run 'perf list' for a list of valid events Usage: perf record [<options>] [<command>] or: perf record [<options>] -- <command> [<options>] -e, --event <event> event selector. use 'perf list' to list available events $ $ file /tmp/foo.o /tmp/foo.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped $ perf record --event /tmp/foo.o sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.013 MB perf.data ] $ perf evlist /tmp/foo.o $ perf evlist -v /tmp/foo.o: type: 1, size: 112, config: 0x9, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1 $ So, type 1 is PERF_TYPE_SOFTWARE, config 0x9 is PERF_COUNT_SW_DUMMY, ok. $ perf report --stdio Error: The perf.data file has no samples! # To display the perf.data header info, please use --header/--header-only options. # $ Signed-off-by: Wang Nan <wangnan0@huawei.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexei Starovoitov <ast@plumgrid.com> Cc: Brendan Gregg <brendan.d.gregg@gmail.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: David Ahern <dsahern@gmail.com> Cc: He Kuang <hekuang@huawei.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kaixu Xia <xiakaixu@huawei.com> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1444826502-49291-4-git-send-email-wangnan0@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/parse-events.c')
-rw-r--r--tools/perf/util/parse-events.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 72abcf254ccb..a9e1d79d17d7 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -11,6 +11,7 @@
11#include "symbol.h" 11#include "symbol.h"
12#include "cache.h" 12#include "cache.h"
13#include "header.h" 13#include "header.h"
14#include "bpf-loader.h"
14#include "debug.h" 15#include "debug.h"
15#include <api/fs/tracing_path.h> 16#include <api/fs/tracing_path.h>
16#include "parse-events-bison.h" 17#include "parse-events-bison.h"
@@ -529,6 +530,62 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
529 return ret; 530 return ret;
530} 531}
531 532
533int parse_events_load_bpf_obj(struct parse_events_evlist *data,
534 struct list_head *list,
535 struct bpf_object *obj)
536{
537 int err;
538 char errbuf[BUFSIZ];
539
540 if (IS_ERR(obj) || !obj) {
541 snprintf(errbuf, sizeof(errbuf),
542 "Internal error: load bpf obj with NULL");
543 err = -EINVAL;
544 goto errout;
545 }
546
547 /*
548 * Temporary add a dummy event here so we can check whether
549 * basic bpf loader works. Following patches will replace
550 * dummy event by useful evsels.
551 */
552 return parse_events_add_numeric(data, list, PERF_TYPE_SOFTWARE,
553 PERF_COUNT_SW_DUMMY, NULL);
554errout:
555 data->error->help = strdup("(add -v to see detail)");
556 data->error->str = strdup(errbuf);
557 return err;
558}
559
560int parse_events_load_bpf(struct parse_events_evlist *data,
561 struct list_head *list,
562 char *bpf_file_name)
563{
564 struct bpf_object *obj;
565
566 obj = bpf__prepare_load(bpf_file_name);
567 if (IS_ERR(obj) || !obj) {
568 char errbuf[BUFSIZ];
569 int err;
570
571 err = obj ? PTR_ERR(obj) : -EINVAL;
572
573 if (err == -ENOTSUP)
574 snprintf(errbuf, sizeof(errbuf),
575 "BPF support is not compiled");
576 else
577 snprintf(errbuf, sizeof(errbuf),
578 "BPF object file '%s' is invalid",
579 bpf_file_name);
580
581 data->error->help = strdup("(add -v to see detail)");
582 data->error->str = strdup(errbuf);
583 return err;
584 }
585
586 return parse_events_load_bpf_obj(data, list, obj);
587}
588
532static int 589static int
533parse_breakpoint_type(const char *type, struct perf_event_attr *attr) 590parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
534{ 591{