* [PATCH bpf-next v3 0/3] add support for writable bare tracepoint
@ 2021-09-28 14:07 Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 1/3] bpf: support writable context for " Hou Tao
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Hou Tao @ 2021-09-28 14:07 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Yonghong Song, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, netdev, bpf, houtao1
Hi,
The patchset series supports writable context for bare tracepoint.
The main idea comes from patchset "writable contexts for bpf raw
tracepoints" [1], but it only supports normal tracepoint with
associated trace event under tracefs. Now we have one use case
in which we will add bare tracepoint in VFS layer, and update
file::f_mode for specific files. The reason using bare tracepoint
is that it doesn't form a ABI and we can change it freely. So
add support for it in BPF.
Comments are always welcome.
[1]: https://lore.kernel.org/lkml/20190426184951.21812-1-mmullins@fb.com
Change log:
v3:
* use raw_tp.w instead of raw_tp_writable as section
name of writable tp
* use ASSERT_XXX() instead of CHECK()
* define a common macro for "/sys/kernel/bpf_testmod"
v2: https://www.spinics.net/lists/bpf/msg46356.html
* rebase on bpf-next tree
* address comments from Yonghong Song
* rename bpf_testmode_test_writable_ctx::ret as early_ret to reflect
its purpose better.
v1: https://www.spinics.net/lists/bpf/msg46221.html
Hou Tao (3):
bpf: support writable context for bare tracepoint
libbpf: support detecting and attaching of writable tracepoint program
bpf/selftests: add test for writable bare tracepoint
include/trace/bpf_probe.h | 19 +++++++---
tools/lib/bpf/libbpf.c | 4 +++
.../bpf/bpf_testmod/bpf_testmod-events.h | 15 ++++++++
.../selftests/bpf/bpf_testmod/bpf_testmod.c | 10 ++++++
.../selftests/bpf/bpf_testmod/bpf_testmod.h | 5 +++
.../selftests/bpf/prog_tests/module_attach.c | 35 +++++++++++++++++++
.../selftests/bpf/progs/test_module_attach.c | 14 ++++++++
tools/testing/selftests/bpf/test_progs.c | 4 +--
tools/testing/selftests/bpf/test_progs.h | 2 ++
9 files changed, 102 insertions(+), 6 deletions(-)
--
2.29.2
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH bpf-next v3 1/3] bpf: support writable context for bare tracepoint
2021-09-28 14:07 [PATCH bpf-next v3 0/3] add support for writable bare tracepoint Hou Tao
@ 2021-09-28 14:07 ` Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 2/3] libbpf: support detecting and attaching of writable tracepoint program Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 3/3] bpf/selftests: add test for writable bare tracepoint Hou Tao
2 siblings, 0 replies; 6+ messages in thread
From: Hou Tao @ 2021-09-28 14:07 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Yonghong Song, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, netdev, bpf, houtao1
Commit 9df1c28bb752 ("bpf: add writable context for raw tracepoints")
supports writable context for tracepoint, but it misses the support
for bare tracepoint which has no associated trace event.
Bare tracepoint is defined by DECLARE_TRACE(), so adding a corresponding
DECLARE_TRACE_WRITABLE() macro to generate a definition in __bpf_raw_tp_map
section for bare tracepoint in a similar way to DEFINE_TRACE_WRITABLE().
Signed-off-by: Hou Tao <houtao1@huawei.com>
---
include/trace/bpf_probe.h | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/include/trace/bpf_probe.h b/include/trace/bpf_probe.h
index a23be89119aa..a8e97f84b652 100644
--- a/include/trace/bpf_probe.h
+++ b/include/trace/bpf_probe.h
@@ -93,8 +93,7 @@ __section("__bpf_raw_tp_map") = { \
#define FIRST(x, ...) x
-#undef DEFINE_EVENT_WRITABLE
-#define DEFINE_EVENT_WRITABLE(template, call, proto, args, size) \
+#define __CHECK_WRITABLE_BUF_SIZE(call, proto, args, size) \
static inline void bpf_test_buffer_##call(void) \
{ \
/* BUILD_BUG_ON() is ignored if the code is completely eliminated, but \
@@ -103,8 +102,12 @@ static inline void bpf_test_buffer_##call(void) \
*/ \
FIRST(proto); \
(void)BUILD_BUG_ON_ZERO(size != sizeof(*FIRST(args))); \
-} \
-__DEFINE_EVENT(template, call, PARAMS(proto), PARAMS(args), size)
+}
+
+#undef DEFINE_EVENT_WRITABLE
+#define DEFINE_EVENT_WRITABLE(template, call, proto, args, size) \
+ __CHECK_WRITABLE_BUF_SIZE(call, PARAMS(proto), PARAMS(args), size) \
+ __DEFINE_EVENT(template, call, PARAMS(proto), PARAMS(args), size)
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, call, proto, args) \
@@ -119,9 +122,17 @@ __DEFINE_EVENT(template, call, PARAMS(proto), PARAMS(args), size)
__BPF_DECLARE_TRACE(call, PARAMS(proto), PARAMS(args)) \
__DEFINE_EVENT(call, call, PARAMS(proto), PARAMS(args), 0)
+#undef DECLARE_TRACE_WRITABLE
+#define DECLARE_TRACE_WRITABLE(call, proto, args, size) \
+ __CHECK_WRITABLE_BUF_SIZE(call, PARAMS(proto), PARAMS(args), size) \
+ __BPF_DECLARE_TRACE(call, PARAMS(proto), PARAMS(args)) \
+ __DEFINE_EVENT(call, call, PARAMS(proto), PARAMS(args), size)
+
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
+#undef DECLARE_TRACE_WRITABLE
#undef DEFINE_EVENT_WRITABLE
+#undef __CHECK_WRITABLE_BUF_SIZE
#undef __DEFINE_EVENT
#undef FIRST
--
2.29.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH bpf-next v3 2/3] libbpf: support detecting and attaching of writable tracepoint program
2021-09-28 14:07 [PATCH bpf-next v3 0/3] add support for writable bare tracepoint Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 1/3] bpf: support writable context for " Hou Tao
@ 2021-09-28 14:07 ` Hou Tao
2021-09-28 23:11 ` Andrii Nakryiko
2021-09-28 14:07 ` [PATCH bpf-next v3 3/3] bpf/selftests: add test for writable bare tracepoint Hou Tao
2 siblings, 1 reply; 6+ messages in thread
From: Hou Tao @ 2021-09-28 14:07 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Yonghong Song, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, netdev, bpf, houtao1
Program on writable tracepoint is BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,
but its attachment is the same as BPF_PROG_TYPE_RAW_TRACEPOINT.
Signed-off-by: Hou Tao <houtao1@huawei.com>
---
tools/lib/bpf/libbpf.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index ef5db34bf913..b874c0179084 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -7976,6 +7976,10 @@ static const struct bpf_sec_def section_defs[] = {
.attach_fn = attach_raw_tp),
SEC_DEF("raw_tp/", RAW_TRACEPOINT,
.attach_fn = attach_raw_tp),
+ SEC_DEF("raw_tracepoint.w/", RAW_TRACEPOINT_WRITABLE,
+ .attach_fn = attach_raw_tp),
+ SEC_DEF("raw_tp.w/", RAW_TRACEPOINT_WRITABLE,
+ .attach_fn = attach_raw_tp),
SEC_DEF("tp_btf/", TRACING,
.expected_attach_type = BPF_TRACE_RAW_TP,
.is_attach_btf = true,
--
2.29.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH bpf-next v3 3/3] bpf/selftests: add test for writable bare tracepoint
2021-09-28 14:07 [PATCH bpf-next v3 0/3] add support for writable bare tracepoint Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 1/3] bpf: support writable context for " Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 2/3] libbpf: support detecting and attaching of writable tracepoint program Hou Tao
@ 2021-09-28 14:07 ` Hou Tao
2021-09-28 23:10 ` Andrii Nakryiko
2 siblings, 1 reply; 6+ messages in thread
From: Hou Tao @ 2021-09-28 14:07 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Yonghong Song, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, netdev, bpf, houtao1
Add a writable bare tracepoint in bpf_testmod module, and
trigger its calling when reading /sys/kernel/bpf_testmod
with a specific buffer length. The reading will return
the value in writable context if the early return flag
is enabled in writable context.
Signed-off-by: Hou Tao <houtao1@huawei.com>
---
.../bpf/bpf_testmod/bpf_testmod-events.h | 15 ++++++++
.../selftests/bpf/bpf_testmod/bpf_testmod.c | 10 ++++++
.../selftests/bpf/bpf_testmod/bpf_testmod.h | 5 +++
.../selftests/bpf/prog_tests/module_attach.c | 35 +++++++++++++++++++
.../selftests/bpf/progs/test_module_attach.c | 14 ++++++++
tools/testing/selftests/bpf/test_progs.c | 4 +--
tools/testing/selftests/bpf/test_progs.h | 2 ++
7 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod-events.h b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod-events.h
index 89c6d58e5dd6..11ee801e75e7 100644
--- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod-events.h
+++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod-events.h
@@ -34,6 +34,21 @@ DECLARE_TRACE(bpf_testmod_test_write_bare,
TP_ARGS(task, ctx)
);
+#undef BPF_TESTMOD_DECLARE_TRACE
+#ifdef DECLARE_TRACE_WRITABLE
+#define BPF_TESTMOD_DECLARE_TRACE(call, proto, args, size) \
+ DECLARE_TRACE_WRITABLE(call, PARAMS(proto), PARAMS(args), size)
+#else
+#define BPF_TESTMOD_DECLARE_TRACE(call, proto, args, size) \
+ DECLARE_TRACE(call, PARAMS(proto), PARAMS(args))
+#endif
+
+BPF_TESTMOD_DECLARE_TRACE(bpf_testmod_test_writable_bare,
+ TP_PROTO(struct bpf_testmod_test_writable_ctx *ctx),
+ TP_ARGS(ctx),
+ sizeof(struct bpf_testmod_test_writable_ctx)
+);
+
#endif /* _BPF_TESTMOD_EVENTS_H */
#undef TRACE_INCLUDE_PATH
diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
index 50fc5561110a..1cc1d315ccf5 100644
--- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
+++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
@@ -42,6 +42,16 @@ bpf_testmod_test_read(struct file *file, struct kobject *kobj,
if (bpf_testmod_loop_test(101) > 100)
trace_bpf_testmod_test_read(current, &ctx);
+ /* Magic number to enable writable tp */
+ if (len == 64) {
+ struct bpf_testmod_test_writable_ctx writable = {
+ .val = 1024,
+ };
+ trace_bpf_testmod_test_writable_bare(&writable);
+ if (writable.early_ret)
+ return snprintf(buf, len, "%d\n", writable.val);
+ }
+
return -EIO; /* always fail */
}
EXPORT_SYMBOL(bpf_testmod_test_read);
diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h
index b3892dc40111..0d71e2607832 100644
--- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h
+++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.h
@@ -17,4 +17,9 @@ struct bpf_testmod_test_write_ctx {
size_t len;
};
+struct bpf_testmod_test_writable_ctx {
+ bool early_ret;
+ int val;
+};
+
#endif /* _BPF_TESTMOD_H */
diff --git a/tools/testing/selftests/bpf/prog_tests/module_attach.c b/tools/testing/selftests/bpf/prog_tests/module_attach.c
index 1797a6e4d6d8..6d0e50dcf47c 100644
--- a/tools/testing/selftests/bpf/prog_tests/module_attach.c
+++ b/tools/testing/selftests/bpf/prog_tests/module_attach.c
@@ -2,10 +2,36 @@
/* Copyright (c) 2020 Facebook */
#include <test_progs.h>
+#include <stdbool.h>
#include "test_module_attach.skel.h"
static int duration;
+static int trigger_module_test_writable(int *val)
+{
+ int fd, err;
+ char buf[65];
+ ssize_t rd;
+
+ fd = open(BPF_TESTMOD_TEST_FILE, O_RDONLY);
+ err = -errno;
+ if (!ASSERT_GE(fd, 0, "testmode_file_open"))
+ return err;
+
+ rd = read(fd, buf, sizeof(buf) - 1);
+ err = -errno;
+ if (!ASSERT_GT(rd, 0, "testmod_file_rd_val")) {
+ close(fd);
+ return err;
+ }
+
+ buf[rd] = '\0';
+ *val = strtol(buf, NULL, 0);
+ close(fd);
+
+ return 0;
+}
+
static int delete_module(const char *name, int flags)
{
return syscall(__NR_delete_module, name, flags);
@@ -19,6 +45,7 @@ void test_module_attach(void)
struct test_module_attach__bss *bss;
struct bpf_link *link;
int err;
+ int writable_val = 0;
skel = test_module_attach__open();
if (CHECK(!skel, "skel_open", "failed to open skeleton\n"))
@@ -51,6 +78,14 @@ void test_module_attach(void)
ASSERT_EQ(bss->fexit_ret, -EIO, "fexit_tet");
ASSERT_EQ(bss->fmod_ret_read_sz, READ_SZ, "fmod_ret");
+ bss->raw_tp_writable_bare_early_ret = true;
+ bss->raw_tp_writable_bare_out_val = 0xf1f2f3f4;
+ ASSERT_OK(trigger_module_test_writable(&writable_val),
+ "trigger_writable");
+ ASSERT_EQ(bss->raw_tp_writable_bare_in_val, 1024, "writable_test_in");
+ ASSERT_EQ(bss->raw_tp_writable_bare_out_val, writable_val,
+ "writable_test_out");
+
test_module_attach__detach(skel);
/* attach fentry/fexit and make sure it get's module reference */
diff --git a/tools/testing/selftests/bpf/progs/test_module_attach.c b/tools/testing/selftests/bpf/progs/test_module_attach.c
index bd37ceec5587..b36857093f71 100644
--- a/tools/testing/selftests/bpf/progs/test_module_attach.c
+++ b/tools/testing/selftests/bpf/progs/test_module_attach.c
@@ -27,6 +27,20 @@ int BPF_PROG(handle_raw_tp_bare,
return 0;
}
+int raw_tp_writable_bare_in_val = 0;
+int raw_tp_writable_bare_early_ret = 0;
+int raw_tp_writable_bare_out_val = 0;
+
+SEC("raw_tp.w/bpf_testmod_test_writable_bare")
+int BPF_PROG(handle_raw_tp_writable_bare,
+ struct bpf_testmod_test_writable_ctx *writable)
+{
+ raw_tp_writable_bare_in_val = writable->val;
+ writable->early_ret = raw_tp_writable_bare_early_ret;
+ writable->val = raw_tp_writable_bare_out_val;
+ return 0;
+}
+
__u32 tp_btf_read_sz = 0;
SEC("tp_btf/bpf_testmod_test_read")
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
index 2ed01f615d20..007b4ff85fea 100644
--- a/tools/testing/selftests/bpf/test_progs.c
+++ b/tools/testing/selftests/bpf/test_progs.c
@@ -747,7 +747,7 @@ int trigger_module_test_read(int read_sz)
{
int fd, err;
- fd = open("/sys/kernel/bpf_testmod", O_RDONLY);
+ fd = open(BPF_TESTMOD_TEST_FILE, O_RDONLY);
err = -errno;
if (!ASSERT_GE(fd, 0, "testmod_file_open"))
return err;
@@ -769,7 +769,7 @@ int trigger_module_test_write(int write_sz)
memset(buf, 'a', write_sz);
buf[write_sz-1] = '\0';
- fd = open("/sys/kernel/bpf_testmod", O_WRONLY);
+ fd = open(BPF_TESTMOD_TEST_FILE, O_WRONLY);
err = -errno;
if (!ASSERT_GE(fd, 0, "testmod_file_open")) {
free(buf);
diff --git a/tools/testing/selftests/bpf/test_progs.h b/tools/testing/selftests/bpf/test_progs.h
index 94bef0aa74cf..9b8a1810b700 100644
--- a/tools/testing/selftests/bpf/test_progs.h
+++ b/tools/testing/selftests/bpf/test_progs.h
@@ -301,3 +301,5 @@ int trigger_module_test_write(int write_sz);
#else
#define SYS_NANOSLEEP_KPROBE_NAME "sys_nanosleep"
#endif
+
+#define BPF_TESTMOD_TEST_FILE "/sys/kernel/bpf_testmod"
--
2.29.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH bpf-next v3 3/3] bpf/selftests: add test for writable bare tracepoint
2021-09-28 14:07 ` [PATCH bpf-next v3 3/3] bpf/selftests: add test for writable bare tracepoint Hou Tao
@ 2021-09-28 23:10 ` Andrii Nakryiko
0 siblings, 0 replies; 6+ messages in thread
From: Andrii Nakryiko @ 2021-09-28 23:10 UTC (permalink / raw)
To: Hou Tao
Cc: Alexei Starovoitov, Yonghong Song, Daniel Borkmann,
Andrii Nakryiko, Martin KaFai Lau, Networking, bpf
On Tue, Sep 28, 2021 at 6:53 AM Hou Tao <houtao1@huawei.com> wrote:
>
> Add a writable bare tracepoint in bpf_testmod module, and
> trigger its calling when reading /sys/kernel/bpf_testmod
> with a specific buffer length. The reading will return
> the value in writable context if the early return flag
> is enabled in writable context.
>
> Signed-off-by: Hou Tao <houtao1@huawei.com>
> ---
LGTM.
Acked-by: Andrii Nakryiko <andrii@kernel.org>
> .../bpf/bpf_testmod/bpf_testmod-events.h | 15 ++++++++
> .../selftests/bpf/bpf_testmod/bpf_testmod.c | 10 ++++++
> .../selftests/bpf/bpf_testmod/bpf_testmod.h | 5 +++
> .../selftests/bpf/prog_tests/module_attach.c | 35 +++++++++++++++++++
> .../selftests/bpf/progs/test_module_attach.c | 14 ++++++++
> tools/testing/selftests/bpf/test_progs.c | 4 +--
> tools/testing/selftests/bpf/test_progs.h | 2 ++
> 7 files changed, 83 insertions(+), 2 deletions(-)
>
[...]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH bpf-next v3 2/3] libbpf: support detecting and attaching of writable tracepoint program
2021-09-28 14:07 ` [PATCH bpf-next v3 2/3] libbpf: support detecting and attaching of writable tracepoint program Hou Tao
@ 2021-09-28 23:11 ` Andrii Nakryiko
0 siblings, 0 replies; 6+ messages in thread
From: Andrii Nakryiko @ 2021-09-28 23:11 UTC (permalink / raw)
To: Hou Tao
Cc: Alexei Starovoitov, Yonghong Song, Daniel Borkmann,
Andrii Nakryiko, Martin KaFai Lau, Networking, bpf
On Tue, Sep 28, 2021 at 6:53 AM Hou Tao <houtao1@huawei.com> wrote:
>
> Program on writable tracepoint is BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,
> but its attachment is the same as BPF_PROG_TYPE_RAW_TRACEPOINT.
>
> Signed-off-by: Hou Tao <houtao1@huawei.com>
> ---
> tools/lib/bpf/libbpf.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index ef5db34bf913..b874c0179084 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -7976,6 +7976,10 @@ static const struct bpf_sec_def section_defs[] = {
> .attach_fn = attach_raw_tp),
> SEC_DEF("raw_tp/", RAW_TRACEPOINT,
> .attach_fn = attach_raw_tp),
> + SEC_DEF("raw_tracepoint.w/", RAW_TRACEPOINT_WRITABLE,
> + .attach_fn = attach_raw_tp),
> + SEC_DEF("raw_tp.w/", RAW_TRACEPOINT_WRITABLE,
> + .attach_fn = attach_raw_tp),
Unfortunately I just refactored these SEC_DEF() definitions, please
rebase because this won't apply cleanly anymore. Otherwise it looks
good to me.
> SEC_DEF("tp_btf/", TRACING,
> .expected_attach_type = BPF_TRACE_RAW_TP,
> .is_attach_btf = true,
> --
> 2.29.2
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-09-28 23:11 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-28 14:07 [PATCH bpf-next v3 0/3] add support for writable bare tracepoint Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 1/3] bpf: support writable context for " Hou Tao
2021-09-28 14:07 ` [PATCH bpf-next v3 2/3] libbpf: support detecting and attaching of writable tracepoint program Hou Tao
2021-09-28 23:11 ` Andrii Nakryiko
2021-09-28 14:07 ` [PATCH bpf-next v3 3/3] bpf/selftests: add test for writable bare tracepoint Hou Tao
2021-09-28 23:10 ` Andrii Nakryiko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).