From: Wang Nan <wangnan0@huawei.com>
To: <acme@redhat.com>, <ast@plumgrid.com>
Cc: <brendan.d.gregg@gmail.com>, <daniel@iogearbox.net>,
<dsahern@gmail.com>, <hekuang@huawei.com>, <jolsa@kernel.org>,
<xiakaixu@huawei.com>, <masami.hiramatsu.pt@hitachi.com>,
<namhyung@kernel.org>, <a.p.zijlstra@chello.nl>,
<lizefan@huawei.com>, <pi3orama@163.com>,
<linux-kernel@vger.kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Ingo Molnar <mingo@redhat.com>,
Steven Rostedt <rostedt@goodmis.org>,
"Wang Nan" <wangnan0@huawei.com>
Subject: [PATCH 32/32] bpf: Introduce function for outputing data to perf event
Date: Fri, 28 Aug 2015 07:06:10 +0000 [thread overview]
Message-ID: <1440745570-150857-33-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1440745570-150857-1-git-send-email-wangnan0@huawei.com>
From: He Kuang <hekuang@huawei.com>
There're scenarios that we need an eBPF program to record not only
kprobe point args, but also the PMU counters, time latencies or the
number of cache misses between two probe points and other information
when the probe point is entered.
This patch adds a new trace event to establish infrastruction for bpf to
output data to perf. Userspace perf tools can detect and use this event
as using the existing tracepoint events.
New bpf trace event entry in debugfs:
/sys/kernel/debug/tracing/events/bpf/bpf_output_data
Userspace perf tools detect the new tracepoint event as:
bpf:bpf_output_data [Tracepoint event]
Data in ring-buffer of perf events added to this event will be polled
out, sample types and other attributes can be adjusted to those events
directly without touching the original kprobe events.
The bpf helper function gives eBPF program ability to output data as
perf sample event. This helper simple call the new trace event and
userspace perf tools can record the BPF ftrace event to collect those
records.
Signed-off-by: He Kuang <hekuang@huawei.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: pi3orama@163.com
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/1437448130-134621-3-git-send-email-hekuang@huawei.com
---
include/trace/events/bpf.h | 30 ++++++++++++++++++++++++++++++
include/uapi/linux/bpf.h | 7 +++++++
kernel/trace/bpf_trace.c | 23 +++++++++++++++++++++++
samples/bpf/bpf_helpers.h | 2 ++
4 files changed, 62 insertions(+)
create mode 100644 include/trace/events/bpf.h
diff --git a/include/trace/events/bpf.h b/include/trace/events/bpf.h
new file mode 100644
index 0000000..6b739b8
--- /dev/null
+++ b/include/trace/events/bpf.h
@@ -0,0 +1,30 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM bpf
+
+#if !defined(_TRACE_BPF_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_BPF_H
+
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(bpf_output_data,
+
+ TP_PROTO(u64 *src, int size),
+
+ TP_ARGS(src, size),
+
+ TP_STRUCT__entry(
+ __dynamic_array(u8, buf, size)
+ ),
+
+ TP_fast_assign(
+ memcpy(__get_dynamic_array(buf), src, size);
+ ),
+
+ TP_printk("%s", __print_hex(__get_dynamic_array(buf),
+ __get_dynamic_array_len(buf)))
+);
+
+#endif /* _TRACE_BPF_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 29ef6f9..5068ab1 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -249,6 +249,13 @@ enum bpf_func_id {
* Return: 0 on success
*/
BPF_FUNC_get_current_comm,
+
+ /**
+ * int bpf_output_trace_data(void *src, int size)
+ * Return: 0 on success
+ */
+ BPF_FUNC_output_trace_data,
+
__BPF_FUNC_MAX_ID,
};
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 88a041a..219f670 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -11,7 +11,10 @@
#include <linux/filter.h>
#include <linux/uaccess.h>
#include <linux/ctype.h>
+
#include "trace.h"
+#define CREATE_TRACE_POINTS
+#include <trace/events/bpf.h>
static DEFINE_PER_CPU(int, bpf_prog_active);
@@ -79,6 +82,24 @@ static const struct bpf_func_proto bpf_probe_read_proto = {
.arg3_type = ARG_ANYTHING,
};
+static u64 bpf_output_trace_data(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5)
+{
+ void *src = (void *) (long) r1;
+ int size = (int) r2;
+
+ trace_bpf_output_data(src, size);
+
+ return 0;
+}
+
+static const struct bpf_func_proto bpf_output_trace_data_proto = {
+ .func = bpf_output_trace_data,
+ .gpl_only = true,
+ .ret_type = RET_INTEGER,
+ .arg1_type = ARG_PTR_TO_STACK,
+ .arg2_type = ARG_CONST_STACK_SIZE,
+};
+
/*
* limited trace_printk()
* only %d %u %x %ld %lu %lx %lld %llu %llx %p conversion specifiers allowed
@@ -169,6 +190,8 @@ static const struct bpf_func_proto *kprobe_prog_func_proto(enum bpf_func_id func
return &bpf_map_delete_elem_proto;
case BPF_FUNC_probe_read:
return &bpf_probe_read_proto;
+ case BPF_FUNC_output_trace_data:
+ return &bpf_output_trace_data_proto;
case BPF_FUNC_ktime_get_ns:
return &bpf_ktime_get_ns_proto;
case BPF_FUNC_tail_call:
diff --git a/samples/bpf/bpf_helpers.h b/samples/bpf/bpf_helpers.h
index bdf1c16..0aeaebe 100644
--- a/samples/bpf/bpf_helpers.h
+++ b/samples/bpf/bpf_helpers.h
@@ -59,5 +59,7 @@ static int (*bpf_l3_csum_replace)(void *ctx, int off, int from, int to, int flag
(void *) BPF_FUNC_l3_csum_replace;
static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, int flags) =
(void *) BPF_FUNC_l4_csum_replace;
+static int (*bpf_output_trace_data)(void *src, int size) =
+ (void *) BPF_FUNC_output_trace_data;
#endif
--
2.1.0
next prev parent reply other threads:[~2015-08-28 7:08 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-28 7:05 [GIT PULL 00/32] perf tools: filtering events using eBPF programs Wang Nan
2015-08-28 7:05 ` [PATCH 01/32] bpf tools: New API to get name from a BPF object Wang Nan
2015-08-28 7:05 ` [PATCH 02/32] perf tools: Don't set cmdline_group_boundary if no evsel is collected Wang Nan
2015-08-28 7:05 ` [PATCH 03/32] perf tools: Introduce dummy evsel Wang Nan
2015-08-28 7:05 ` [PATCH 04/32] perf tools: Make perf depend on libbpf Wang Nan
2015-08-28 7:05 ` [PATCH 05/32] perf ebpf: Add the libbpf glue Wang Nan
2015-08-28 7:05 ` [PATCH 06/32] perf tools: Enable passing bpf object file to --event Wang Nan
2015-08-29 0:50 ` Wangnan (F)
2015-08-28 7:05 ` [PATCH 07/32] perf probe: Attach trace_probe_event with perf_probe_event Wang Nan
2015-08-28 7:05 ` [PATCH 08/32] perf record, bpf: Parse and probe eBPF programs probe points Wang Nan
2015-08-28 7:05 ` [PATCH 09/32] perf bpf: Collect 'struct perf_probe_event' for bpf_program Wang Nan
2015-08-28 7:05 ` [PATCH 10/32] perf record: Load all eBPF object into kernel Wang Nan
2015-08-28 7:05 ` [PATCH 11/32] perf tools: Add bpf_fd field to evsel and config it Wang Nan
2015-08-28 7:05 ` [PATCH 12/32] perf tools: Allow filter option to be applied to bof object Wang Nan
2015-08-28 7:05 ` [PATCH 13/32] perf tools: Attach eBPF program to perf event Wang Nan
2015-08-28 7:05 ` [PATCH 14/32] perf tools: Suppress probing messages when probing by BPF loading Wang Nan
2015-08-28 7:05 ` [PATCH 15/32] perf record: Add clang options for compiling BPF scripts Wang Nan
2015-08-28 7:05 ` [PATCH 16/32] perf tools: Infrastructure for compiling scriptlets when passing '.c' to --event Wang Nan
2015-08-28 7:05 ` [PATCH 17/32] perf tests: Enforce LLVM test for BPF test Wang Nan
2015-08-28 7:05 ` [PATCH 18/32] perf test: Add 'perf test BPF' Wang Nan
2015-08-28 7:05 ` [PATCH 19/32] bpf tools: Load a program with different instances using preprocessor Wang Nan
2015-08-28 7:05 ` [PATCH 20/32] perf tools: Fix probe-event.h include Wang Nan
2015-08-28 7:05 ` [PATCH 21/32] perf probe: Reset args and nargs for probe_trace_event when failure Wang Nan
2015-08-28 7:06 ` [PATCH 22/32] perf tools: Move linux/filter.h to tools/include Wang Nan
2015-08-28 7:06 ` [PATCH 23/32] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan
2015-08-28 7:06 ` [PATCH 24/32] perf tools: Introduce arch_get_reg_info() for x86 Wang Nan
2015-08-28 7:06 ` [PATCH 25/32] perf tools: Add prologue for BPF programs for fetching arguments Wang Nan
2015-08-28 7:06 ` [PATCH 26/32] perf tools: Generate prologue for BPF programs Wang Nan
2015-08-28 7:06 ` [PATCH 27/32] perf tools: Use same BPF program if arguments are identical Wang Nan
2015-08-28 7:06 ` [PATCH 28/32] perf record: Support custom vmlinux path Wang Nan
2015-08-28 7:06 ` [PATCH 29/32] perf probe: Init symbol as kprobe Wang Nan
2015-08-28 7:06 ` [PATCH 30/32] perf tools: Support attach BPF program on uprobe events Wang Nan
2015-08-28 7:06 ` [PATCH 31/32] tools lib traceevent: Support function __get_dynamic_array_len Wang Nan
2015-08-29 0:29 ` Alexei Starovoitov
2015-08-28 7:06 ` Wang Nan [this message]
2015-08-29 0:45 ` [PATCH 32/32] bpf: Introduce function for outputing data to perf event Alexei Starovoitov
2015-08-29 1:19 ` Wangnan (F)
2015-08-29 1:34 ` Alexei Starovoitov
2015-08-29 2:15 ` Wangnan (F)
2015-08-29 2:22 ` Alexei Starovoitov
2015-08-29 2:36 ` Wangnan (F)
2015-08-29 2:49 ` Alexei Starovoitov
2015-08-29 2:50 ` Wangnan (F)
2015-08-29 0:25 ` [GIT PULL 00/32] perf tools: filtering events using eBPF programs Alexei Starovoitov
2015-08-31 13:59 ` Arnaldo Carvalho de Melo
2015-08-31 14:07 ` Wangnan (F)
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=1440745570-150857-33-git-send-email-wangnan0@huawei.com \
--to=wangnan0@huawei.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@kernel.org \
--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=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=pi3orama@163.com \
--cc=rostedt@goodmis.org \
--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
all inboxes | Powered by JetHome®