All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers
@ 2025-03-06  2:15 Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 1/8] mptcp: add mptcp_validate_scheduler helper Geliang Tang
                   ` (9 more replies)
  0 siblings, 10 replies; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

1. Add validate_scheduler.
2. Drop mptcp_sched_find in bpf_mptcp_sched_init_member.
3. Drop mptcp_sock_type and mptcp_subflow_type.
4. Move netns_new() out of sched_init().
5. Use .struct_ops.link instead of .struct_ops.

Geliang Tang (8):
  mptcp: add mptcp_validate_scheduler helper
  Squash to "bpf: Add bpf_mptcp_sched_ops"
  Squash to "selftests/bpf: Add bpf scheduler test"
  Squash to "selftests/bpf: Add bpf_first scheduler & test"
  Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
  Squash to "selftests/bpf: Add bpf_rr scheduler & test"
  Squash to "selftests/bpf: Add bpf_red scheduler & test"
  Squash to "selftests/bpf: Add bpf_burst scheduler & test"

 net/mptcp/bpf.c                               | 32 +++++++------
 net/mptcp/protocol.h                          |  1 +
 net/mptcp/sched.c                             | 17 ++++++-
 .../testing/selftests/bpf/prog_tests/mptcp.c  | 45 ++++++++++---------
 tools/testing/selftests/bpf/progs/mptcp_bpf.h |  3 --
 .../selftests/bpf/progs/mptcp_bpf_bkup.c      |  2 +-
 .../selftests/bpf/progs/mptcp_bpf_burst.c     | 10 ++---
 .../selftests/bpf/progs/mptcp_bpf_first.c     |  2 +-
 .../selftests/bpf/progs/mptcp_bpf_red.c       |  2 +-
 .../selftests/bpf/progs/mptcp_bpf_rr.c        |  2 +-
 10 files changed, 63 insertions(+), 53 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 1/8] mptcp: add mptcp_validate_scheduler helper
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-18  1:09   ` Mat Martineau
  2025-03-06  2:15 ` [PATCH mptcp-next v1 2/8] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

New interface .validate is added in struct bpf_struct_ops recently, this
patch implements it as a new helper mptcp_validate_scheduler() for struct
mptcp_sched_ops.

In this helper, check whether the required ops "get_subflow" of struct
mptcp_sched_ops has been implemented.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/protocol.h |  1 +
 net/mptcp/sched.c    | 17 +++++++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 3492b256ecba..77b4ec0b0dd8 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -740,6 +740,7 @@ void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
 			 struct sockaddr_storage *addr,
 			 unsigned short family);
 struct mptcp_sched_ops *mptcp_sched_find(const char *name);
+int mptcp_validate_scheduler(struct mptcp_sched_ops *sched);
 int mptcp_register_scheduler(struct mptcp_sched_ops *sched);
 void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched);
 void mptcp_sched_init(void);
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index f09f7eb1d63f..1e59072d478c 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -82,10 +82,23 @@ void mptcp_get_available_schedulers(char *buf, size_t maxlen)
 	rcu_read_unlock();
 }
 
-int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
+int mptcp_validate_scheduler(struct mptcp_sched_ops *sched)
 {
-	if (!sched->get_send)
+	if (!sched->get_send) {
+		pr_err("%s does not implement required ops\n", sched->name);
 		return -EINVAL;
+	}
+
+	return 0;
+}
+
+int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
+{
+	int ret;
+
+	ret = mptcp_validate_scheduler(sched);
+	if (ret)
+		return ret;
 
 	spin_lock(&mptcp_sched_list_lock);
 	if (mptcp_sched_find(sched->name)) {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 2/8] Squash to "bpf: Add bpf_mptcp_sched_ops"
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 1/8] mptcp: add mptcp_validate_scheduler helper Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 3/8] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Please update the subject to

        bpf: Add mptcp packet scheduler struct_ops

1. validate interface is added in bpf_struct_ops by commit 68b04864ca42
("bpf: Create links for BPF struct_ops maps."), implement it in
mptcp_sched_ops.

2. Drop mptcp_sched_find. This part of mptcp_sched_find() code comes from
bpf_tcp_ca_init_member, but it was recently deleted by commit 68b04864ca42.

3. Drop mptcp_sock_type and mptcp_subflow_type.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/bpf.c | 32 +++++++++++++++-----------------
 1 file changed, 15 insertions(+), 17 deletions(-)

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index c0da9ac077e4..2b0cfb57df8c 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -18,8 +18,10 @@
 
 #ifdef CONFIG_BPF_JIT
 static struct bpf_struct_ops bpf_mptcp_sched_ops;
-static const struct btf_type *mptcp_sock_type, *mptcp_subflow_type __read_mostly;
-static u32 mptcp_sock_id, mptcp_subflow_id;
+static u32 mptcp_sock_id,
+	   mptcp_subflow_id;
+
+/* MPTCP BPF packet scheduler */
 
 static const struct bpf_func_proto *
 bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id,
@@ -43,12 +45,10 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
 					     const struct bpf_reg_state *reg,
 					     int off, int size)
 {
-	const struct btf_type *t;
+	u32 id = reg->btf_id;
 	size_t end;
 
-	t = btf_type_by_id(reg->btf, reg->btf_id);
-
-	if (t == mptcp_sock_type) {
+	if (id == mptcp_sock_id) {
 		switch (off) {
 		case offsetof(struct mptcp_sock, snd_burst):
 			end = offsetofend(struct mptcp_sock, snd_burst);
@@ -58,7 +58,7 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
 				off);
 			return -EACCES;
 		}
-	} else if (t == mptcp_subflow_type) {
+	} else if (id == mptcp_subflow_id) {
 		switch (off) {
 		case offsetof(struct mptcp_subflow_context, avg_pacing_rate):
 			end = offsetofend(struct mptcp_subflow_context, avg_pacing_rate);
@@ -75,7 +75,7 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
 
 	if (off + size > end) {
 		bpf_log(log, "access beyond %s at off %u size %u ended at %zu",
-			t == mptcp_sock_type ? "mptcp_sock" : "mptcp_subflow_context",
+			id == mptcp_sock_id ? "mptcp_sock" : "mptcp_subflow_context",
 			off, size, end);
 		return -EACCES;
 	}
@@ -113,7 +113,6 @@ static int bpf_mptcp_sched_init_member(const struct btf_type *t,
 	const struct mptcp_sched_ops *usched;
 	struct mptcp_sched_ops *sched;
 	u32 moff;
-	int ret;
 
 	usched = (const struct mptcp_sched_ops *)udata;
 	sched = (struct mptcp_sched_ops *)kdata;
@@ -124,12 +123,7 @@ static int bpf_mptcp_sched_init_member(const struct btf_type *t,
 		if (bpf_obj_name_cpy(sched->name, usched->name,
 				     sizeof(sched->name)) <= 0)
 			return -EINVAL;
-
-		rcu_read_lock();
-		ret = mptcp_sched_find(usched->name) ? -EEXIST : 1;
-		rcu_read_unlock();
-
-		return ret;
+		return 1;
 	}
 
 	return 0;
@@ -144,18 +138,21 @@ static int bpf_mptcp_sched_init(struct btf *btf)
 	if (type_id < 0)
 		return -EINVAL;
 	mptcp_sock_id = type_id;
-	mptcp_sock_type = btf_type_by_id(btf, mptcp_sock_id);
 
 	type_id = btf_find_by_name_kind(btf, "mptcp_subflow_context",
 					BTF_KIND_STRUCT);
 	if (type_id < 0)
 		return -EINVAL;
 	mptcp_subflow_id = type_id;
-	mptcp_subflow_type = btf_type_by_id(btf, mptcp_subflow_id);
 
 	return 0;
 }
 
+static int bpf_mptcp_sched_validate(void *kdata)
+{
+	return mptcp_validate_scheduler(kdata);
+}
+
 static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk)
 {
 	return 0;
@@ -188,6 +185,7 @@ static struct bpf_struct_ops bpf_mptcp_sched_ops = {
 	.check_member	= bpf_mptcp_sched_check_member,
 	.init_member	= bpf_mptcp_sched_init_member,
 	.init		= bpf_mptcp_sched_init,
+	.validate	= bpf_mptcp_sched_validate,
 	.name		= "mptcp_sched_ops",
 	.cfi_stubs	= &__bpf_mptcp_sched_ops,
 };
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 3/8] Squash to "selftests/bpf: Add bpf scheduler test"
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 1/8] mptcp: add mptcp_validate_scheduler helper Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 2/8] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-18  1:11   ` Mat Martineau
  2025-03-06  2:15 ` [PATCH mptcp-next v1 4/8] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

A cleanup, move netns_new() out of sched_init().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 .../testing/selftests/bpf/prog_tests/mptcp.c  | 22 +++++++++----------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index ac6f6a6f7700..bd824b19ee13 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -562,23 +562,16 @@ static void test_iters_subflow(void)
 	close(cgroup_fd);
 }
 
-static struct netns_obj *sched_init(char *flags, char *sched)
+static int sched_init(char *flags, char *sched)
 {
-	struct netns_obj *netns;
-
-	netns = netns_new(NS_TEST, true);
-	if (!ASSERT_OK_PTR(netns, "netns_new"))
-		return NULL;
-
-	if (endpoint_init("subflow", 2) < 0)
+	if (endpoint_init(flags, 2) < 0)
 		goto fail;
 
 	SYS(fail, "ip netns exec %s sysctl -qw net.mptcp.scheduler=%s", NS_TEST, sched);
 
-	return netns;
+	return 0;
 fail:
-	netns_free(netns);
-	return NULL;
+	return -1;
 }
 
 static int ss_search(char *src, char *dst, char *port, char *keyword)
@@ -636,11 +629,16 @@ static void send_data_and_verify(char *sched, bool addr1, bool addr2)
 static void test_default(void)
 {
 	struct netns_obj *netns;
+	int err;
 
-	netns = sched_init("subflow", "default");
+	netns = netns_new(NS_TEST, true);
 	if (!netns)
 		goto fail;
 
+	err = sched_init("subflow", "default");
+	if (!ASSERT_OK(err, "sched_init"))
+		goto fail;
+
 	send_data_and_verify("default", WITH_DATA, WITH_DATA);
 
 fail:
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 4/8] Squash to "selftests/bpf: Add bpf_first scheduler & test"
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
                   ` (2 preceding siblings ...)
  2025-03-06  2:15 ` [PATCH mptcp-next v1 3/8] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 5/8] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

1. Update sched_init.

2. For drop bpf_object__find_map_by_name in test_bpf_sched(), change the
first parameter of it as bpf_map.

3. Use .struct_ops.link instead of .struct_ops.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/prog_tests/mptcp.c    | 15 +++++++++------
 .../testing/selftests/bpf/progs/mptcp_bpf_first.c |  2 +-
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index bd824b19ee13..15f7a2b97623 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -645,27 +645,30 @@ static void test_default(void)
 	netns_free(netns);
 }
 
-static void test_bpf_sched(struct bpf_object *obj, char *sched,
+static void test_bpf_sched(struct bpf_map *map, char *sched,
 			   bool addr1, bool addr2)
 {
 	char bpf_sched[MPTCP_SCHED_NAME_MAX] = "bpf_";
 	struct netns_obj *netns;
 	struct bpf_link *link;
-	struct bpf_map *map;
+	int err;
 
 	if (!ASSERT_LT(strlen(bpf_sched) + strlen(sched),
 		       MPTCP_SCHED_NAME_MAX, "Scheduler name too long"))
 		return;
 
-	map = bpf_object__find_map_by_name(obj, sched);
 	link = bpf_map__attach_struct_ops(map);
-	if (CHECK(!link, sched, "attach_struct_ops: %d\n", errno))
+	if (!ASSERT_OK_PTR(link, "attach_struct_ops"))
 		return;
 
-	netns = sched_init("subflow", strcat(bpf_sched, sched));
+	netns = netns_new(NS_TEST, true);
 	if (!netns)
 		goto fail;
 
+	err = sched_init("subflow", strcat(bpf_sched, sched));
+	if (!ASSERT_OK(err, "sched_init"))
+		goto fail;
+
 	send_data_and_verify(sched, addr1, addr2);
 
 fail:
@@ -681,7 +684,7 @@ static void test_first(void)
 	if (!ASSERT_OK_PTR(skel, "open_and_load: first"))
 		return;
 
-	test_bpf_sched(skel->obj, "first", WITH_DATA, WITHOUT_DATA);
+	test_bpf_sched(skel->maps.first, "first", WITH_DATA, WITHOUT_DATA);
 	mptcp_bpf_first__destroy(skel);
 }
 
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
index d71c50c7f441..96b002808ce7 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
@@ -29,7 +29,7 @@ int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk)
 	return 0;
 }
 
-SEC(".struct_ops")
+SEC(".struct_ops.link")
 struct mptcp_sched_ops first = {
 	.init		= (void *)mptcp_sched_first_init,
 	.release	= (void *)mptcp_sched_first_release,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 5/8] Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
                   ` (3 preceding siblings ...)
  2025-03-06  2:15 ` [PATCH mptcp-next v1 4/8] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 6/8] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Update test_bpf_sched().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/prog_tests/mptcp.c     | 2 +-
 tools/testing/selftests/bpf/progs/mptcp_bpf.h      | 3 ---
 tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 2 +-
 3 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 15f7a2b97623..ea31b3b28367 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -696,7 +696,7 @@ static void test_bkup(void)
 	if (!ASSERT_OK_PTR(skel, "open_and_load: bkup"))
 		return;
 
-	test_bpf_sched(skel->obj, "bkup", WITH_DATA, WITHOUT_DATA);
+	test_bpf_sched(skel->maps.bkup, "bkup", WITH_DATA, WITHOUT_DATA);
 	mptcp_bpf_bkup__destroy(skel);
 }
 
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
index badcffe0942c..4e901941d5dd 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
@@ -4,9 +4,6 @@
 
 #include "bpf_experimental.h"
 
-/* mptcp helpers from include/net/mptcp.h */
-#define MPTCP_SUBFLOWS_MAX 8
-
 /* list helpers from include/linux/list.h */
 static inline int list_is_head(const struct list_head *list,
 			       const struct list_head *head)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
index 284cca708de0..b62ffdb7e2dd 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
@@ -32,7 +32,7 @@ int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk)
 	return 0;
 }
 
-SEC(".struct_ops")
+SEC(".struct_ops.link")
 struct mptcp_sched_ops bkup = {
 	.init		= (void *)mptcp_sched_bkup_init,
 	.release	= (void *)mptcp_sched_bkup_release,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 6/8] Squash to "selftests/bpf: Add bpf_rr scheduler & test"
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
                   ` (4 preceding siblings ...)
  2025-03-06  2:15 ` [PATCH mptcp-next v1 5/8] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 7/8] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Update test_bpf_sched().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/prog_tests/mptcp.c   | 2 +-
 tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index ea31b3b28367..ddbf69145d22 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -708,7 +708,7 @@ static void test_rr(void)
 	if (!ASSERT_OK_PTR(skel, "open_and_load: rr"))
 		return;
 
-	test_bpf_sched(skel->obj, "rr", WITH_DATA, WITH_DATA);
+	test_bpf_sched(skel->maps.rr, "rr", WITH_DATA, WITH_DATA);
 	mptcp_bpf_rr__destroy(skel);
 }
 
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index 5128a886119d..3c685c77f67f 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -65,7 +65,7 @@ int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk)
 	return 0;
 }
 
-SEC(".struct_ops")
+SEC(".struct_ops.link")
 struct mptcp_sched_ops rr = {
 	.init		= (void *)mptcp_sched_rr_init,
 	.release	= (void *)mptcp_sched_rr_release,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 7/8] Squash to "selftests/bpf: Add bpf_red scheduler & test"
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
                   ` (5 preceding siblings ...)
  2025-03-06  2:15 ` [PATCH mptcp-next v1 6/8] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-06  2:15 ` [PATCH mptcp-next v1 8/8] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Update test_bpf_sched().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/prog_tests/mptcp.c    | 2 +-
 tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index ddbf69145d22..c069c08371e4 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -720,7 +720,7 @@ static void test_red(void)
 	if (!ASSERT_OK_PTR(skel, "open_and_load: red"))
 		return;
 
