The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: Wang Nan <wangnan0@huawei.com>
To: <acme@redhat.com>
Cc: <linux-kernel@vger.kernel.org>, <pi3orama@163.com>,
	<lizefan@huawei.com>, Wang Nan <wangnan0@huawei.com>,
	Alexei Starovoitov <ast@plumgrid.com>,
	Brendan Gregg <brendan.d.gregg@gmail.com>,
	Daniel Borkmann <daniel@iogearbox.net>,
	David Ahern <dsahern@gmail.com>, He Kuang <hekuang@huawei.com>,
	Jiri Olsa <jolsa@kernel.org>, Kaixu Xia <xiakaixu@huawei.com>,
	Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Paul Mackerras <paulus@samba.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 07/22] perf tools: Attach eBPF program to perf event
Date: Thu, 8 Oct 2015 08:29:29 +0000	[thread overview]
Message-ID: <1444292984-13135-8-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1444292984-13135-1-git-send-email-wangnan0@huawei.com>

This is the final patch which makes basic BPF filter work. After
applying this patch, users are allowed to use BPF filter like:

 # perf record --event ./hello_world.o ls

A bpf_fd field is appended to 'struct evsel', and setup during the
callback function add_bpf_event() for each 'probe_trace_event'.

PERF_EVENT_IOC_SET_BPF ioctl is used to attach eBPF program to a newly
created perf event. The file descriptor of the eBPF program is passed to
perf record using previous patches, and stored into evsel->bpf_fd.

It is possible that different perf event are created for one kprobe
events for different CPUs. In this case, when trying to call the
ioctl, EEXIST will be return. This patch doesn't treat it as an error.

Signed-off-by: Wang Nan <wangnan0@huawei.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: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Link: http://lkml.kernel.org/n/ebpf-6yw9eg0ej3l4jnqhinngkw86@git.kernel.org
---
 tools/perf/util/evsel.c        | 17 +++++++++++++++++
 tools/perf/util/evsel.h        |  1 +
 tools/perf/util/parse-events.c |  4 ++++
 3 files changed, 22 insertions(+)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 8be867c..7d12af5 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -208,6 +208,7 @@ void perf_evsel__init(struct perf_evsel *evsel,
 	evsel->unit	   = "";
 	evsel->scale	   = 1.0;
 	evsel->evlist	   = NULL;
+	evsel->bpf_fd	   = -1;
 	INIT_LIST_HEAD(&evsel->node);
 	INIT_LIST_HEAD(&evsel->config_terms);
 	perf_evsel__object.init(evsel);
@@ -1346,6 +1347,22 @@ retry_open:
 					  err);
 				goto try_fallback;
 			}
+
+			if (evsel->bpf_fd >= 0) {
+				int evt_fd = FD(evsel, cpu, thread);
+				int bpf_fd = evsel->bpf_fd;
+
+				err = ioctl(evt_fd,
+					    PERF_EVENT_IOC_SET_BPF,
+					    bpf_fd);
+				if (err && errno != EEXIST) {
+					pr_err("failed to attach bpf fd %d: %s\n",
+					       bpf_fd, strerror(errno));
+					err = -EINVAL;
+					goto out_close;
+				}
+			}
+
 			set_rlimit = NO_CHANGE;
 
 			/*
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 02a5fed..a60b5d5 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -121,6 +121,7 @@ struct perf_evsel {
 	char			*group_name;
 	bool			cmdline_group_boundary;
 	struct list_head	config_terms;
+	int			bpf_fd;
 };
 
 union u64_swap {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 3c4842c..771b906 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -541,6 +541,7 @@ static int add_bpf_event(struct probe_trace_event *tev, int fd,
 	struct __add_bpf_event_param *param = _param;
 	struct parse_events_evlist *evlist = param->data;
 	struct list_head *list = param->list;
+	struct perf_evsel *pos;
 	int err;
 
 	pr_debug("add bpf event %s:%s and attach bpf program %d\n",
@@ -560,6 +561,9 @@ static int add_bpf_event(struct probe_trace_event *tev, int fd,
 		return err;
 	}
 	pr_debug("adding %s:%s\n", tev->group, tev->event);
+
+	list_for_each_entry(pos, list, node)
+		pos->bpf_fd = fd;
 	return 0;
 }
 
-- 
1.8.3.4


  parent reply	other threads:[~2015-10-08  8:44 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-08  8:29 [GIT PULL 00/22] perf tools: filtering events using eBPF programs Wang Nan
2015-10-08  8:29 ` [PATCH 01/22] perf tools: Make perf depend on libbpf Wang Nan
2015-10-08  8:29 ` [PATCH 02/22] perf ebpf: Add the libbpf glue Wang Nan
2015-10-08  8:29 ` [PATCH 03/22] perf tools: Enable passing bpf object file to --event Wang Nan
2015-10-08  8:29 ` [PATCH 04/22] perf record, bpf: Create probe points for BPF programs Wang Nan
2015-10-08  8:29 ` [PATCH 05/22] perf record: Load eBPF object into kernel Wang Nan
2015-10-08  8:29 ` [PATCH 06/22] perf tools: Collect perf_evsel in BPF object files Wang Nan
2015-10-08  8:29 ` Wang Nan [this message]
2015-10-08  8:29 ` [PATCH 08/22] perf record: Add clang options for compiling BPF scripts Wang Nan
2015-10-08  8:29 ` [PATCH 09/22] perf tools: Compile scriptlets to BPF objects when passing '.c' to --event Wang Nan
2015-10-08  8:29 ` [PATCH 10/22] perf test: Enforce LLVM test for BPF test Wang Nan
2015-10-08  8:29 ` [PATCH 11/22] perf test: Add 'perf test BPF' Wang Nan
2015-10-08  8:29 ` [PATCH 12/22] perf probe: Reset args and nargs for probe_trace_event when failure Wang Nan
2015-10-08  8:29 ` [PATCH 13/22] bpf tools: Load a program with different instances using preprocessor Wang Nan
2015-10-08  8:29 ` [PATCH 14/22] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan
2015-10-08  8:29 ` [PATCH 15/22] perf tools: Compile dwarf-regs.c if CONFIG_BPF_PROLOGUE is on Wang Nan
2015-10-08  8:29 ` [PATCH 16/22] perf tools: Add prologue for BPF programs for fetching arguments Wang Nan
2015-10-08  8:29 ` [PATCH 17/22] perf tools: Generate prologue for BPF programs Wang Nan
2015-10-08  8:29 ` [PATCH 18/22] perf tools: Use same BPF program if arguments are identical Wang Nan
2015-10-08  8:29 ` [PATCH 19/22] perf record: Support custom vmlinux path Wang Nan
2015-10-08  8:29 ` [PATCH 20/22] perf tools: Allow BPF program attach to uprobe events Wang Nan
2015-10-08  8:29 ` [PATCH 21/22] perf test: Enforce LLVM test, add kbuild test Wang Nan
2015-10-08  8:29 ` [PATCH 22/22] perf test: Test BPF prologue Wang Nan
2015-10-08 13:45 ` [GIT PULL 00/22] perf tools: filtering events using eBPF programs Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1444292984-13135-8-git-send-email-wangnan0@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@redhat.com \
    --cc=ast@plumgrid.com \
    --cc=brendan.d.gregg@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=dsahern@gmail.com \
    --cc=hekuang@huawei.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=namhyung@kernel.org \
    --cc=paulus@samba.org \
    --cc=pi3orama@163.com \
    --cc=xiakaixu@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox