All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-next v2 00/11] add bpf_iter_task
@ 2025-03-07 11:36 Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 01/11] Revert "mptcp: sched: remove mptcp_sched_data" Geliang Tang
                   ` (12 more replies)
  0 siblings, 13 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

v2:
 - Keep mptcp scheduler API unchanged.
 - Add back struct mptcp_sched_data.
 - add bpf_iter_task in mptcp_sched_data instead of mptcp_sock
 - Add wrapper bpf_iter mptcp_subflow_sched.
 - Use mptcp_subflow_sched iter instead of mptcp_subflow.

v1:
 - https://patchwork.kernel.org/project/mptcp/cover/cover.1740997925.git.tanggeliang@kylinos.cn/

Geliang Tang (11):
  Revert "mptcp: sched: remove mptcp_sched_data"
  Squash to "bpf: Add bpf_mptcp_sched_ops"
  mptcp: add bpf_iter_task for mptcp_sched_data
  mptcp: set and clear bpf_iter_task
  mptcp: add mptcp_subflow_sched bpf_iter
  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"
  mptcp: drop subflow contexts in mptcp_sched_data

 include/net/mptcp.h                           | 10 ++++--
 net/mptcp/bpf.c                               | 34 +++++++++++++++++--
 net/mptcp/protocol.h                          | 19 +++++++++++
 net/mptcp/sched.c                             | 31 +++++++++++++----
 .../testing/selftests/bpf/bpf_experimental.h  |  9 +++++
 .../selftests/bpf/progs/mptcp_bpf_bkup.c      |  5 +--
 .../selftests/bpf/progs/mptcp_bpf_burst.c     | 10 +++---
 .../selftests/bpf/progs/mptcp_bpf_first.c     |  3 +-
 .../selftests/bpf/progs/mptcp_bpf_red.c       |  5 +--
 .../selftests/bpf/progs/mptcp_bpf_rr.c        |  7 ++--
 10 files changed, 110 insertions(+), 23 deletions(-)

-- 
2.43.0


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

* [PATCH mptcp-next v2 01/11] Revert "mptcp: sched: remove mptcp_sched_data"
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Keep mptcp scheduler API unchanged.
Add back struct mptcp_sched_data.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h | 13 +++++++++++--
 net/mptcp/sched.c   | 18 +++++++++++-------
 2 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index e9832a8f981e..2c85ca92bb1c 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -100,9 +100,18 @@ struct mptcp_out_options {
 #define MPTCP_SCHED_MAX		128
 #define MPTCP_SCHED_BUF_MAX	(MPTCP_SCHED_NAME_MAX * MPTCP_SCHED_MAX)
 
+#define MPTCP_SUBFLOWS_MAX	8
+
+struct mptcp_sched_data {
+	u8	subflows;
+	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
+};
+
 struct mptcp_sched_ops {
-	int (*get_send)(struct mptcp_sock *msk);
-	int (*get_retrans)(struct mptcp_sock *msk);
+	int (*get_send)(struct mptcp_sock *msk,
+			struct mptcp_sched_data *data);
+	int (*get_retrans)(struct mptcp_sock *msk,
+			   struct mptcp_sched_data *data);
 
 	char			name[MPTCP_SCHED_NAME_MAX];
 	struct module		*owner;
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index f09f7eb1d63f..c16c6fbd4ba2 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -16,7 +16,8 @@
 static DEFINE_SPINLOCK(mptcp_sched_list_lock);
 static LIST_HEAD(mptcp_sched_list);
 
-static int mptcp_sched_default_get_send(struct mptcp_sock *msk)
+static int mptcp_sched_default_get_send(struct mptcp_sock *msk,
+					struct mptcp_sched_data *data)
 {
 	struct sock *ssk;
 
@@ -28,7 +29,8 @@ static int mptcp_sched_default_get_send(struct mptcp_sock *msk)
 	return 0;
 }
 
-static int mptcp_sched_default_get_retrans(struct mptcp_sock *msk)
+static int mptcp_sched_default_get_retrans(struct mptcp_sock *msk,
+					   struct mptcp_sched_data *data)
 {
 	struct sock *ssk;
 
@@ -155,6 +157,7 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
 int mptcp_sched_get_send(struct mptcp_sock *msk)
 {
 	struct mptcp_subflow_context *subflow;
+	struct mptcp_sched_data *data = NULL;
 
 	msk_owned_by_me(msk);
 
@@ -175,13 +178,14 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
 	}
 
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
-		return mptcp_sched_default_get_send(msk);
-	return msk->sched->get_send(msk);
+		return mptcp_sched_default_get_send(msk, data);
+	return msk->sched->get_send(msk, data);
 }
 
 int mptcp_sched_get_retrans(struct mptcp_sock *msk)
 {
 	struct mptcp_subflow_context *subflow;
+	struct mptcp_sched_data *data = NULL;
 
 	msk_owned_by_me(msk);
 
@@ -195,8 +199,8 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
 	}
 
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
-		return mptcp_sched_default_get_retrans(msk);
+		return mptcp_sched_default_get_retrans(msk, data);
 	if (msk->sched->get_retrans)
-		return msk->sched->get_retrans(msk);
-	return msk->sched->get_send(msk);
+		return msk->sched->get_retrans(msk, data);
+	return msk->sched->get_send(msk, data);
 }
-- 
2.43.0


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

* [PATCH mptcp-next v2 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops"
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 01/11] Revert "mptcp: sched: remove mptcp_sched_data" Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 03/11] mptcp: add bpf_iter_task for mptcp_sched_data Geliang Tang
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Keep mptcp scheduler API unchanged.

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

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index c0da9ac077e4..3921261b4fd4 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -156,12 +156,14 @@ static int bpf_mptcp_sched_init(struct btf *btf)
 	return 0;
 }
 
-static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk)
+static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk,
+				      struct mptcp_sched_data *data)
 {
 	return 0;
 }
 
-static int __bpf_mptcp_sched_get_retrans(struct mptcp_sock *msk)
+static int __bpf_mptcp_sched_get_retrans(struct mptcp_sock *msk,
+					 struct mptcp_sched_data *data)
 {
 	return 0;
 }
-- 
2.43.0


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

* [PATCH mptcp-next v2 03/11] mptcp: add bpf_iter_task for mptcp_sched_data
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 01/11] Revert "mptcp: sched: remove mptcp_sched_data" Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-08 10:49   ` Matthieu Baerts
  2025-03-07 11:36 ` [PATCH mptcp-next v2 04/11] mptcp: set and clear bpf_iter_task Geliang Tang
                   ` (9 subsequent siblings)
  12 siblings, 1 reply; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang, Mat Martineau

From: Geliang Tang <tanggeliang@kylinos.cn>

To make sure the mptcp_subflow bpf_iter is running in the
MPTCP context. This patch adds a simplified version of tracking
for it:

1. Add a 'struct task_struct *bpf_iter_task' field to struct
mptcp_sched_data.

2. Do a WRITE_ONCE(data->bpf_iter_task, current) before calling
a MPTCP BPF hook, and WRITE_ONCE(data->bpf_iter_task, NULL) after
the hook returns.

3. In bpf_iter_mptcp_subflow_new(), check

	"READ_ONCE(data->bpf_scheduler_task) == current"

to confirm the correct task, return -EINVAL if it doesn't match.

Also creates helpers for setting, clearing and checking that value.

Suggested-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h  |  1 +
 net/mptcp/protocol.h | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 2c85ca92bb1c..bd3d1b3654dd 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -105,6 +105,7 @@ struct mptcp_out_options {
 struct mptcp_sched_data {
 	u8	subflows;
 	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
+	struct task_struct *bpf_iter_task;
 };
 
 struct mptcp_sched_ops {
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 3492b256ecba..0875b3cf4aba 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1291,4 +1291,23 @@ mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_re
 static inline void mptcp_join_cookie_init(void) {}
 #endif
 
+static inline void mptcp_sched_set_bpf_iter_task(struct mptcp_sched_data *data)
+{
+	WRITE_ONCE(data->bpf_iter_task, current);
+}
+
+static inline void mptcp_sched_clear_bpf_iter_task(struct mptcp_sched_data *data)
+{
+	WRITE_ONCE(data->bpf_iter_task, NULL);
+}
+
+static inline bool mptcp_sched_check_bpf_iter_task(struct mptcp_sched_data *data)
+{
+	struct task_struct *task = READ_ONCE(data->bpf_iter_task);
+
+	if (task && task == current)
+		return true;
+	return false;
+}
+
 #endif /* __MPTCP_PROTOCOL_H */
-- 
2.43.0


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

* [PATCH mptcp-next v2 04/11] mptcp: set and clear bpf_iter_task
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (2 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 03/11] mptcp: add bpf_iter_task for mptcp_sched_data Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 05/11] mptcp: add mptcp_subflow_sched bpf_iter Geliang Tang
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Set bpf_iter_task before invoking get_send() and get_retrans(), and
clear it afterwords.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/sched.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index c16c6fbd4ba2..ffb531b5a4d6 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -157,7 +157,8 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
 int mptcp_sched_get_send(struct mptcp_sock *msk)
 {
 	struct mptcp_subflow_context *subflow;
-	struct mptcp_sched_data *data = NULL;
+	struct mptcp_sched_data data;
+	int ret;
 
 	msk_owned_by_me(msk);
 
@@ -178,14 +179,20 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
 	}
 
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
-		return mptcp_sched_default_get_send(msk, data);
-	return msk->sched->get_send(msk, data);
+		return mptcp_sched_default_get_send(msk, &data);
+
+	mptcp_sched_set_bpf_iter_task(&data);
+	ret = msk->sched->get_send(msk, &data);
+	mptcp_sched_clear_bpf_iter_task(&data);
+
+	return ret;
 }
 
 int mptcp_sched_get_retrans(struct mptcp_sock *msk)
 {
 	struct mptcp_subflow_context *subflow;
-	struct mptcp_sched_data *data = NULL;
+	struct mptcp_sched_data data;
+	int ret;
 
 	msk_owned_by_me(msk);
 
@@ -199,8 +206,14 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
 	}
 
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
-		return mptcp_sched_default_get_retrans(msk, data);
+		return mptcp_sched_default_get_retrans(msk, &data);
+
+	mptcp_sched_set_bpf_iter_task(&data);
 	if (msk->sched->get_retrans)
