All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4
@ 2023-09-04  9:39 Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 1/9] Squash to "bpf: Export more bpf_burst related functions" Geliang Tang
                   ` (10 more replies)
  0 siblings, 11 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

v3:
 - store burst in msk->snd_burst instead of in sk_storage.
 - make mptcp_sched_data_set_contexts static.
 - rename mptcp_subflow_ctx_by_pos to bpf_mptcp_subflow_ctx_by_pos, and
   add "__bpf_kfunc" before it.

v2:
 - keep sched API unchanged.
 - use bpf_sk_storage_lookup to get snd_burst from BPF context.
 - applied after "add bpf_stale scheduler v3" serise.

v1:

There's a bug in bpf_burst. snd_burst stored in mptcp_burst_storage in
BPF context is not used. msk->snd_burst is still used in kernel space.
To fix this, add two new interfaces in mptcp_sched_ops to get and set
scheduler's paramters from BPF context to kernel space.

Geliang Tang (9):
  Squash to "bpf: Export more bpf_burst related functions"
  Squash to "mptcp: add sched_data helpers"
  Squash to "bpf: Add bpf_mptcp_sched_ops"
  Squash to "selftests/bpf: Add mptcp sched structs"
  Squash to "selftests/bpf: Add bpf_first scheduler"
  Squash to "selftests/bpf: Add bpf_bkup scheduler"
  Squash to "selftests/bpf: Add bpf_rr scheduler"
  Squash to "selftests/bpf: Add bpf_red scheduler"
  Squash to "selftests/bpf: Add bpf_burst scheduler"

 net/mptcp/bpf.c                               | 41 +++++++++++----
 net/mptcp/protocol.h                          |  6 +--
 net/mptcp/sched.c                             | 50 ++++++++-----------
 tools/testing/selftests/bpf/bpf_tcp_helpers.h |  5 +-
 .../selftests/bpf/progs/mptcp_bpf_bkup.c      |  6 +--
 .../selftests/bpf/progs/mptcp_bpf_burst.c     | 30 ++---------
 .../selftests/bpf/progs/mptcp_bpf_first.c     |  3 +-
 .../selftests/bpf/progs/mptcp_bpf_red.c       |  6 +--
 .../selftests/bpf/progs/mptcp_bpf_rr.c        |  9 ++--
 9 files changed, 70 insertions(+), 86 deletions(-)

-- 
2.35.3


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

* [PATCH mptcp-next v3 1/9] Squash to "bpf: Export more bpf_burst related functions"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 2/9] Squash to "mptcp: add sched_data helpers" Geliang Tang
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Add __bpf_kfunc before bpf_mptcp_subflow_queues_empty(), drop __diag_*,
it will be added in the next patch.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 net/mptcp/bpf.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 3c29718156df..8109d9dfaf5e 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -163,17 +163,11 @@ static const struct btf_kfunc_id_set bpf_mptcp_fmodret_set = {
 	.set   = &bpf_mptcp_fmodret_ids,
 };
 
-__diag_push();
-__diag_ignore_all("-Wmissing-prototypes",
-		  "kfuncs which will be used in BPF programs");
-
-bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
+__bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
 {
 	return tcp_rtx_queue_empty(sk);
 }
 
-__diag_pop();
-
 BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
 BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
 BTF_ID_FLAGS(func, mptcp_sched_data_set_contexts)
-- 
2.35.3


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

* [PATCH mptcp-next v3 2/9] Squash to "mptcp: add sched_data helpers"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 1/9] Squash to "bpf: Export more bpf_burst related functions" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 3/9] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Change mptcp_sched_data_set_contexts as static function. Rename
mptcp_subflow_ctx_by_pos with bpf_ prefix, move it into bpf.c in
__diag_* section.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 net/mptcp/bpf.c      | 17 +++++++++++++--
 net/mptcp/protocol.h |  6 ++----
 net/mptcp/sched.c    | 50 +++++++++++++++++++-------------------------
 3 files changed, 39 insertions(+), 34 deletions(-)

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 8109d9dfaf5e..18ddbd36faf3 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -163,15 +163,28 @@ static const struct btf_kfunc_id_set bpf_mptcp_fmodret_set = {
 	.set   = &bpf_mptcp_fmodret_ids,
 };
 
+__diag_push();
+__diag_ignore_all("-Wmissing-prototypes",
+		  "kfuncs which will be used in BPF programs");
+
+__bpf_kfunc struct mptcp_subflow_context *
+bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
+{
+	if (pos >= MPTCP_SUBFLOWS_MAX)
+		return NULL;
+	return data->contexts[pos];
+}
+
 __bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
 {
 	return tcp_rtx_queue_empty(sk);
 }
 
+__diag_pop();
+
 BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
 BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
-BTF_ID_FLAGS(func, mptcp_sched_data_set_contexts)
-BTF_ID_FLAGS(func, mptcp_subflow_ctx_by_pos)
+BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos)
 BTF_ID_FLAGS(func, mptcp_subflow_active)
 BTF_ID_FLAGS(func, mptcp_set_timeout)
 BTF_ID_FLAGS(func, mptcp_wnd_end)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 12d70ce24843..ebf7566005c6 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -643,6 +643,8 @@ void mptcp_sock_graft(struct sock *sk, struct socket *parent);
 u64 mptcp_wnd_end(const struct mptcp_sock *msk);
 void mptcp_set_timeout(struct sock *sk);
 bool bpf_mptcp_subflow_queues_empty(struct sock *sk);
+struct mptcp_subflow_context *
+bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos);
 struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
 bool __mptcp_close(struct sock *sk, long timeout);
 void mptcp_cancel_work(struct sock *sk);
@@ -674,10 +676,6 @@ struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk);
 struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk);
 int mptcp_sched_get_send(struct mptcp_sock *msk);
 int mptcp_sched_get_retrans(struct mptcp_sock *msk);
-void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
-				   struct mptcp_sched_data *data);
-struct mptcp_subflow_context *
-mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos);
 
 static inline bool __tcp_can_send(const struct sock *ssk)
 {
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 2ae3f33bd244..a7e1c10b1984 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -121,6 +121,26 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
 	WRITE_ONCE(subflow->scheduled, scheduled);
 }
 
+static void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
+					  struct mptcp_sched_data *data)
+{
+	struct mptcp_subflow_context *subflow;
+	int i = 0;
+
+	mptcp_for_each_subflow(msk, subflow) {
+		if (i == MPTCP_SUBFLOWS_MAX) {
+			pr_warn_once("too many subflows");
+			break;
+		}
+		mptcp_subflow_set_scheduled(subflow, false);
+		data->contexts[i++] = subflow;
+	}
+	data->subflows = i;
+
+	for (; i < MPTCP_SUBFLOWS_MAX; i++)
+		data->contexts[i] = NULL;
+}
+
 int mptcp_sched_get_send(struct mptcp_sock *msk)
 {
 	struct mptcp_subflow_context *subflow;
@@ -147,6 +167,7 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
 	data.reinject = false;
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
 		return mptcp_sched_default_get_subflow(msk, &data);
+	mptcp_sched_data_set_contexts(msk, &data);
 	return msk->sched->get_subflow(msk, &data);
 }
 
@@ -169,33 +190,6 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
 	data.reinject = true;
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
 		return mptcp_sched_default_get_subflow(msk, &data);
+	mptcp_sched_data_set_contexts(msk, &data);
 	return msk->sched->get_subflow(msk, &data);
 }
-
-void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
-				   struct mptcp_sched_data *data)
-{
-	struct mptcp_subflow_context *subflow;
-	int i = 0;
-
-	mptcp_for_each_subflow(msk, subflow) {
-		if (i == MPTCP_SUBFLOWS_MAX) {
-			pr_warn_once("too many subflows");
-			break;
-		}
-		mptcp_subflow_set_scheduled(subflow, false);
-		data->contexts[i++] = subflow;
-	}
-	data->subflows = i;
-
-	for (; i < MPTCP_SUBFLOWS_MAX; i++)
-		data->contexts[i] = NULL;
-}
-
-struct mptcp_subflow_context *
-mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
-{
-	if (pos >= MPTCP_SUBFLOWS_MAX)
-		return NULL;
-	return data->contexts[pos];
-}
-- 
2.35.3


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

* [PATCH mptcp-next v3 3/9] Squash to "bpf: Add bpf_mptcp_sched_ops"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 1/9] Squash to "bpf: Export more bpf_burst related functions" Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 2/9] Squash to "mptcp: add sched_data helpers" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 4/9] Squash to "selftests/bpf: Add mptcp sched structs" Geliang Tang
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Add write acess to msk->snd_burst.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 net/mptcp/bpf.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 18ddbd36faf3..b92c9014ac2c 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -18,8 +18,8 @@
 
 #ifdef CONFIG_BPF_JIT
 extern struct bpf_struct_ops bpf_mptcp_sched_ops;
-static const struct btf_type *mptcp_sched_type __read_mostly;
-static u32 mptcp_sched_id;
+static const struct btf_type *mptcp_sock_type, *mptcp_subflow_type __read_mostly;
+static u32 mptcp_sock_id, mptcp_subflow_id;
 
 static const struct bpf_func_proto *
 bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id,
@@ -47,12 +47,15 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
 	size_t end;
 
 	t = btf_type_by_id(reg->btf, reg->btf_id);
-	if (t != mptcp_sched_type) {
-		bpf_log(log, "only access to mptcp_subflow_context is supported\n");
+	if (t != mptcp_sock_type && t != mptcp_subflow_type) {
+		bpf_log(log, "only access to mptcp sock or subflow is supported\n");
 		return -EACCES;
 	}
 
 	switch (off) {
+	case offsetof(struct mptcp_sock, snd_burst):
+		end = offsetofend(struct mptcp_sock, snd_burst);
+		break;
 	case offsetof(struct mptcp_subflow_context, scheduled):
 		end = offsetofend(struct mptcp_subflow_context, scheduled);
 		break;
@@ -60,12 +63,14 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
 		end = offsetofend(struct mptcp_subflow_context, avg_pacing_rate);
 		break;
 	default:
-		bpf_log(log, "no write support to mptcp_subflow_context at off %d\n", off);
+		bpf_log(log, "no write support to %s at off %d\n",
+			t == mptcp_sock_type ? "mptcp_sock" : "mptcp_subflow_context", off);
 		return -EACCES;
 	}
 
 	if (off + size > end) {
-		bpf_log(log, "access beyond mptcp_subflow_context at off %u size %u ended at %zu",
+		bpf_log(log, "access beyond %s at off %u size %u ended at %zu",
+			t == mptcp_sock_type ? "mptcp_sock" : "mptcp_subflow_context",
 			off, size, end);
 		return -EACCES;
 	}
@@ -125,12 +130,19 @@ static int bpf_mptcp_sched_init(struct btf *btf)
 {
 	s32 type_id;
 
+	type_id = btf_find_by_name_kind(btf, "mptcp_sock",
+					BTF_KIND_STRUCT);
+	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_sched_id = type_id;
-	mptcp_sched_type = btf_type_by_id(btf, mptcp_sched_id);
+	mptcp_subflow_id = type_id;
+	mptcp_subflow_type = btf_type_by_id(btf, mptcp_subflow_id);
 
 	return 0;
 }
-- 
2.35.3


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

* [PATCH mptcp-next v3 4/9] Squash to "selftests/bpf: Add mptcp sched structs"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (2 preceding siblings ...)
  2023-09-04  9:39 ` [PATCH mptcp-next v3 3/9] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 5/9] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Update mptcp_sched_data_set_contexts and mptcp_subflow_ctx_by_pos.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/bpf_tcp_helpers.h | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index b687f91f2da8..36a53381a4c0 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -269,10 +269,8 @@ struct mptcp_sock {
 
 extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
 					bool scheduled) __ksym;
