From: Alexei Starovoitov <ast@kernel.org>
To: "David S . Miller" <davem@davemloft.net>
Cc: <daniel@iogearbox.net>, <peterz@infradead.org>, <acme@kernel.org>,
<netdev@vger.kernel.org>, <kernel-team@fb.com>
Subject: [PATCH bpf-next 1/3] perf/core: introduce perf_event_mmap_bpf_prog
Date: Wed, 19 Sep 2018 15:39:33 -0700 [thread overview]
Message-ID: <20180919223935.999270-2-ast@kernel.org> (raw)
In-Reply-To: <20180919223935.999270-1-ast@kernel.org>
introduce perf_event_mmap_bpf_prog() helper to emit RECORD_MMAP events
into perf ring buffer.
It's used by bpf load/unload logic to notify user space of addresses
and names of JITed bpf programs.
Note that event->mmap.pid == -1 is an existing indicator of kernel event.
In addition use event->mmap.tid == BPF_FS_MAGIC to indicate bpf related
RECORD_MMAP event.
Alternatively it's possible to introduce new 'enum perf_event_type' command
specificially for bpf prog load/unload, but existing RECORD_MMAP
is very close, so the choice made by this patch is to extend it.
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
include/linux/perf_event.h | 1 +
kernel/events/core.c | 44 +++++++++++++++++++++++++++++++++-----
2 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 53c500f0ca79..0e79af83138f 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1113,6 +1113,7 @@ static inline void perf_event_task_sched_out(struct task_struct *prev,
}
extern void perf_event_mmap(struct vm_area_struct *vma);
+void perf_event_mmap_bpf_prog(u64 start, u64 len, char *name, int size);
extern struct perf_guest_info_callbacks *perf_guest_cbs;
extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 2a62b96600ad..c48244ddf993 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7152,7 +7152,7 @@ static int perf_event_mmap_match(struct perf_event *event,
{
struct perf_mmap_event *mmap_event = data;
struct vm_area_struct *vma = mmap_event->vma;
- int executable = vma->vm_flags & VM_EXEC;
+ int executable = !vma || vma->vm_flags & VM_EXEC;
return (!executable && event->attr.mmap_data) ||
(executable && (event->attr.mmap || event->attr.mmap2));
@@ -7165,12 +7165,13 @@ static void perf_event_mmap_output(struct perf_event *event,
struct perf_output_handle handle;
struct perf_sample_data sample;
int size = mmap_event->event_id.header.size;
+ bool bpf_event = !mmap_event->vma;
int ret;
if (!perf_event_mmap_match(event, data))
return;
- if (event->attr.mmap2) {
+ if (event->attr.mmap2 && !bpf_event) {
mmap_event->event_id.header.type = PERF_RECORD_MMAP2;
mmap_event->event_id.header.size += sizeof(mmap_event->maj);
mmap_event->event_id.header.size += sizeof(mmap_event->min);
@@ -7186,12 +7187,14 @@ static void perf_event_mmap_output(struct perf_event *event,
if (ret)
goto out;
- mmap_event->event_id.pid = perf_event_pid(event, current);
- mmap_event->event_id.tid = perf_event_tid(event, current);
+ if (!bpf_event) {
+ mmap_event->event_id.pid = perf_event_pid(event, current);
+ mmap_event->event_id.tid = perf_event_tid(event, current);
+ }
perf_output_put(&handle, mmap_event->event_id);
- if (event->attr.mmap2) {
+ if (event->attr.mmap2 && !bpf_event) {
perf_output_put(&handle, mmap_event->maj);
perf_output_put(&handle, mmap_event->min);
perf_output_put(&handle, mmap_event->ino);
@@ -7448,6 +7451,37 @@ void perf_event_mmap(struct vm_area_struct *vma)
perf_event_mmap_event(&mmap_event);
}
+void perf_event_mmap_bpf_prog(u64 start, u64 len, char *name, int size)
+{
+ struct perf_mmap_event mmap_event;
+
+ if (!atomic_read(&nr_mmap_events))
+ return;
+
+ if (!IS_ALIGNED(size, sizeof(u64))) {
+ WARN_ONCE(1, "size is not aligned\n");
+ return;
+ }
+
+ mmap_event = (struct perf_mmap_event){
+ .file_name = name,
+ .file_size = size,
+ .event_id = {
+ .header = {
+ .type = PERF_RECORD_MMAP,
+ .misc = PERF_RECORD_MISC_KERNEL,
+ .size = sizeof(mmap_event.event_id) + size,
+ },
+ .pid = -1, /* indicates kernel */
+ .tid = BPF_FS_MAGIC, /* bpf mmap event */
+ .start = start,
+ .len = len,
+ .pgoff = start,
+ },
+ };
+ perf_iterate_sb(perf_event_mmap_output, &mmap_event, NULL);
+}
+
void perf_event_aux_event(struct perf_event *event, unsigned long head,
unsigned long size, u64 flags)
{
--
2.17.1
next prev parent reply other threads:[~2018-09-20 4:19 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-19 22:39 [PATCH bpf-next 0/3] perf, bpf: reveal invisible bpf programs Alexei Starovoitov
2018-09-19 22:39 ` Alexei Starovoitov [this message]
2018-09-19 23:30 ` [PATCH bpf-next 1/3] perf/core: introduce perf_event_mmap_bpf_prog Song Liu
2018-09-20 0:53 ` Alexei Starovoitov
2018-09-19 22:39 ` [PATCH bpf-next 2/3] bpf: emit RECORD_MMAP events for bpf prog load/unload Alexei Starovoitov
2018-09-19 23:44 ` Song Liu
2018-09-20 0:59 ` Alexei Starovoitov
2018-09-20 5:48 ` Song Liu
2018-09-20 8:44 ` Peter Zijlstra
2018-09-20 13:25 ` Arnaldo Carvalho de Melo
2018-09-20 13:56 ` Peter Zijlstra
2018-09-21 3:14 ` Alexei Starovoitov
2018-09-21 12:25 ` Arnaldo Carvalho de Melo
2018-09-21 13:55 ` Peter Zijlstra
2018-09-21 13:59 ` Peter Zijlstra
2018-09-21 22:13 ` Alexei Starovoitov
2018-10-15 23:33 ` Song Liu
2018-10-16 23:43 ` David Ahern
2018-10-17 6:43 ` Song Liu
2018-10-17 12:11 ` Arnaldo Carvalho de Melo
2018-10-17 12:50 ` Arnaldo Carvalho de Melo
2018-10-17 16:06 ` Song Liu
2018-11-02 1:08 ` Song Liu
2018-10-17 15:09 ` David Ahern
2018-10-17 16:18 ` Song Liu
2018-10-17 16:36 ` Alexei Starovoitov
2018-10-17 18:53 ` Arnaldo Carvalho de Melo
2018-10-17 19:08 ` Alexei Starovoitov
2018-10-17 21:31 ` Arnaldo Carvalho de Melo
2018-10-17 22:01 ` Alexei Starovoitov
2018-09-20 13:36 ` Peter Zijlstra
2018-09-19 22:39 ` [PATCH perf 3/3] tools/perf: recognize and process RECORD_MMAP events for bpf progs Alexei Starovoitov
2018-09-20 13:36 ` Arnaldo Carvalho de Melo
2018-09-20 14:05 ` Arnaldo Carvalho de Melo
2018-09-21 22:57 ` Song Liu
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=20180919223935.999270-2-ast@kernel.org \
--to=ast@kernel.org \
--cc=acme@kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=kernel-team@fb.com \
--cc=netdev@vger.kernel.org \
--cc=peterz@infradead.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.