-	test_bpf_sched(skel->obj, "red", WITH_DATA, WITH_DATA);
+	test_bpf_sched(skel->maps.red, "red", WITH_DATA, WITH_DATA);
 	mptcp_bpf_red__destroy(skel);
 }
 
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
index b2efd6db7f8b..cbee97a6e7fc 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
@@ -27,7 +27,7 @@ int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk)
 	return 0;
 }
 
-SEC(".struct_ops")
+SEC(".struct_ops.link")
 struct mptcp_sched_ops red = {
 	.init		= (void *)mptcp_sched_red_init,
 	.release	= (void *)mptcp_sched_red_release,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v1 8/8] Squash to "selftests/bpf: Add bpf_burst scheduler & test"
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
                   ` (6 preceding siblings ...)
  2025-03-06  2:15 ` [PATCH mptcp-next v1 7/8] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
@ 2025-03-06  2:15 ` Geliang Tang
  2025-03-06  3:26 ` [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers MPTCP CI
  2025-03-20 17:31 ` Matthieu Baerts
  9 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-03-06  2:15 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Update test_bpf_sched().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/prog_tests/mptcp.c      |  2 +-
 tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index c069c08371e4..0951313b1189 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -741,7 +741,7 @@ static void test_burst(void)
 	if (!ASSERT_OK(mptcp_bpf_burst__load(skel), "load: burst"))
 		goto skel_destroy;
 
-	test_bpf_sched(skel->obj, "burst", WITH_DATA, WITH_DATA);
+	test_bpf_sched(skel->maps.burst, "burst", WITH_DATA, WITH_DATA);
 skel_destroy:
 	mptcp_bpf_burst__destroy(skel);
 }
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
index 6d930ff0f09f..693fab55f7be 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
@@ -9,6 +9,10 @@ char _license[] SEC("license") = "GPL";
 
 #define MPTCP_SEND_BURST_SIZE	65428
 
+#define SSK_MODE_ACTIVE	0
+#define SSK_MODE_BACKUP	1
+#define SSK_MODE_MAX	2
+
 #define min(a, b) ((a) < (b) ? (a) : (b))
 
 extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym;
@@ -18,10 +22,6 @@ extern bool bpf_sk_stream_memory_free(const struct sock *sk) __ksym;
 extern bool bpf_mptcp_subflow_queues_empty(struct sock *sk) __ksym;
 extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym;
 
-#define SSK_MODE_ACTIVE	0
-#define SSK_MODE_BACKUP	1
-#define SSK_MODE_MAX	2
-
 static __always_inline __u64 div_u64(__u64 dividend, __u32 divisor)
 {
 	return dividend / divisor;
@@ -163,7 +163,7 @@ int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk)
 	return 0;
 }
 
-SEC(".struct_ops")
+SEC(".struct_ops.link")
 struct mptcp_sched_ops burst = {
 	.init		= (void *)mptcp_sched_burst_init,
 	.release	= (void *)mptcp_sched_burst_release,
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
                   ` (7 preceding siblings ...)
  2025-03-06  2:15 ` [PATCH mptcp-next v1 8/8] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
@ 2025-03-06  3:26 ` MPTCP CI
  2025-03-20 17:31 ` Matthieu Baerts
  9 siblings, 0 replies; 14+ messages in thread
From: MPTCP CI @ 2025-03-06  3:26 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp

Hi Geliang,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal: Success! ✅
- KVM Validation: debug: Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/13689905745

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/4b6403c184b4
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=940810


If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:

    $ cd [kernel source code]
    $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
        --pull always mptcp/mptcp-upstream-virtme-docker:latest \
        auto-normal

For more details:

    https://github.com/multipath-tcp/mptcp-upstream-virtme-docker


Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v1 1/8] mptcp: add mptcp_validate_scheduler helper
  2025-03-06  2:15 ` [PATCH mptcp-next v1 1/8] mptcp: add mptcp_validate_scheduler helper Geliang Tang
@ 2025-03-18  1:09   ` Mat Martineau
  0 siblings, 0 replies; 14+ messages in thread
From: Mat Martineau @ 2025-03-18  1:09 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp, Geliang Tang

On Thu, 6 Mar 2025, Geliang Tang wrote:

> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> New interface .validate is added in struct bpf_struct_ops recently, this
> patch implements it as a new helper mptcp_validate_scheduler() for struct
> mptcp_sched_ops.
>
> In this helper, check whether the required ops "get_subflow" of struct
> mptcp_sched_ops has been implemented.
>
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>

This patch LGTM:

Reviewed-by: Mat Martineau <martineau@kernel.org>

The rest of the series looks ok to squash, with one note on patch 3.


- Mat

> ---
> net/mptcp/protocol.h |  1 +
> net/mptcp/sched.c    | 17 +++++++++++++++--
> 2 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 3492b256ecba..77b4ec0b0dd8 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -740,6 +740,7 @@ void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
> 			 struct sockaddr_storage *addr,
> 			 unsigned short family);
> struct mptcp_sched_ops *mptcp_sched_find(const char *name);
> +int mptcp_validate_scheduler(struct mptcp_sched_ops *sched);
> int mptcp_register_scheduler(struct mptcp_sched_ops *sched);
> void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched);
> void mptcp_sched_init(void);
> diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
> index f09f7eb1d63f..1e59072d478c 100644
> --- a/net/mptcp/sched.c
> +++ b/net/mptcp/sched.c
> @@ -82,10 +82,23 @@ void mptcp_get_available_schedulers(char *buf, size_t maxlen)
> 	rcu_read_unlock();
> }
>
> -int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
> +int mptcp_validate_scheduler(struct mptcp_sched_ops *sched)
> {
> -	if (!sched->get_send)
> +	if (!sched->get_send) {
> +		pr_err("%s does not implement required ops\n", sched->name);
> 		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
> +{
> +	int ret;
> +
> +	ret = mptcp_validate_scheduler(sched);
> +	if (ret)
> +		return ret;
>
> 	spin_lock(&mptcp_sched_list_lock);
> 	if (mptcp_sched_find(sched->name)) {
> -- 
> 2.43.0
>
>
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v1 3/8] Squash to "selftests/bpf: Add bpf scheduler test"
  2025-03-06  2:15 ` [PATCH mptcp-next v1 3/8] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
@ 2025-03-18  1:11   ` Mat Martineau
  2025-03-20 19:38     ` Matthieu Baerts
  0 siblings, 1 reply; 14+ messages in thread
From: Mat Martineau @ 2025-03-18  1:11 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp, Geliang Tang

On Thu, 6 Mar 2025, Geliang Tang wrote:

> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> A cleanup, move netns_new() out of sched_init().
>
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> .../testing/selftests/bpf/prog_tests/mptcp.c  | 22 +++++++++----------
> 1 file changed, 10 insertions(+), 12 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
> index ac6f6a6f7700..bd824b19ee13 100644
> --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
> +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
> @@ -562,23 +562,16 @@ static void test_iters_subflow(void)
> 	close(cgroup_fd);
> }
>
> -static struct netns_obj *sched_init(char *flags, char *sched)
> +static int sched_init(char *flags, char *sched)
> {
> -	struct netns_obj *netns;
> -
> -	netns = netns_new(NS_TEST, true);
> -	if (!ASSERT_OK_PTR(netns, "netns_new"))
> -		return NULL;
> -
> -	if (endpoint_init("subflow", 2) < 0)
> +	if (endpoint_init(flags, 2) < 0)
> 		goto fail;
>
> 	SYS(fail, "ip netns exec %s sysctl -qw net.mptcp.scheduler=%s", NS_TEST, sched);
>
> -	return netns;
> +	return 0;
> fail:
> -	netns_free(netns);
> -	return NULL;
> +	return -1;

A small thing: since there's now only the 'return' on this error path, I 
suggest removing the goto and directly returning -1 above. Matthieu do you 
want to do this when applying, or just leave it as-is?

- Mat

> }
>
> static int ss_search(char *src, char *dst, char *port, char *keyword)
> @@ -636,11 +629,16 @@ static void send_data_and_verify(char *sched, bool addr1, bool addr2)
> static void test_default(void)
> {
> 	struct netns_obj *netns;
> +	int err;
>
> -	netns = sched_init("subflow", "default");
> +	netns = netns_new(NS_TEST, true);
> 	if (!netns)
> 		goto fail;
>
> +	err = sched_init("subflow", "default");
> +	if (!ASSERT_OK(err, "sched_init"))
> +		goto fail;
> +
> 	send_data_and_verify("default", WITH_DATA, WITH_DATA);
>
> fail:
> -- 
> 2.43.0
>
>
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers
  2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
                   ` (8 preceding siblings ...)
  2025-03-06  3:26 ` [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers MPTCP CI
@ 2025-03-20 17:31 ` Matthieu Baerts
  9 siblings, 0 replies; 14+ messages in thread
From: Matthieu Baerts @ 2025-03-20 17:31 UTC (permalink / raw)
  To: Geliang Tang, mptcp; +Cc: Geliang Tang

Hi Geliang, Mat,

On 06/03/2025 03:15, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
> 
> 1. Add validate_scheduler.
> 2. Drop mptcp_sched_find in bpf_mptcp_sched_init_member.
> 3. Drop mptcp_sock_type and mptcp_subflow_type.
> 4. Move netns_new() out of sched_init().
> 5. Use .struct_ops.link instead of .struct_ops.

Thank you for this series and the reviews!

Now in our tree (feat. for net-next for the first patch):

New patches for t/upstream:
- d4c306a43b3f: mptcp: add mptcp_validate_scheduler helper
- Results: f919d66019d7..3401ddbacc79 (export)

- 59ab4747927b: "squashed" patch 2/8 in "bpf: Add bpf_mptcp_sched_ops"
- 38fdfd5cba1b: tg:msg: adapt 'bpf: Add mptcp packet scheduler struct_ops'

- a1aaa0e29d01: "squashed" patch 3/8 in "selftests/bpf: Add bpf
scheduler test"
- 99b384565fb2: return directly as suggested by Mat

- 354174f5423a: "squashed" patch 4/8 in "selftests/bpf: Add bpf_first
scheduler & test"
- 7f16e3788029: "squashed" patch 5/8 in "selftests/bpf: Add bpf_bkup
scheduler & test"
- 8d85ef2f3be9: "squashed" patch 6/8 in "selftests/bpf: Add bpf_rr
scheduler & test"
- 72ecea93b815: "squashed" patch 7/8 in "selftests/bpf: Add bpf_red
scheduler & test"
- 16789699fd1b: "squashed" patch 8/8 in "selftests/bpf: Add bpf_burst
scheduler & test"
- Results: 3401ddbacc79..35f3f56f1201 (export)

Tests are now in progress:

- export:
https://github.com/multipath-tcp/mptcp_net-next/commit/0404035380f85690b46bcb554e872f638ca9ee56/checks

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v1 3/8] Squash to "selftests/bpf: Add bpf scheduler test"
  2025-03-18  1:11   ` Mat Martineau
@ 2025-03-20 19:38     ` Matthieu Baerts
  0 siblings, 0 replies; 14+ messages in thread
From: Matthieu Baerts @ 2025-03-20 19:38 UTC (permalink / raw)
  To: Mat Martineau, Geliang Tang; +Cc: mptcp, Geliang Tang

Hi Mat,

On 18/03/2025 02:11, Mat Martineau wrote:
> On Thu, 6 Mar 2025, Geliang Tang wrote:
> 
>> From: Geliang Tang <tanggeliang@kylinos.cn>
>>
>> A cleanup, move netns_new() out of sched_init().
>>
>> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
>> ---
>> .../testing/selftests/bpf/prog_tests/mptcp.c  | 22 +++++++++----------
>> 1 file changed, 10 insertions(+), 12 deletions(-)
>>
>> diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/
>> testing/selftests/bpf/prog_tests/mptcp.c
>> index ac6f6a6f7700..bd824b19ee13 100644
>> --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
>> +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
>> @@ -562,23 +562,16 @@ static void test_iters_subflow(void)
>>     close(cgroup_fd);
>> }
>>
>> -static struct netns_obj *sched_init(char *flags, char *sched)
>> +static int sched_init(char *flags, char *sched)
>> {
>> -    struct netns_obj *netns;
>> -
>> -    netns = netns_new(NS_TEST, true);
>> -    if (!ASSERT_OK_PTR(netns, "netns_new"))
>> -        return NULL;
>> -
>> -    if (endpoint_init("subflow", 2) < 0)
>> +    if (endpoint_init(flags, 2) < 0)
>>         goto fail;
>>
>>     SYS(fail, "ip netns exec %s sysctl -qw net.mptcp.scheduler=%s",
>> NS_TEST, sched);
>>
>> -    return netns;
>> +    return 0;
>> fail:
>> -    netns_free(netns);
>> -    return NULL;
>> +    return -1;
> 
> A small thing: since there's now only the 'return' on this error path, I
> suggest removing the goto and directly returning -1 above. Matthieu do
> you want to do this when applying, or just leave it as-is?

I did the modification, but I missed the fact SYS() still needs the
'fail' label. So I just added these two commit to keep the 'fail' label,
and to return -1 directly.

a7522f3888cd: Revert "Squash to "selftests/bpf: Add bpf scheduler test""
cc33eee80a21: Squash to "selftests/bpf: Add bpf scheduler test"

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2025-03-20 19:38 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-06  2:15 [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers Geliang Tang
2025-03-06  2:15 ` [PATCH mptcp-next v1 1/8] mptcp: add mptcp_validate_scheduler helper Geliang Tang
2025-03-18  1:09   ` Mat Martineau
2025-03-06  2:15 ` [PATCH mptcp-next v1 2/8] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2025-03-06  2:15 ` [PATCH mptcp-next v1 3/8] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
2025-03-18  1:11   ` Mat Martineau
2025-03-20 19:38     ` Matthieu Baerts
2025-03-06  2:15 ` [PATCH mptcp-next v1 4/8] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
2025-03-06  2:15 ` [PATCH mptcp-next v1 5/8] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
2025-03-06  2:15 ` [PATCH mptcp-next v1 6/8] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
2025-03-06  2:15 ` [PATCH mptcp-next v1 7/8] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
2025-03-06  2:15 ` [PATCH mptcp-next v1 8/8] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
2025-03-06  3:26 ` [PATCH mptcp-next v1 0/8] cleanups for bpf schedulers MPTCP CI
2025-03-20 17:31 ` Matthieu Baerts

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.