-		return msk->sched->get_retrans(msk, data);
-	return msk->sched->get_send(msk, data);
+		ret = msk->sched->get_retrans(msk, &data);
+	else
+		ret = msk->sched->get_send(msk, &data);
+	mptcp_sched_clear_bpf_iter_task(&data);
+
+	return ret;
 }
-- 
2.43.0


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

* [PATCH mptcp-next v2 05/11] mptcp: add mptcp_subflow_sched bpf_iter
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (3 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 04/11] mptcp: set and clear bpf_iter_task Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-08 11:00   ` Matthieu Baerts
  2025-03-07 11:36 ` [PATCH mptcp-next v2 06/11] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
                   ` (7 subsequent siblings)
  12 siblings, 1 reply; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Add a new bpt_iter mptcp_subflow_sched, it's a wrapper of mptcp_subflow.

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

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 3921261b4fd4..c31f7b407b84 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -288,6 +288,31 @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
 {
 }
 
+struct bpf_iter_mptcp_subflow_sched {
+	struct bpf_iter_mptcp_subflow it;
+};
+
+__bpf_kfunc static int
+bpf_iter_mptcp_subflow_sched_new(struct bpf_iter_mptcp_subflow_sched *it,
+				 struct sock *sk, struct mptcp_sched_data *data)
+{
+	if (!mptcp_sched_check_bpf_iter_task(data))
+		return -EINVAL;
+
+	return bpf_iter_mptcp_subflow_new(&it->it, sk);
+}
+
+__bpf_kfunc static struct mptcp_subflow_context *
+bpf_iter_mptcp_subflow_sched_next(struct bpf_iter_mptcp_subflow_sched *it)
+{
+	return bpf_iter_mptcp_subflow_next(&it->it);
+}
+
+__bpf_kfunc static void
+bpf_iter_mptcp_subflow_sched_destroy(struct bpf_iter_mptcp_subflow_sched *it)
+{
+}
+
 __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
 {
 	return tcp_rtx_queue_empty(sk);
@@ -312,6 +337,9 @@ BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock, KF_RET_NULL)
 BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
 BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL)
 BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY)
+BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_sched_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
+BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_sched_next, KF_ITER_NEXT | KF_RET_NULL)
+BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_sched_destroy, KF_ITER_DESTROY)
 BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
 BTF_ID_FLAGS(func, mptcp_subflow_active)
 BTF_ID_FLAGS(func, mptcp_set_timeout)
-- 
2.43.0


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

* [PATCH mptcp-next v2 06/11] Squash to "selftests/bpf: Add bpf_first scheduler & test"
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (4 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 05/11] mptcp: add mptcp_subflow_sched bpf_iter Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 07/11] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Keep mptcp scheduler API unchanged.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
index d71c50c7f441..73b18eeeb62f 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
@@ -17,7 +17,8 @@ void BPF_PROG(mptcp_sched_first_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk)
+int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	struct mptcp_subflow_context *subflow;
 
-- 
2.43.0


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

* [PATCH mptcp-next v2 07/11] Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (5 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 06/11] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 08/11] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Keep mptcp scheduler API unchanged.
Use mptcp_subflow_sched iter instead of mptcp_subflow.

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

diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h
index 6a96c56f0725..b8edad5c8bf0 100644
--- a/tools/testing/selftests/bpf/bpf_experimental.h
+++ b/tools/testing/selftests/bpf/bpf_experimental.h
@@ -583,6 +583,15 @@ bpf_iter_mptcp_subflow_next(struct bpf_iter_mptcp_subflow *it) __weak __ksym;
 extern void
 bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it) __weak __ksym;
 
+struct bpf_iter_mptcp_subflow_sched;
+extern int bpf_iter_mptcp_subflow_sched_new(struct bpf_iter_mptcp_subflow_sched *it,
+					    struct sock *sk,
+					    struct mptcp_sched_data *data) __weak __ksym;
+extern struct mptcp_subflow_context *
+bpf_iter_mptcp_subflow_sched_next(struct bpf_iter_mptcp_subflow_sched *it) __weak __ksym;
+extern void
+bpf_iter_mptcp_subflow_sched_destroy(struct bpf_iter_mptcp_subflow_sched *it) __weak __ksym;
+
 extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags) __weak __ksym;
 extern int bpf_wq_start(struct bpf_wq *wq, unsigned int flags) __weak __ksym;
 extern int bpf_wq_set_callback_impl(struct bpf_wq *wq,
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
index 284cca708de0..1719b0b2a182 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
@@ -17,11 +17,12 @@ void BPF_PROG(mptcp_sched_bkup_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk)
+int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	struct mptcp_subflow_context *subflow;
 
-	bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
+	bpf_for_each(mptcp_subflow_sched, subflow, (struct sock *)msk, data) {
 		if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) ||
 		    !BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) {
 			mptcp_subflow_set_scheduled(subflow, true);
-- 
2.43.0


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

* [PATCH mptcp-next v2 08/11] Squash to "selftests/bpf: Add bpf_rr scheduler & test"
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (6 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 07/11] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 09/11] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Keep mptcp scheduler API unchanged.
Use mptcp_subflow_sched iter instead of mptcp_subflow.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index 5128a886119d..5a3910fb0aa7 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -31,7 +31,8 @@ void BPF_PROG(mptcp_sched_rr_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk)
+int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	struct mptcp_subflow_context *subflow, *next;
 	struct mptcp_rr_storage *ptr;
@@ -48,9 +49,9 @@ int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk)
 	if (!ptr->last_snd)
 		goto out;
 
-	bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
+	bpf_for_each(mptcp_subflow_sched, subflow, (struct sock *)msk, data) {
 		if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) {
-			subflow = bpf_iter_mptcp_subflow_next(&___it);
+			subflow = bpf_iter_mptcp_subflow_sched_next(&___it);
 			if (!subflow)
 				break;
 
-- 
2.43.0


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

* [PATCH mptcp-next v2 09/11] Squash to "selftests/bpf: Add bpf_red scheduler & test"
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (7 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 08/11] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 10/11] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Keep mptcp scheduler API unchanged.
Use mptcp_subflow_sched iter instead of mptcp_subflow.

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

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
index b2efd6db7f8b..64bf3c48cc82 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
@@ -17,11 +17,12 @@ void BPF_PROG(mptcp_sched_red_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk)
+int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	struct mptcp_subflow_context *subflow;
 
-	bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk)
+	bpf_for_each(mptcp_subflow_sched, subflow, (struct sock *)msk, data)
 		mptcp_subflow_set_scheduled(subflow, true);
 
 	return 0;
-- 
2.43.0


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

* [PATCH mptcp-next v2 10/11] Squash to "selftests/bpf: Add bpf_burst scheduler & test"
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (8 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 09/11] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:36 ` [PATCH mptcp-next v2 11/11] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Keep mptcp scheduler API unchanged.
Use mptcp_subflow_sched iter instead of mptcp_subflow.

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

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
index 6d930ff0f09f..3828af40fa50 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
@@ -50,7 +50,8 @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk)
+int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	struct subflow_send_info send_info[SSK_MODE_MAX];
 	struct mptcp_subflow_context *subflow;