-extern void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
-					  struct mptcp_sched_data *data) __ksym;
 extern struct mptcp_subflow_context *
-mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym;
+bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym;
 static __always_inline struct sock *
 mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
 {
-- 
2.35.3


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

* [PATCH mptcp-next v3 5/9] Squash to "selftests/bpf: Add bpf_first scheduler"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (3 preceding siblings ...)
  2023-09-04  9:39 ` [PATCH mptcp-next v3 4/9] Squash to "selftests/bpf: Add mptcp sched structs" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 6/9] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Update mptcp_sched_data_set_contexts and mptcp_subflow_ctx_by_pos.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
index ae0eced5b91f..23a3e8e69e8f 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
@@ -19,8 +19,7 @@ void BPF_PROG(mptcp_sched_first_release, struct mptcp_sock *msk)
 int BPF_STRUCT_OPS(bpf_first_get_subflow, struct mptcp_sock *msk,
 		   struct mptcp_sched_data *data)
 {
-	mptcp_sched_data_set_contexts(msk, data);
-	mptcp_subflow_set_scheduled(mptcp_subflow_ctx_by_pos(data, 0), true);
+	mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true);
 	return 0;
 }
 
-- 
2.35.3


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

* [PATCH mptcp-next v3 6/9] Squash to "selftests/bpf: Add bpf_bkup scheduler"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (4 preceding siblings ...)
  2023-09-04  9:39 ` [PATCH mptcp-next v3 5/9] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 7/9] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Update mptcp_sched_data_set_contexts and mptcp_subflow_ctx_by_pos.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
