* [PATCH mptcp-next v13 1/9] Squash to "bpf: Register mptcp common kfunc set"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 2/9] Revert "mptcp: add sched_data helpers" Geliang Tang
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Instead of adding a new BPF function bpf_mptcp_send_info_to_ssk() in
v12, this patch uses a much more simpler approach, which using '__ign'
suffix for the argument of bpf_mptcp_subflow_ctx() to let BPF to
ignore the type check of this argument.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index a74173cc8998..c09d5526d976 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -224,11 +224,11 @@ struct bpf_iter_mptcp_subflow_kern {
__bpf_kfunc_start_defs();
__bpf_kfunc static struct mptcp_subflow_context *
-bpf_mptcp_subflow_ctx(const struct sock *sk)
+bpf_mptcp_subflow_ctx(const struct sock *sk__ign)
{
- if (sk && sk_fullsock(sk) &&
- sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
- return mptcp_subflow_ctx(sk);
+ if (sk__ign && sk_fullsock(sk__ign) &&
+ sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign))
+ return mptcp_subflow_ctx(sk__ign);
return NULL;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 2/9] Revert "mptcp: add sched_data helpers"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 1/9] Squash to "bpf: Register mptcp common kfunc set" Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 3/9] Squash to "bpf: Export mptcp packet scheduler helpers" Geliang Tang
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Drop this patch. bpf_mptcp_subflow_ctx_by_pos and
mptcp_sched_data_set_contexts are uesless now.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 8 --------
net/mptcp/protocol.h | 2 --
net/mptcp/sched.c | 22 ----------------------
3 files changed, 32 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index c09d5526d976..76fe99ffe10a 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -276,14 +276,6 @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
{
}
-__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 static bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
{
return tcp_rtx_queue_empty(sk);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index bac5c925a72f..a1d6d996aa93 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -718,8 +718,6 @@ void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
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);
-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);
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 37d86aadaeaa..c2a95d6590e7 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -154,26 +154,6 @@ 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;
@@ -199,7 +179,6 @@ 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);
- mptcp_sched_data_set_contexts(msk, &data);
return msk->sched->get_send(msk, &data);
}
@@ -222,7 +201,6 @@ 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);
- mptcp_sched_data_set_contexts(msk, &data);
if (msk->sched->get_retrans)
return msk->sched->get_retrans(msk, &data);
return msk->sched->get_send(msk, &data);
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 3/9] Squash to "bpf: Export mptcp packet scheduler helpers"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 1/9] Squash to "bpf: Register mptcp common kfunc set" Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 2/9] Revert "mptcp: add sched_data helpers" Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 4/9] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set.
Drop bpf_mptcp_sched_kfunc_set, use bpf_mptcp_common_kfunc_set instead.
Add new helpers bpf_mptcp_subflow_tcp_sock() and
bpf_sk_stream_memory_free().
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 76fe99ffe10a..3f67a24ef372 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -233,6 +233,15 @@ bpf_mptcp_subflow_ctx(const struct sock *sk__ign)
return NULL;
}
+__bpf_kfunc static struct sock *
+bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
+{
+ if (!subflow)
+ return NULL;
+
+ return mptcp_subflow_tcp_sock(subflow);
+}
+
__bpf_kfunc static int
bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it,
struct sock *sk)
@@ -281,34 +290,35 @@ __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
return tcp_rtx_queue_empty(sk);
}
+__bpf_kfunc static bool bpf_sk_stream_memory_free(const struct sock *sk__ign)
+{
+ if (sk__ign && sk_fullsock(sk__ign) &&
+ sk__ign->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk__ign))
+ return sk_stream_memory_free(sk__ign);
+
+ return NULL;
+}
+
__bpf_kfunc_end_defs();
BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)
BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL)
+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_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
-
-static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
- .owner = THIS_MODULE,
- .set = &bpf_mptcp_common_kfunc_ids,
-};
-
-BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids)
BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
-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)
-BTF_ID_FLAGS(func, tcp_stream_memory_free)
+BTF_ID_FLAGS(func, bpf_sk_stream_memory_free, KF_RET_NULL)
BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty)
BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE)
-BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids)
+BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
-static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = {
+static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
.owner = THIS_MODULE,
- .set = &bpf_mptcp_sched_kfunc_ids,
+ .set = &bpf_mptcp_common_kfunc_ids,
};
static int __init bpf_mptcp_kfunc_init(void)
@@ -319,7 +329,7 @@ static int __init bpf_mptcp_kfunc_init(void)
ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT,
&bpf_mptcp_common_kfunc_set);
ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS,
- &bpf_mptcp_sched_kfunc_set);
+ &bpf_mptcp_common_kfunc_set);
#ifdef CONFIG_BPF_JIT
ret = ret ?: register_bpf_struct_ops(&bpf_mptcp_sched_ops, mptcp_sched_ops);
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 4/9] Squash to "selftests/bpf: Add bpf_first scheduler & test"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
` (2 preceding siblings ...)
2025-02-06 9:04 ` [PATCH mptcp-next v13 3/9] Squash to "bpf: Export mptcp packet scheduler helpers" Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 5/9] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Use the newly added bpf_for_each() helper to walk the conn_list.
Drop bpf_mptcp_subflow_ctx_by_pos declaration.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 ---
tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 8 +++++++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
index ede9111ee597..badcffe0942c 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
@@ -51,7 +51,4 @@ bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __ksym;
extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
bool scheduled) __ksym;
-extern struct mptcp_subflow_context *
-bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym;
-
#endif
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
index ab71ae3c6506..73b18eeeb62f 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
@@ -20,7 +20,13 @@ SEC("struct_ops")
int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
- mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true);
+ struct mptcp_subflow_context *subflow;
+
+ subflow = bpf_mptcp_subflow_ctx(msk->first);
+ if (!subflow)
+ return -1;
+
+ mptcp_subflow_set_scheduled(subflow, true);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 5/9] Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
` (3 preceding siblings ...)
2025-02-06 9:04 ` [PATCH mptcp-next v13 4/9] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 6/9] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Use the newly added bpf_for_each() helper to walk the conn_list.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
index 29be67e2f2ef..b7212101705d 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
@@ -20,26 +20,16 @@ SEC("struct_ops")
int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
- int nr = -1;
-
- for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
- struct mptcp_subflow_context *subflow;
-
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
- if (!subflow)
- break;
+ struct mptcp_subflow_context *subflow;
+ bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
if (!BPF_CORE_READ_BITFIELD_PROBED(subflow, backup) ||
!BPF_CORE_READ_BITFIELD_PROBED(subflow, request_bkup)) {
- nr = i;
+ mptcp_subflow_set_scheduled(subflow, true);
break;
}
}
- if (nr != -1) {
- mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, nr), true);
- return -1;
- }
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 6/9] Squash to "selftests/bpf: Add bpf_rr scheduler & test"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
` (4 preceding siblings ...)
2025-02-06 9:04 ` [PATCH mptcp-next v13 5/9] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 7/9] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Use the newly added bpf_for_each() helper to walk the conn_list.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/bpf/progs/mptcp_bpf_rr.c | 31 +++++++++----------
1 file changed, 14 insertions(+), 17 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index 405e96c116d5..4b109adc3602 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -34,38 +34,35 @@ SEC("struct_ops")
int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
- struct mptcp_subflow_context *subflow;
+ struct mptcp_subflow_context *subflow, *next;
struct mptcp_rr_storage *ptr;
- struct sock *last_snd = NULL;
- int nr = 0;
ptr = bpf_sk_storage_get(&mptcp_rr_map, msk, 0,
BPF_LOCAL_STORAGE_GET_F_CREATE);
if (!ptr)
return -1;
- last_snd = ptr->last_snd;
+ next = bpf_mptcp_subflow_ctx(msk->first);
+ if (!next)
+ return -1;
- for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
- if (!last_snd || !subflow)
- break;
+ if (!ptr->last_snd)
+ goto out;
- if (mptcp_subflow_tcp_sock(subflow) == last_snd) {
- if (i + 1 == MPTCP_SUBFLOWS_MAX ||
- !bpf_mptcp_subflow_ctx_by_pos(data, i + 1))
+ bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
+ if (mptcp_subflow_tcp_sock(subflow) == ptr->last_snd) {
+ subflow = bpf_iter_mptcp_subflow_next(&___it);
+ if (!subflow)
break;
- nr = i + 1;
+ next = subflow;
break;
}
}
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, nr);
- if (!subflow)
- return -1;
- mptcp_subflow_set_scheduled(subflow, true);
- ptr->last_snd = mptcp_subflow_tcp_sock(subflow);
+out:
+ mptcp_subflow_set_scheduled(next, true);
+ ptr->last_snd = mptcp_subflow_tcp_sock(next);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 7/9] Squash to "selftests/bpf: Add bpf_red scheduler & test"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
` (5 preceding siblings ...)
2025-02-06 9:04 ` [PATCH mptcp-next v13 6/9] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 8/9] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Use the newly added bpf_for_each() helper to walk the conn_list.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
index 627502e3c851..9f2cab4ba3f7 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
@@ -20,12 +20,10 @@ SEC("struct_ops")
int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
- for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
- if (!bpf_mptcp_subflow_ctx_by_pos(data, i))
- break;
+ struct mptcp_subflow_context *subflow;
- mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, i), true);
- }
+ bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk)
+ mptcp_subflow_set_scheduled(subflow, true);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 8/9] Squash to "selftests/bpf: Add bpf_burst scheduler & test"
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
` (6 preceding siblings ...)
2025-02-06 9:04 ` [PATCH mptcp-next v13 7/9] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 9:04 ` [PATCH mptcp-next v13 9/9] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
2025-02-06 10:43 ` [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers MPTCP CI
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Use the newly added bpf_for_each() helper to walk the conn_list.
Drop bpf_subflow_send_info, use subflow_send_info instead.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++------------
1 file changed, 26 insertions(+), 52 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
index 5743601df9dc..482b30cfb011 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
@@ -11,15 +11,10 @@ char _license[] SEC("license") = "GPL";
#define min(a, b) ((a) < (b) ? (a) : (b))
-struct bpf_subflow_send_info {
- __u8 subflow_id;
- __u64 linger_time;
-};
-
extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym;
extern void mptcp_set_timeout(struct sock *sk) __ksym;
extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym;
-extern bool tcp_stream_memory_free(const struct sock *sk, int wake) __ksym;
+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;
@@ -44,19 +39,6 @@ static __always_inline bool tcp_rtx_and_write_queues_empty(struct sock *sk)
return bpf_mptcp_subflow_queues_empty(sk) && tcp_write_queue_empty(sk);
}
-static __always_inline bool __sk_stream_memory_free(const struct sock *sk, int wake)
-{
- if (sk->sk_wmem_queued >= sk->sk_sndbuf)
- return false;
-
- return tcp_stream_memory_free(sk, wake);
-}
-
-static __always_inline bool sk_stream_memory_free(const struct sock *sk)
-{
- return __sk_stream_memory_free(sk, 0);
-}
-
SEC("struct_ops")
void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk)
{
@@ -71,7 +53,7 @@ SEC("struct_ops")
int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
- struct bpf_subflow_send_info send_info[SSK_MODE_MAX];
+ struct subflow_send_info send_info[SSK_MODE_MAX];
struct mptcp_subflow_context *subflow;
struct sock *sk = (struct sock *)msk;
__u32 pace, burst, wmem;
@@ -81,18 +63,12 @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
/* pick the subflow with the lower wmem/wspace ratio */
for (i = 0; i < SSK_MODE_MAX; ++i) {
- send_info[i].subflow_id = MPTCP_SUBFLOWS_MAX;
+ send_info[i].ssk = NULL;
send_info[i].linger_time = -1;
}
- for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
- bool backup;
-
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
- if (!subflow)
- break;
-
- backup = subflow->backup || subflow->request_bkup;
+ bpf_for_each(mptcp_subflow, subflow, sk) {
+ bool backup = subflow->backup || subflow->request_bkup;
ssk = mptcp_subflow_tcp_sock(subflow);
if (!mptcp_subflow_active(subflow))
@@ -110,7 +86,7 @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace);
if (linger_time < send_info[backup].linger_time) {
- send_info[backup].subflow_id = i;
+ send_info[backup].ssk = ssk;
send_info[backup].linger_time = linger_time;
}
}
@@ -118,16 +94,18 @@ int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
/* pick the best backup if no other subflow is active */
if (!nr_active)
- send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id;
+ send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk;
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id);
- if (!subflow)
+ ssk = send_info[SSK_MODE_ACTIVE].ssk;
+ if (!ssk || !bpf_sk_stream_memory_free(ssk))
return -1;
- ssk = mptcp_subflow_tcp_sock(subflow);
- if (!ssk || !sk_stream_memory_free(ssk))
+
+ subflow = bpf_mptcp_subflow_ctx(ssk);
+ if (!subflow)
return -1;
burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt);
+ ssk = bpf_core_cast(ssk, struct sock);
wmem = ssk->sk_wmem_queued;
if (!burst)
goto out;
@@ -146,20 +124,16 @@ SEC("struct_ops")
int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
- int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id;
+ struct sock *backup = NULL, *pick = NULL;
struct mptcp_subflow_context *subflow;
int min_stale_count = INT_MAX;
- struct sock *ssk;
- for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
- if (!subflow)
- break;
+ bpf_for_each(mptcp_subflow, subflow, (struct sock *)msk) {
+ struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow);
- if (!mptcp_subflow_active(subflow))
+ if (!ssk || !mptcp_subflow_active(subflow))
continue;
- ssk = mptcp_subflow_tcp_sock(subflow);
/* still data outstanding at TCP level? skip this */
if (!tcp_rtx_and_write_queues_empty(ssk)) {
mptcp_pm_subflow_chk_stale(msk, ssk);
@@ -168,23 +142,23 @@ int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk,
}
if (subflow->backup || subflow->request_bkup) {
- if (backup == MPTCP_SUBFLOWS_MAX)
- backup = i;
+ if (!backup)
+ backup = ssk;
continue;
}
- if (pick == MPTCP_SUBFLOWS_MAX)
- pick = i;
+ if (!pick)
+ pick = ssk;
}
- if (pick < MPTCP_SUBFLOWS_MAX) {
- subflow_id = pick;
+ if (pick)
goto out;
- }
- subflow_id = min_stale_count > 1 ? backup : MPTCP_SUBFLOWS_MAX;
+ pick = min_stale_count > 1 ? backup : NULL;
out:
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, subflow_id);
+ if (!pick)
+ return -1;
+ subflow = bpf_mptcp_subflow_ctx(pick);
if (!subflow)
return -1;
mptcp_subflow_set_scheduled(subflow, true);
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH mptcp-next v13 9/9] mptcp: drop subflow contexts in mptcp_sched_data
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
` (7 preceding siblings ...)
2025-02-06 9:04 ` [PATCH mptcp-next v13 8/9] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
@ 2025-02-06 9:04 ` Geliang Tang
2025-02-06 10:43 ` [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers MPTCP CI
9 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2025-02-06 9:04 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
The mptcp_subflow bpf_iter is added now, it's better to use the helper
bpf_for_each(mptcp_subflow) 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" in struct mptcp_sched_data.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
include/net/mptcp.h | 3 ---
1 file changed, 3 deletions(-)
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 2c85ca92bb1c..9f154f509b67 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -100,11 +100,8 @@ 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 {
--
2.43.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers
2025-02-06 9:04 [PATCH mptcp-next v13 0/9] use bpf_iter in bpf schedulers Geliang Tang
` (8 preceding siblings ...)
2025-02-06 9:04 ` [PATCH mptcp-next v13 9/9] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
@ 2025-02-06 10:43 ` MPTCP CI
9 siblings, 0 replies; 11+ messages in thread
From: MPTCP CI @ 2025-02-06 10:43 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: Critical: Global Timeout ❌
- 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/13175549245
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/56925d3521fd
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=931123
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] 11+ messages in thread