@@ -66,7 +67,7 @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk)
 		send_info[i].linger_time = -1;
 	}
 
-	bpf_for_each(mptcp_subflow, subflow, sk) {
+	bpf_for_each(mptcp_subflow_sched, subflow, sk, data) {
 		bool backup = subflow->backup || subflow->request_bkup;
 
 		ssk = mptcp_subflow_tcp_sock(subflow);
@@ -120,13 +121,14 @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk)
+int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	struct sock *backup = NULL, *pick = NULL;
 	struct mptcp_subflow_context *subflow;
 	int min_stale_count = INT_MAX;
 
-	bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
+	bpf_for_each(mptcp_subflow_sched, subflow, (struct sock *)msk, data) {
 		struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow);
 
 		if (!ssk || !mptcp_subflow_active(subflow))
-- 
2.43.0


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

* [PATCH mptcp-next v2 11/11] mptcp: drop subflow contexts in mptcp_sched_data
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (9 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 10/11] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
@ 2025-03-07 11:36 ` Geliang Tang
  2025-03-07 11:49 ` [PATCH mptcp-next v2 00/11] add bpf_iter_task MPTCP CI
  2025-03-07 12:33 ` MPTCP CI
  12 siblings, 0 replies; 16+ messages in thread
From: Geliang Tang @ 2025-03-07 11:36 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

The mptcp_subflow_sched bpf_iter is added now, it's better to use the
helper bpf_for_each(mptcp_subflow_sched) to traverse all subflows on the
conn_list of an MPTCP socket and then call kfunc to modify the fields of
each subflow in the WIP MPTCP BPF packet scheduler examples, instead of
converting them to a fixed array. With this helper, we can get rid of
this subflow array "contexts" and the size of it "subflows" in struct
mptcp_sched_data.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index bd3d1b3654dd..0083af204000 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -100,11 +100,7 @@ struct mptcp_out_options {
 #define MPTCP_SCHED_MAX		128
 #define MPTCP_SCHED_BUF_MAX	(MPTCP_SCHED_NAME_MAX * MPTCP_SCHED_MAX)
 
-#define MPTCP_SUBFLOWS_MAX	8
-
 struct mptcp_sched_data {
-	u8	subflows;
-	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
 	struct task_struct *bpf_iter_task;
 };
 
-- 
2.43.0


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

* Re: [PATCH mptcp-next v2 00/11] add bpf_iter_task
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (10 preceding siblings ...)
  2025-03-07 11:36 ` [PATCH mptcp-next v2 11/11] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
@ 2025-03-07 11:49 ` MPTCP CI
  2025-03-07 12:33 ` MPTCP CI
  12 siblings, 0 replies; 16+ messages in thread
From: MPTCP CI @ 2025-03-07 11:49 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp

Hi Geliang,

Thank you for your modifications, that's great!

But sadly, our CI spotted some issues with it when trying to build it.

You can find more details there:

  https://github.com/multipath-tcp/mptcp_net-next/actions/runs/13719922193

Status: failure
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/76b642669ea6
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=941486

Feel free to reply to this email if you cannot access logs, if you need
some support to fix the error, if this doesn't seem to be caused by your
modifications or if the error is a false positive one.

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

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

* Re: [PATCH mptcp-next v2 00/11] add bpf_iter_task
  2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
                   ` (11 preceding siblings ...)
  2025-03-07 11:49 ` [PATCH mptcp-next v2 00/11] add bpf_iter_task MPTCP CI
@ 2025-03-07 12:33 ` MPTCP CI
  12 siblings, 0 replies; 16+ messages in thread
From: MPTCP CI @ 2025-03-07 12:33 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/13719922203

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


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] 16+ messages in thread

* Re: [PATCH mptcp-next v2 03/11] mptcp: add bpf_iter_task for mptcp_sched_data
  2025-03-07 11:36 ` [PATCH mptcp-next v2 03/11] mptcp: add bpf_iter_task for mptcp_sched_data Geliang Tang
@ 2025-03-08 10:49   ` Matthieu Baerts
  0 siblings, 0 replies; 16+ messages in thread
From: Matthieu Baerts @ 2025-03-08 10:49 UTC (permalink / raw)
  To: Geliang Tang, mptcp; +Cc: Geliang Tang, Mat Martineau

Hi Geliang,

On 07/03/2025 12:36, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
> 
> To make sure the mptcp_subflow bpf_iter is running in the
> MPTCP context. This patch adds a simplified version of tracking
> for it:
> 
> 1. Add a 'struct task_struct *bpf_iter_task' field to struct
> mptcp_sched_data.
> 
> 2. Do a WRITE_ONCE(data->bpf_iter_task, current) before calling
> a MPTCP BPF hook, and WRITE_ONCE(data->bpf_iter_task, NULL) after
> the hook returns.
> 
> 3. In bpf_iter_mptcp_subflow_new(), check
> 
> 	"READ_ONCE(data->bpf_scheduler_task) == current"
> 
> to confirm the correct task, return -EINVAL if it doesn't match.
> 
> Also creates helpers for setting, clearing and checking that value.

I think it is better not to have dedicated patches introducing helpers
without using them: for the reviewers, it is not clear how they are
exactly going to be used, then it is needed to check the next patch(es),
go back to this one, etc.

Maybe better to introduce the helper when you actually use them?
Especially for such simple helpers.

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


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

* Re: [PATCH mptcp-next v2 05/11] mptcp: add mptcp_subflow_sched bpf_iter
  2025-03-07 11:36 ` [PATCH mptcp-next v2 05/11] mptcp: add mptcp_subflow_sched bpf_iter Geliang Tang
@ 2025-03-08 11:00   ` Matthieu Baerts
  0 siblings, 0 replies; 16+ messages in thread
From: Matthieu Baerts @ 2025-03-08 11:00 UTC (permalink / raw)
  To: Geliang Tang, mptcp; +Cc: Geliang Tang, Mat Martineau

Hi Geliang,

On 07/03/2025 12:36, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
> 
> Add a new bpt_iter mptcp_subflow_sched, it's a wrapper of mptcp_subflow.
> 
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
>  net/mptcp/bpf.c | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
> 
> diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
> index 3921261b4fd4..c31f7b407b84 100644
> --- a/net/mptcp/bpf.c
> +++ b/net/mptcp/bpf.c
> @@ -288,6 +288,31 @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
>  {
>  }
>  
> +struct bpf_iter_mptcp_subflow_sched {
> +	struct bpf_iter_mptcp_subflow it;
> +};
> +
> +__bpf_kfunc static int
> +bpf_iter_mptcp_subflow_sched_new(struct bpf_iter_mptcp_subflow_sched *it,
> +				 struct sock *sk, struct mptcp_sched_data *data)
> +{
> +	if (!mptcp_sched_check_bpf_iter_task(data))
> +		return -EINVAL;
> +
> +	return bpf_iter_mptcp_subflow_new(&it->it, sk);

We would need the same thing for the BPF PM I suppose, no?

Then, why not having something more generic, either:

 - add "struct task_struct *" in the msk structure

 - or pass a "const struct task_struct *bpf_iter_task" instead of
something sched specific?

For the first idea, I guess it should work because the helper will be
called when the msk lock will be owned by the caller. So we should not
have the PM and scheduler setting it at the same time from different
context, right?
Also, if this helper receives a msk in argument, no need to check that
it is a valid MPTCP socket, etc., right?

If one of these two ideas is used, no need to re-introduce
mptcp_sched_data. The API is not settled yet, so no need to worry about
that. It is even a good time to change it.

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


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

end of thread, other threads:[~2025-03-08 11:00 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-07 11:36 [PATCH mptcp-next v2 00/11] add bpf_iter_task Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 01/11] Revert "mptcp: sched: remove mptcp_sched_data" Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 03/11] mptcp: add bpf_iter_task for mptcp_sched_data Geliang Tang
2025-03-08 10:49   ` Matthieu Baerts
2025-03-07 11:36 ` [PATCH mptcp-next v2 04/11] mptcp: set and clear bpf_iter_task Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 05/11] mptcp: add mptcp_subflow_sched bpf_iter Geliang Tang
2025-03-08 11:00   ` Matthieu Baerts
2025-03-07 11:36 ` [PATCH mptcp-next v2 06/11] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 07/11] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 08/11] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 09/11] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 10/11] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
2025-03-07 11:36 ` [PATCH mptcp-next v2 11/11] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
2025-03-07 11:49 ` [PATCH mptcp-next v2 00/11] add bpf_iter_task MPTCP CI
2025-03-07 12:33 ` MPTCP CI

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.