index 904186fb6750..bfd4644dd592 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
@@ -21,12 +21,10 @@ int BPF_STRUCT_OPS(bpf_bkup_get_subflow, struct mptcp_sock *msk,
 {
 	int nr = -1;
 
-	mptcp_sched_data_set_contexts(msk, data);
-
 	for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
 		struct mptcp_subflow_context *subflow;
 
-		subflow = mptcp_subflow_ctx_by_pos(data, i);
+		subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
 		if (!subflow)
 			break;
 
@@ -37,7 +35,7 @@ int BPF_STRUCT_OPS(bpf_bkup_get_subflow, struct mptcp_sock *msk,
 	}
 
 	if (nr != -1) {
-		mptcp_subflow_set_scheduled(mptcp_subflow_ctx_by_pos(data, nr), true);
+		mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, nr), true);
 		return -1;
 	}
 	return 0;
-- 
2.35.3


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

* [PATCH mptcp-next v3 7/9] Squash to "selftests/bpf: Add bpf_rr scheduler"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (5 preceding siblings ...)
  2023-09-04  9:39 ` [PATCH mptcp-next v3 6/9] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 8/9] Squash to "selftests/bpf: Add bpf_red scheduler" Geliang Tang
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Update mptcp_sched_data_set_contexts and mptcp_subflow_ctx_by_pos.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index 347ffad90860..39b7e1cfbbd5 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -45,15 +45,14 @@ int BPF_STRUCT_OPS(bpf_rr_get_subflow, struct mptcp_sock *msk,
 
 	last_snd = ptr->last_snd;
 
-	mptcp_sched_data_set_contexts(msk, data);
-
 	for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
-		subflow = mptcp_subflow_ctx_by_pos(data, i);
+		subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
 		if (!last_snd || !subflow)
 			break;
 
 		if (mptcp_subflow_tcp_sock(subflow) == last_snd) {
-			if (i + 1 == MPTCP_SUBFLOWS_MAX || !mptcp_subflow_ctx_by_pos(data, i + 1))
+			if (i + 1 == MPTCP_SUBFLOWS_MAX ||
+			    !bpf_mptcp_subflow_ctx_by_pos(data, i + 1))
 				break;
 
 			nr = i + 1;
@@ -61,7 +60,7 @@ int BPF_STRUCT_OPS(bpf_rr_get_subflow, struct mptcp_sock *msk,
 		}
 	}
 
-	subflow = mptcp_subflow_ctx_by_pos(data, nr);
+	subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr);
 	if (!subflow)
 		return -1;
 	mptcp_subflow_set_scheduled(subflow, true);
-- 
2.35.3


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

* [PATCH mptcp-next v3 8/9] Squash to "selftests/bpf: Add bpf_red scheduler"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (6 preceding siblings ...)
  2023-09-04  9:39 ` [PATCH mptcp-next v3 7/9] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-04  9:39 ` [PATCH mptcp-next v3 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler" Geliang Tang
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Update mptcp_sched_data_set_contexts and mptcp_subflow_ctx_by_pos.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
index eeeec6250f64..a3f3e5ca5278 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
@@ -19,13 +19,11 @@ void BPF_PROG(mptcp_sched_red_release, struct mptcp_sock *msk)
 int BPF_STRUCT_OPS(bpf_red_get_subflow, struct mptcp_sock *msk,
 		   struct mptcp_sched_data *data)
 {
-	mptcp_sched_data_set_contexts(msk, data);
-
 	for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
-		if (!mptcp_subflow_ctx_by_pos(data, i))
+		if (!bpf_mptcp_subflow_ctx_by_pos(data, i))
 			break;
 
-		mptcp_subflow_set_scheduled(mptcp_subflow_ctx_by_pos(data, i), true);
+		mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, i), true);
 	}
 
 	return 0;
-- 
2.35.3


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

* [PATCH mptcp-next v3 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler"
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (7 preceding siblings ...)
  2023-09-04  9:39 ` [PATCH mptcp-next v3 8/9] Squash to "selftests/bpf: Add bpf_red scheduler" Geliang Tang
