* [PATCH bpf-next v3 0/2] bpf, xdp: Add tracepoint to xdp attaching failure
@ 2023-07-19 12:52 Leon Hwang
2023-07-19 12:52 ` [PATCH bpf-next v3 1/2] " Leon Hwang
2023-07-19 12:52 ` [PATCH bpf-next v3 2/2] selftests/bpf: Add testcase for xdp attaching failure tracepoint Leon Hwang
0 siblings, 2 replies; 5+ messages in thread
From: Leon Hwang @ 2023-07-19 12:52 UTC (permalink / raw)
To: ast
Cc: daniel, john.fastabend, andrii, martin.lau, song, yhs, kpsingh,
sdf, haoluo, jolsa, davem, edumazet, kuba, pabeni, hawk,
hffilwlqm, tangyeechou, kernel-patches-bot, bpf, linux-kernel,
netdev
This series introduces a new tracepoint in bpf_xdp_link_attach(). By
this tracepoint, error message will be captured when error happens in
dev_xdp_attach(), e.g. invalid attaching flags.
Leon Hwang (2):
bpf, xdp: Add tracepoint to xdp attaching failure
selftests/bpf: Add testcase for xdp attaching failure tracepoint
include/trace/events/xdp.h | 17 +++++
net/core/dev.c | 5 +-
.../selftests/bpf/prog_tests/xdp_attach.c | 63 +++++++++++++++++++
.../bpf/progs/test_xdp_attach_fail.c | 51 +++++++++++++++
4 files changed, 135 insertions(+), 1 deletion(-)
create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_attach_fail.c
base-commit: 0858a95ec7491a7a5bfca4be9736dba4ee38c461
--
2.41.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH bpf-next v3 1/2] bpf, xdp: Add tracepoint to xdp attaching failure
2023-07-19 12:52 [PATCH bpf-next v3 0/2] bpf, xdp: Add tracepoint to xdp attaching failure Leon Hwang
@ 2023-07-19 12:52 ` Leon Hwang
2023-07-19 12:52 ` [PATCH bpf-next v3 2/2] selftests/bpf: Add testcase for xdp attaching failure tracepoint Leon Hwang
1 sibling, 0 replies; 5+ messages in thread
From: Leon Hwang @ 2023-07-19 12:52 UTC (permalink / raw)
To: ast
Cc: daniel, john.fastabend, andrii, martin.lau, song, yhs, kpsingh,
sdf, haoluo, jolsa, davem, edumazet, kuba, pabeni, hawk,
hffilwlqm, tangyeechou, kernel-patches-bot, bpf, linux-kernel,
netdev
When error happens in dev_xdp_attach(), it should have a way to tell
users the error message like the netlink approach.
To avoid breaking uapi, adding a tracepoint in bpf_xdp_link_attach() is
an appropriate way to notify users the error message.
Hence, bpf libraries are able to retrieve the error message by this
tracepoint, and then report the error message to users.
Signed-off-by: Leon Hwang <hffilwlqm@gmail.com>
---
include/trace/events/xdp.h | 17 +++++++++++++++++
net/core/dev.c | 5 ++++-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/include/trace/events/xdp.h b/include/trace/events/xdp.h
index c40fc97f94171..35712ecfe9203 100644
--- a/include/trace/events/xdp.h
+++ b/include/trace/events/xdp.h
@@ -404,6 +404,23 @@ TRACE_EVENT(mem_return_failed,
)
);
+TRACE_EVENT(bpf_xdp_link_attach_failed,
+
+ TP_PROTO(const char *msg),
+
+ TP_ARGS(msg),
+
+ TP_STRUCT__entry(
+ __string(msg, msg)
+ ),
+
+ TP_fast_assign(
+ __assign_str(msg, msg);
+ ),
+
+ TP_printk("errmsg=%s", __get_str(msg))
+);
+
#endif /* _TRACE_XDP_H */
#include <trace/define_trace.h>
diff --git a/net/core/dev.c b/net/core/dev.c
index d6e1b786c5c52..062bbbb736f80 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -132,6 +132,7 @@
#include <trace/events/net.h>
#include <trace/events/skb.h>
#include <trace/events/qdisc.h>
+#include <trace/events/xdp.h>
#include <linux/inetdevice.h>
#include <linux/cpu_rmap.h>
#include <linux/static_key.h>
@@ -9411,6 +9412,7 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
struct bpf_link_primer link_primer;
struct bpf_xdp_link *link;
struct net_device *dev;
+ struct netlink_ext_ack extack;
int err, fd;
rtnl_lock();
@@ -9436,12 +9438,13 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
goto unlock;
}
- err = dev_xdp_attach_link(dev, NULL, link);
+ err = dev_xdp_attach_link(dev, &extack, link);
rtnl_unlock();
if (err) {
link->dev = NULL;
bpf_link_cleanup(&link_primer);
+ trace_bpf_xdp_link_attach_failed(extack._msg);
goto out_put_dev;
}
--
2.41.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH bpf-next v3 2/2] selftests/bpf: Add testcase for xdp attaching failure tracepoint
2023-07-19 12:52 [PATCH bpf-next v3 0/2] bpf, xdp: Add tracepoint to xdp attaching failure Leon Hwang
2023-07-19 12:52 ` [PATCH bpf-next v3 1/2] " Leon Hwang
@ 2023-07-19 12:52 ` Leon Hwang
2023-07-19 17:39 ` Alexei Starovoitov
1 sibling, 1 reply; 5+ messages in thread
From: Leon Hwang @ 2023-07-19 12:52 UTC (permalink / raw)
To: ast
Cc: daniel, john.fastabend, andrii, martin.lau, song, yhs, kpsingh,
sdf, haoluo, jolsa, davem, edumazet, kuba, pabeni, hawk,
hffilwlqm, tangyeechou, kernel-patches-bot, bpf, linux-kernel,
netdev
Add a test case for the tracepoint of xdp attaching failure by bpf
tracepoint when attach XDP to a device with invalid flags option.
The bpf tracepoint retrieves error message from the tracepoint, and
then put the error message to a perf buffer. The testing code receives
error message from perf buffer, and then ASSERT "Invalid XDP flags for
BPF link attachment".
Signed-off-by: Leon Hwang <hffilwlqm@gmail.com>
---
.../selftests/bpf/prog_tests/xdp_attach.c | 63 +++++++++++++++++++
.../bpf/progs/test_xdp_attach_fail.c | 51 +++++++++++++++
2 files changed, 114 insertions(+)
create mode 100644 tools/testing/selftests/bpf/progs/test_xdp_attach_fail.c
diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_attach.c b/tools/testing/selftests/bpf/prog_tests/xdp_attach.c
index fa3cac5488f5d..265dba875f16b 100644
--- a/tools/testing/selftests/bpf/prog_tests/xdp_attach.c
+++ b/tools/testing/selftests/bpf/prog_tests/xdp_attach.c
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
#include <test_progs.h>
+#include "test_xdp_attach_fail.skel.h"
#define IFINDEX_LO 1
#define XDP_FLAGS_REPLACE (1U << 4)
@@ -85,10 +87,74 @@ static void test_xdp_attach(const char *file)
bpf_object__close(obj1);
}
+struct xdp_errmsg {
+ char msg[64];
+};
+
+static void on_xdp_errmsg(void *ctx, int cpu, void *data, __u32 size)
+{
+ struct xdp_errmsg *ctx_errmg = ctx, *tp_errmsg = data;
+
+ memcpy(&ctx_errmg->msg, &tp_errmsg->msg, size);
+}
+
+static const char tgt_errmsg[] = "Invalid XDP flags for BPF link attachment";
+
+static void test_xdp_attach_fail(const char *file)
+{
+ __u32 duration = 0;
+ int err, fd_xdp, fd_link_xdp;
+ struct bpf_object *obj = NULL;
+ struct test_xdp_attach_fail *skel = NULL;
+ struct bpf_link *link = NULL;
+ struct perf_buffer *pb = NULL;
+ struct xdp_errmsg errmsg = {};
+
+ LIBBPF_OPTS(bpf_link_create_opts, opts);
+
+ skel = test_xdp_attach_fail__open_and_load();
+ if (!ASSERT_OK_PTR(skel, "test_xdp_attach_fail_skel"))
+ goto out_close;
+
+ link = bpf_program__attach_tracepoint(skel->progs.tp__xdp__bpf_xdp_link_attach_failed,
+ "xdp", "bpf_xdp_link_attach_failed");
+ if (!ASSERT_OK_PTR(link, "attach_tp"))
+ goto out_close;
+
+ /* set up perf buffer */
+ pb = perf_buffer__new(bpf_map__fd(skel->maps.xdp_errmsg_pb), 1,
+ on_xdp_errmsg, NULL, &errmsg, NULL);
+
+ err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &fd_xdp);
+ if (CHECK_FAIL(err))
+ goto out_close;
+
+ opts.flags = 0xFF; // invalid flags to fail to attach XDP prog
+ fd_link_xdp = bpf_link_create(fd_xdp, IFINDEX_LO, BPF_XDP, &opts);
+ if (CHECK(fd_link_xdp != -22, "bpf_link_create_failed",
+ "created link fd: %d\n", fd_link_xdp))
+ goto out_close;
+
+ /* read perf buffer */
+ err = perf_buffer__poll(pb, 100);
+ if (CHECK(err < 0, "perf_buffer__poll", "err %d\n", err))
+ goto out_close;
+
+ ASSERT_STRNEQ((const char *) errmsg.msg, tgt_errmsg,
+ 42 /* strlen(tgt_errmsg) */, "check error message");
+
+out_close:
+ perf_buffer__free(pb);
+ bpf_object__close(obj);
+ test_xdp_attach_fail__destroy(skel);
+}
+
void serial_test_xdp_attach(void)
{
if (test__start_subtest("xdp_attach"))
test_xdp_attach("./test_xdp.bpf.o");
if (test__start_subtest("xdp_attach_dynptr"))
test_xdp_attach("./test_xdp_dynptr.bpf.o");
+ if (test__start_subtest("xdp_attach_failed"))
+ test_xdp_attach_fail("./xdp_dummy.bpf.o");
}
diff --git a/tools/testing/selftests/bpf/progs/test_xdp_attach_fail.c b/tools/testing/selftests/bpf/progs/test_xdp_attach_fail.c
new file mode 100644
index 0000000000000..ad8d536775d9d
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_xdp_attach_fail.c
@@ -0,0 +2,51 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright Leon Hwang */
+
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+struct xdp_errmsg {
+ char msg[64];
+};
+
+struct {
+ __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
+ __uint(key_size, sizeof(__u32));
+ __uint(value_size, sizeof(__u32));
+} xdp_errmsg_pb SEC(".maps");
+
+struct xdp_attach_error_ctx {
+ unsigned long unused;
+
+ /*
+ * bpf does not support tracepoint __data_loc directly.
+ *
+ * Actually, this field is a 32 bit integer whose value encodes
+ * information on where to find the actual data. The first 2 bytes is
+ * the size of the data. The last 2 bytes is the offset from the start
+ * of the tracepoint struct where the data begins.
+ * -- https://github.com/iovisor/bpftrace/pull/1542
+ */
+ __u32 msg; // __data_loc char[] msg;
+};
+
+/*
+ * Catch the error message at the tracepoint.
+ */
+
+SEC("tp/xdp/bpf_xdp_link_attach_failed")
+int tp__xdp__bpf_xdp_link_attach_failed(struct xdp_attach_error_ctx *ctx)
+{
+ struct xdp_errmsg errmsg;
+ char *msg = (void *)(__u64) ((void *) ctx + (__u16) ctx->msg);
+
+ bpf_probe_read_kernel_str(&errmsg.msg, sizeof(errmsg.msg), msg);
+ bpf_perf_event_output(ctx, &xdp_errmsg_pb, BPF_F_CURRENT_CPU, &errmsg,
+ sizeof(errmsg));
+ return 0;
+}
+
+/*
+ * Reuse the XDP program in xdp_dummy.c.
+ */
+
+char LICENSE[] SEC("license") = "GPL";
--
2.41.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next v3 2/2] selftests/bpf: Add testcase for xdp attaching failure tracepoint
2023-07-19 12:52 ` [PATCH bpf-next v3 2/2] selftests/bpf: Add testcase for xdp attaching failure tracepoint Leon Hwang
@ 2023-07-19 17:39 ` Alexei Starovoitov
2023-07-20 15:03 ` Leon Hwang
0 siblings, 1 reply; 5+ messages in thread
From: Alexei Starovoitov @ 2023-07-19 17:39 UTC (permalink / raw)
To: Leon Hwang
Cc: Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Jesper Dangaard Brouer,
Yizhou Tang, kernel-patches-bot, bpf, LKML, Network Development
On Wed, Jul 19, 2023 at 5:53 AM Leon Hwang <hffilwlqm@gmail.com> wrote:
> + return 0;
> +}
> +
> +/*
> + * Reuse the XDP program in xdp_dummy.c.
> + */
> +
> +char LICENSE[] SEC("license") = "GPL";
Do you have a hidden char in the above?
git considers the last line to be part of the commit log instead
of part of the patchset and it fails CI.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next v3 2/2] selftests/bpf: Add testcase for xdp attaching failure tracepoint
2023-07-19 17:39 ` Alexei Starovoitov
@ 2023-07-20 15:03 ` Leon Hwang
0 siblings, 0 replies; 5+ messages in thread
From: Leon Hwang @ 2023-07-20 15:03 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Jesper Dangaard Brouer,
Yizhou Tang, kernel-patches-bot, bpf, LKML, Network Development
On 2023/7/20 01:39, Alexei Starovoitov wrote:
> On Wed, Jul 19, 2023 at 5:53 AM Leon Hwang <hffilwlqm@gmail.com> wrote:
>> + return 0;
>> +}
>> +
>> +/*
>> + * Reuse the XDP program in xdp_dummy.c.
>> + */
>> +
>> +char LICENSE[] SEC("license") = "GPL";
>
> Do you have a hidden char in the above?
> git considers the last line to be part of the commit log instead
> of part of the patchset and it fails CI.
Sorry for it.
I'll use ./scripts/checkpatch.pl to check it again to make sure no style
issue, then resend this patchset.
Thanks,
Leon
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-07-20 15:03 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-19 12:52 [PATCH bpf-next v3 0/2] bpf, xdp: Add tracepoint to xdp attaching failure Leon Hwang
2023-07-19 12:52 ` [PATCH bpf-next v3 1/2] " Leon Hwang
2023-07-19 12:52 ` [PATCH bpf-next v3 2/2] selftests/bpf: Add testcase for xdp attaching failure tracepoint Leon Hwang
2023-07-19 17:39 ` Alexei Starovoitov
2023-07-20 15:03 ` Leon Hwang
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).