[PATCH mptcp-next 2/2] selftests: mptcp: bpf: exercise the subflow avoid flag
Kalpan Jani <[email protected]> Wed, 15 Jul 2026 15:41:48 +0530
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <[email protected]> |
Add a BPF struct_ops scheduler selftest for the new mptcp_subflow_set_avoid() kfunc. The scheduler marks every subflow except the first as "avoid", then schedules only a subflow whose avoid flag is clear. The existing send_data_and_verify() harness confirms the avoided path carried no data, exercising the kfunc round-trip from eBPF: set the flag, read it back, and honour it. This also adds the BPF-side extern declaration for mptcp_subflow_set_avoid(); without it a BPF program cannot compile a call to the kfunc, as the kernel-side BTF registration alone is not enough. Link: https://github.com/multipath-tcp/mptcp_net-next/issues/349 Signed-off-by: Kalpan Jani <[email protected]> --- .../testing/selftests/bpf/prog_tests/mptcp.c | 15 ++++++ tools/testing/selftests/bpf/progs/mptcp_bpf.h | 2 + .../selftests/bpf/progs/mptcp_bpf_avoid.c | 49 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_avoid.c diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index 7f48fd9e94e1..1b88806a7a86 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -17,6 +17,7 @@ #include "mptcp_bpf_bkup.skel.h" #include "mptcp_bpf_rr.skel.h" #include "mptcp_bpf_red.skel.h" +#include "mptcp_bpf_avoid.skel.h" #include "mptcp_bpf_burst.skel.h" #define NS_TEST "mptcp_ns" @@ -813,6 +814,18 @@ static void test_burst(void) mptcp_bpf_burst__destroy(skel); } +static void test_avoid(void) +{ + struct mptcp_bpf_avoid *skel; + + skel = mptcp_bpf_avoid__open_and_load(); + if (!ASSERT_OK_PTR(skel, "open_and_load: avoid")) + return; + + test_bpf_sched(skel->maps.avoid, "avoid", WITH_DATA, WITHOUT_DATA); + mptcp_bpf_avoid__destroy(skel); +} + void test_mptcp(void) { if (test__start_subtest("base")) @@ -835,4 +848,6 @@ void test_mptcp(void) test_red(); if (test__start_subtest("burst")) test_burst(); + if (test__start_subtest("avoid")) + test_avoid(); } diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h index de450b2eaf0f..a60b66762274 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h @@ -48,5 +48,7 @@ bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __ksym; extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, bool scheduled) __ksym; +extern void mptcp_subflow_set_avoid(struct mptcp_subflow_context *subflow, + bool avoid) __ksym; #endif diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_avoid.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_avoid.c new file mode 100644 index 000000000000..3678781f346a --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_avoid.c @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2026, MPTCP. */ + +#include "mptcp_bpf.h" +#include <bpf/bpf_tracing.h> + +char _license[] SEC("license") = "GPL"; + +SEC("struct_ops") +void BPF_PROG(mptcp_sched_avoid_init, struct mptcp_sock *msk) +{ +} + +SEC("struct_ops") +void BPF_PROG(mptcp_sched_avoid_release, struct mptcp_sock *msk) +{ +} + +SEC("struct_ops") +int BPF_PROG(bpf_avoid_get_send, struct mptcp_sock *msk) +{ + struct mptcp_subflow_context *subflow; + int i = 0; + + /* bench every subflow except the first one */ + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { + if (i++ > 0) + mptcp_subflow_set_avoid(subflow, true); + } + + /* only schedule a subflow that is NOT avoided */ + bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) { + if (subflow->avoid) + continue; + if (mptcp_subflow_active(subflow)) { + mptcp_subflow_set_scheduled(subflow, true); + break; + } + } + return 0; +} + +SEC(".struct_ops.link") +struct mptcp_sched_ops avoid = { + .init = (void *)mptcp_sched_avoid_init, + .release = (void *)mptcp_sched_avoid_release, + .get_send = (void *)bpf_avoid_get_send, + .name = "bpf_avoid", +}; -- 2.43.0