@ 2023-09-04  9:39 ` Geliang Tang
  2023-09-13  1:37 ` [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Mat Martineau
  2023-09-16 11:49 ` Matthieu Baerts
  10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2023-09-04  9:39 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Update mptcp_sched_data_set_contexts and mptcp_subflow_ctx_by_pos.

Store burst in msk->snd_burst instead of in sk_storage.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/bpf_tcp_helpers.h |  1 +
 .../selftests/bpf/progs/mptcp_bpf_burst.c     | 30 ++++---------------
 2 files changed, 6 insertions(+), 25 deletions(-)

diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index 36a53381a4c0..6b43845f1234 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -262,6 +262,7 @@ struct mptcp_sock {
 	struct inet_connection_sock	sk;
 
 	__u64		snd_nxt;
+	int		snd_burst;
 	__u32		token;
 	struct sock	*first;
 	char		ca_name[TCP_CA_NAME_MAX];
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
index b6a8a051741d..b3c811564866 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
@@ -7,17 +7,6 @@
 
 char _license[] SEC("license") = "GPL";
 
-struct mptcp_burst_storage {
-	int snd_burst;
-};
-
-struct {
-	__uint(type, BPF_MAP_TYPE_SK_STORAGE);
-	__uint(map_flags, BPF_F_NO_PREALLOC);
-	__type(key, int);
-	__type(value, struct mptcp_burst_storage);
-} mptcp_burst_map SEC(".maps");
-
 #define MPTCP_SEND_BURST_SIZE	65428
 
 struct subflow_send_info {
@@ -69,14 +58,11 @@ static __always_inline bool sk_stream_memory_free(const struct sock *sk)
 SEC("struct_ops/mptcp_sched_burst_init")
 void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk)
 {
-	bpf_sk_storage_get(&mptcp_burst_map, msk, 0,
-			   BPF_LOCAL_STORAGE_GET_F_CREATE);
 }
 
 SEC("struct_ops/mptcp_sched_burst_release")
 void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk)
 {
-	bpf_sk_storage_delete(&mptcp_burst_map, msk);
 }
 
 static int bpf_burst_get_send(struct mptcp_sock *msk,
@@ -85,7 +71,6 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
 	struct subflow_send_info send_info[SSK_MODE_MAX];
 	struct mptcp_subflow_context *subflow;
 	struct sock *sk = (struct sock *)msk;
-	struct mptcp_burst_storage *ptr;
 	__u32 pace, burst, wmem;
 	__u64 linger_time;
 	struct sock *ssk;
@@ -98,7 +83,7 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
 	}
 
 	for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
-		subflow = mptcp_subflow_ctx_by_pos(data, i);
+		subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
 		if (!subflow)
 			break;
 
@@ -127,7 +112,7 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
 	if (send_info[SSK_MODE_ACTIVE].subflow_id == MPTCP_SUBFLOWS_MAX)
 		send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id;
 
-	subflow = mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id);
+	subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id);
 	if (!subflow)
 		return -1;
 	ssk = mptcp_subflow_tcp_sock(subflow);
@@ -142,10 +127,7 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
 	subflow->avg_pacing_rate = div_u64((__u64)subflow->avg_pacing_rate * wmem +
 					   ssk->sk_pacing_rate * burst,
 					   burst + wmem);
-	ptr = bpf_sk_storage_get(&mptcp_burst_map, msk, 0,
-				 BPF_LOCAL_STORAGE_GET_F_CREATE);
-	if (ptr)
-		ptr->snd_burst = burst;
+	msk->snd_burst = burst;
 
 out:
 	mptcp_subflow_set_scheduled(subflow, true);
@@ -161,7 +143,7 @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk,
 	struct sock *ssk;
 
 	for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
-		subflow = mptcp_subflow_ctx_by_pos(data, i);
+		subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
 		if (!subflow)
 			break;
 
@@ -193,7 +175,7 @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk,
 	subflow_id = min_stale_count > 1 ? backup : MPTCP_SUBFLOWS_MAX;
 
 out:
-	subflow = mptcp_subflow_ctx_by_pos(data, subflow_id);
+	subflow = bpf_mptcp_subflow_ctx_by_pos(data, subflow_id);
 	if (!subflow)
 		return -1;
 	mptcp_subflow_set_scheduled(subflow, true);
@@ -203,8 +185,6 @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk,
 int BPF_STRUCT_OPS(bpf_burst_get_subflow, struct mptcp_sock *msk,
 		   struct mptcp_sched_data *data)
 {
-	mptcp_sched_data_set_contexts(msk, data);
-
 	if (data->reinject)
 		return bpf_burst_get_retrans(msk, data);
 	return bpf_burst_get_send(msk, data);
-- 
2.35.3


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

* Re: [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (8 preceding siblings ...)
  2023-09-04  9:39 ` [PATCH mptcp-next v3 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler" Geliang Tang
@ 2023-09-13  1:37 ` Mat Martineau
  2023-09-16 11:49 ` Matthieu Baerts
  10 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2023-09-13  1:37 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp

On Mon, 4 Sep 2023, Geliang Tang wrote:

> v3:
> - store burst in msk->snd_burst instead of in sk_storage.
> - make mptcp_sched_data_set_contexts static.
> - rename mptcp_subflow_ctx_by_pos to bpf_mptcp_subflow_ctx_by_pos, and
>   add "__bpf_kfunc" before it.
>

Hi Geliang -

Apologies for the delay on reviewing these. The series looks good to 
squash, thanks!

- Mat


> v2:
> - keep sched API unchanged.
> - use bpf_sk_storage_lookup to get snd_burst from BPF context.
> - applied after "add bpf_stale scheduler v3" serise.
>
> v1:
>
> There's a bug in bpf_burst. snd_burst stored in mptcp_burst_storage in
> BPF context is not used. msk->snd_burst is still used in kernel space.
> To fix this, add two new interfaces in mptcp_sched_ops to get and set
> scheduler's paramters from BPF context to kernel space.
>
> Geliang Tang (9):
>  Squash to "bpf: Export more bpf_burst related functions"
>  Squash to "mptcp: add sched_data helpers"
>  Squash to "bpf: Add bpf_mptcp_sched_ops"
>  Squash to "selftests/bpf: Add mptcp sched structs"
>  Squash to "selftests/bpf: Add bpf_first scheduler"
>  Squash to "selftests/bpf: Add bpf_bkup scheduler"
>  Squash to "selftests/bpf: Add bpf_rr scheduler"
>  Squash to "selftests/bpf: Add bpf_red scheduler"
>  Squash to "selftests/bpf: Add bpf_burst scheduler"
>
> net/mptcp/bpf.c                               | 41 +++++++++++----
> net/mptcp/protocol.h                          |  6 +--
> net/mptcp/sched.c                             | 50 ++++++++-----------
> tools/testing/selftests/bpf/bpf_tcp_helpers.h |  5 +-
> .../selftests/bpf/progs/mptcp_bpf_bkup.c      |  6 +--
> .../selftests/bpf/progs/mptcp_bpf_burst.c     | 30 ++---------
> .../selftests/bpf/progs/mptcp_bpf_first.c     |  3 +-
> .../selftests/bpf/progs/mptcp_bpf_red.c       |  6 +--
> .../selftests/bpf/progs/mptcp_bpf_rr.c        |  9 ++--
> 9 files changed, 70 insertions(+), 86 deletions(-)
>
> -- 
> 2.35.3
>
>
>

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

* Re: [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4
  2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
                   ` (9 preceding siblings ...)
  2023-09-13  1:37 ` [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Mat Martineau
@ 2023-09-16 11:49 ` Matthieu Baerts
  10 siblings, 0 replies; 12+ messages in thread
From: Matthieu Baerts @ 2023-09-16 11:49 UTC (permalink / raw)
  To: Geliang Tang, mptcp

Hi Geliang, Mat,

On 04/09/2023 11:39, Geliang Tang wrote:
> v3:
>  - store burst in msk->snd_burst instead of in sk_storage.
>  - make mptcp_sched_data_set_contexts static.
>  - rename mptcp_subflow_ctx_by_pos to bpf_mptcp_subflow_ctx_by_pos, and
>    add "__bpf_kfunc" before it.
> 
> v2:
>  - keep sched API unchanged.
>  - use bpf_sk_storage_lookup to get snd_burst from BPF context.
>  - applied after "add bpf_stale scheduler v3" serise.
> 
> v1:
> 
> There's a bug in bpf_burst. snd_burst stored in mptcp_burst_storage in
> BPF context is not used. msk->snd_burst is still used in kernel space.
> To fix this, add two new interfaces in mptcp_sched_ops to get and set
> scheduler's paramters from BPF context to kernel space.

Thank you for the patches and the review!

I just applied these patches in our tree. Please make sure I correctly
fix the different conflicts and I didn't miss any instructions.

New patches for t/upstream:
- 5eed4d815c41: "squashed" patch 1/9 in "bpf: Export more bpf_burst
related functions"
- 764bf652d4bf: "squashed" patch 2/9 (with conflicts) in "mptcp: add
sched_data helpers"
- 9906c014e61a: "squashed" patch 3/9 in "bpf: Add bpf_mptcp_sched_ops"
- 816a6f2cad25: conflict in t/bpf-Add-bpf_mptcp_sched_kfunc_set
- ff8a0c543074: "squashed" patch 4/9 (with conflicts) in "selftests/bpf:
Add mptcp sched structs"
- a0098f3f355d: "squashed" patch 5/9 in "selftests/bpf: Add bpf_first
scheduler"
- d9c7f7c37051: "squashed" patch 6/9 in "selftests/bpf: Add bpf_bkup
scheduler"
- 2e2e1a1bfb70: conflict in t/selftests-bpf-Add-bpf_rr-scheduler
- 6c22024f0008: "squashed" patch 7/9 in "selftests/bpf: Add bpf_rr
scheduler"
- 684e5a0e4824: "squashed" patch 8/9 in "selftests/bpf: Add bpf_red
scheduler"
- 6b458f5734d3: conflict in t/bpf-Export-more-bpf_burst-related-functions
- 24d78ea20a36: "squashed" patch 9/9 in "selftests/bpf: Add bpf_burst
scheduler"
- Results: 6b6b68bc221b..fe720f4b5da8 (export)

Tests are now in progress:

https://cirrus-ci.com/github/multipath-tcp/mptcp_net-next/export/20230916T114711

Cheers,
Matt
-- 
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net

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

end of thread, other threads:[~2023-09-16 11:49 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-04  9:39 [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 1/9] Squash to "bpf: Export more bpf_burst related functions" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 2/9] Squash to "mptcp: add sched_data helpers" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 3/9] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 4/9] Squash to "selftests/bpf: Add mptcp sched structs" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 5/9] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 6/9] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 7/9] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 8/9] Squash to "selftests/bpf: Add bpf_red scheduler" Geliang Tang
2023-09-04  9:39 ` [PATCH mptcp-next v3 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler" Geliang Tang
2023-09-13  1:37 ` [PATCH mptcp-next v3 0/9] BPF packet scheduler updates part 4 Mat Martineau
2023-09-16 11:49 ` 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.