* [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers
@ 2024-10-12 13:42 Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 01/11] Revert "mptcp: add sched_data helpers" Geliang Tang
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
v5:
- patch 2, drop mptcp_sock_type and mptcp_subflow_type.
- patch 3, revert "bpf: Export more bpf_burst related functions"
- patch 4, merge "bpf: Export more bpf_burst related functions" into it.
v4:
- patch 2, a new cleanup for "bpf: Add bpf_mptcp_sched_ops".
- patch 3 should be reverted.
- patch 8, register kfunc_set.
v3:
- rebased.
- put the "drop has_bytes_sent" squash-to patch into this set.
v2:
- update bpf_rr and bpf_burst
With the newly added mptcp_subflow bpf_iter, we can get rid of the
subflows array "contexts" in struct mptcp_sched_data. This set
uses bpf_for_each(mptcp_subflow) helper to update all the bpf
schedules:
bpf_for_each(mptcp_subflow, subflow, msk) {
... ...
mptcp_subflow_set_scheduled(subflow, true);
}
Depends on:
- "add mptcp_subflow bpf_iter" v9
Based-on: <cover.1728466623.git.tanggeliang@kylinos.cn>
Geliang Tang (11):
Revert "mptcp: add sched_data helpers"
Squash to "bpf: Add bpf_mptcp_sched_ops"
Revert "bpf: Export more bpf_burst related functions"
Squash to "bpf: Add bpf_mptcp_sched_kfunc_set"
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
Squash to "selftests/bpf: Add bpf scheduler test" - drop
has_bytes_sent
include/net/mptcp.h | 2 -
net/mptcp/bpf.c | 24 ++----
net/mptcp/protocol.h | 3 -
net/mptcp/sched.c | 22 ------
.../testing/selftests/bpf/prog_tests/mptcp.c | 48 ++++++------
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 -
.../selftests/bpf/progs/mptcp_bpf_bkup.c | 16 +---
.../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++++----------
.../selftests/bpf/progs/mptcp_bpf_bytes.c | 39 ++++++++++
.../selftests/bpf/progs/mptcp_bpf_first.c | 8 +-
.../selftests/bpf/progs/mptcp_bpf_red.c | 8 +-
.../selftests/bpf/progs/mptcp_bpf_rr.c | 24 +++---
12 files changed, 133 insertions(+), 142 deletions(-)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 01/11] Revert "mptcp: add sched_data helpers"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Drop this patch.
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 9b87eee13955..681a76f7c6a8 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -271,14 +271,6 @@ __bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk)
WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
}
-__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);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index b963e68451b1..e774f28a6f8d 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -723,8 +723,6 @@ 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);
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 5257bc6c8cd6..78ed508ebc1b 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -143,26 +143,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;
@@ -189,7 +169,6 @@ 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);
}
@@ -212,6 +191,5 @@ 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);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 01/11] Revert "mptcp: add sched_data helpers" Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 03/11] Revert "bpf: Export more bpf_burst related functions" Geliang Tang
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Please update the subject to
bpf: Add mptcp packet scheduler struct_ops
Drop mptcp_sock_type and mptcp_subflow_type.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 681a76f7c6a8..3be587c7b21e 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -18,9 +18,10 @@
#ifdef CONFIG_BPF_JIT
static struct bpf_struct_ops bpf_mptcp_sched_ops;
-static const struct btf_type *mptcp_sock_type, *mptcp_subflow_type __read_mostly;
static u32 mptcp_sock_id, mptcp_subflow_id;
+/* MPTCP BPF packet scheduler */
+
static const struct bpf_func_proto *
bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id,
const struct bpf_prog *prog)
@@ -43,12 +44,10 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
const struct bpf_reg_state *reg,
int off, int size)
{
- const struct btf_type *t;
+ u32 id = reg->btf_id;
size_t end;
- t = btf_type_by_id(reg->btf, reg->btf_id);
-
- if (t == mptcp_sock_type) {
+ if (id == mptcp_sock_id) {
switch (off) {
case offsetof(struct mptcp_sock, snd_burst):
end = offsetofend(struct mptcp_sock, snd_burst);
@@ -58,7 +57,7 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
off);
return -EACCES;
}
- } else if (t == mptcp_subflow_type) {
+ } else if (id == mptcp_subflow_id) {
switch (off) {
case offsetof(struct mptcp_subflow_context, avg_pacing_rate):
end = offsetofend(struct mptcp_subflow_context, avg_pacing_rate);
@@ -75,7 +74,7 @@ static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
if (off + size > end) {
bpf_log(log, "access beyond %s at off %u size %u ended at %zu",
- t == mptcp_sock_type ? "mptcp_sock" : "mptcp_subflow_context",
+ id == mptcp_sock_id ? "mptcp_sock" : "mptcp_subflow_context",
off, size, end);
return -EACCES;
}
@@ -140,14 +139,12 @@ static int bpf_mptcp_sched_init(struct btf *btf)
if (type_id < 0)
return -EINVAL;
mptcp_sock_id = type_id;
- mptcp_sock_type = btf_type_by_id(btf, mptcp_sock_id);
type_id = btf_find_by_name_kind(btf, "mptcp_subflow_context",
BTF_KIND_STRUCT);
if (type_id < 0)
return -EINVAL;
mptcp_subflow_id = type_id;
- mptcp_subflow_type = btf_type_by_id(btf, mptcp_subflow_id);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 03/11] Revert "bpf: Export more bpf_burst related functions"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 01/11] Revert "mptcp: add sched_data helpers" Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 04/11] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
This reverts commit d0f5ca7a98fea075d60fb88f1c2b29a6f5f04d68.
---
net/mptcp/bpf.c | 10 ----------
net/mptcp/protocol.c | 4 ++--
net/mptcp/protocol.h | 3 ---
3 files changed, 2 insertions(+), 15 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 3be587c7b21e..627839383b29 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -268,11 +268,6 @@ __bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk)
WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
}
-__bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
-{
- return tcp_rtx_queue_empty(sk);
-}
-
__bpf_kfunc_end_defs();
BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)
@@ -294,11 +289,6 @@ static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids)
BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos)
-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_mptcp_subflow_queues_empty)
-BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale)
BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids)
static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = {
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index e420ce9bbfb6..e978e05ec8d1 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -50,7 +50,7 @@ DEFINE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
static struct net_device mptcp_napi_dev;
/* Returns end sequence number of the receiver's advertised window */
-u64 mptcp_wnd_end(const struct mptcp_sock *msk)
+static u64 mptcp_wnd_end(const struct mptcp_sock *msk)
{
return READ_ONCE(msk->wnd_end);
}
@@ -489,7 +489,7 @@ static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subfl
inet_csk(ssk)->icsk_timeout - jiffies : 0;
}
-void mptcp_set_timeout(struct sock *sk)
+static void mptcp_set_timeout(struct sock *sk)
{
struct mptcp_subflow_context *subflow;
long tout = 0;
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index e774f28a6f8d..a93e661ef5c4 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -720,9 +720,6 @@ void __mptcp_subflow_send_ack(struct sock *ssk);
void mptcp_subflow_reset(struct sock *ssk);
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);
-bool bpf_mptcp_subflow_queues_empty(struct sock *sk);
struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
bool __mptcp_close(struct sock *sk, long timeout);
void mptcp_cancel_work(struct sock *sk);
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 04/11] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (2 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 03/11] Revert "bpf: Export more bpf_burst related functions" Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 05/11] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Please update the subject to
"bpf: Export mptcp packet scheduler helpers"
Remove bpf_mptcp_subflow_ctx_by_pos from BPF kfunc set.
Merge "bpf: Export more bpf_burst related functions" into this patch.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 11 ++++++++++-
net/mptcp/protocol.c | 4 ++--
net/mptcp/protocol.h | 2 ++
3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 627839383b29..38034d3f28f8 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -268,6 +268,11 @@ __bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk)
WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
}
+__bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
+{
+ return tcp_rtx_queue_empty(sk);
+}
+
__bpf_kfunc_end_defs();
BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)
@@ -288,7 +293,11 @@ static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
};
BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids)
-BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos)
+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_mptcp_subflow_queues_empty)
+BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale)
BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids)
static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = {
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index e978e05ec8d1..e420ce9bbfb6 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -50,7 +50,7 @@ DEFINE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
static struct net_device mptcp_napi_dev;
/* Returns end sequence number of the receiver's advertised window */
-static u64 mptcp_wnd_end(const struct mptcp_sock *msk)
+u64 mptcp_wnd_end(const struct mptcp_sock *msk)
{
return READ_ONCE(msk->wnd_end);
}
@@ -489,7 +489,7 @@ static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subfl
inet_csk(ssk)->icsk_timeout - jiffies : 0;
}
-static void mptcp_set_timeout(struct sock *sk)
+void mptcp_set_timeout(struct sock *sk)
{
struct mptcp_subflow_context *subflow;
long tout = 0;
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index a93e661ef5c4..7848a1989d17 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -720,6 +720,8 @@ void __mptcp_subflow_send_ack(struct sock *ssk);
void mptcp_subflow_reset(struct sock *ssk);
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 sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
bool __mptcp_close(struct sock *sk, long timeout);
void mptcp_cancel_work(struct sock *sk);
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 05/11] Squash to "selftests/bpf: Add bpf_first scheduler & test"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (3 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 04/11] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 06/11] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 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.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 e18796361394..260bc239655a 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
@@ -55,7 +55,4 @@ bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym;
extern struct sock *
bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __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 d57399b407a7..807685b3ab97 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_subflow, 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;
+
+ bpf_for_each(mptcp_subflow, subflow, msk) {
+ mptcp_subflow_set_scheduled(subflow, true);
+ break;
+ }
+
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 06/11] Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (4 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 05/11] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 07/11] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 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 296f0318d843..70c3a69d4a47 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_subflow, 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, 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] 12+ messages in thread
* [PATCH mptcp-next v5 07/11] Squash to "selftests/bpf: Add bpf_rr scheduler & test"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (5 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 06/11] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 08/11] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 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 | 24 ++++++++-----------
1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index 638ea6aa63b7..0e806caa10df 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -34,10 +34,9 @@ SEC("struct_ops")
int BPF_PROG(bpf_rr_get_subflow, 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);
@@ -45,27 +44,24 @@ int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk,
return -1;
last_snd = ptr->last_snd;
+ next = bpf_mptcp_subflow_ctx(msk->first);
- 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)
+ bpf_for_each(mptcp_subflow, subflow, msk) {
+ if (!last_snd)
break;
- if (mptcp_subflow_tcp_sock(subflow) == last_snd) {
- if (i + 1 == MPTCP_SUBFLOWS_MAX ||
- !bpf_mptcp_subflow_ctx_by_pos(data, i + 1))
+ if (bpf_mptcp_subflow_tcp_sock(subflow) == 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);
+ mptcp_subflow_set_scheduled(next, true);
+ ptr->last_snd = bpf_mptcp_subflow_tcp_sock(next);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 08/11] Squash to "selftests/bpf: Add bpf_red scheduler & test"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (6 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 07/11] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 09/11] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 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 cc0aab732fc4..ce19d604b898 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_subflow, 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, msk)
+ mptcp_subflow_set_scheduled(subflow, true);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 09/11] Squash to "selftests/bpf: Add bpf_burst scheduler & test"
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (7 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 08/11] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 10/11] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 11/11] Squash to "selftests/bpf: Add bpf scheduler test" - drop has_bytes_sent Geliang Tang
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 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 mptcp_subflow_active declaration.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/bpf/progs/mptcp_bpf_burst.c | 78 +++++++++----------
1 file changed, 39 insertions(+), 39 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
index eb21119aa8f7..87b6d9dc876b 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
@@ -11,22 +11,21 @@ char _license[] SEC("license") = "GPL";
#define min(a, b) ((a) < (b) ? (a) : (b))
+#define SSK_MODE_ACTIVE 0
+#define SSK_MODE_BACKUP 1
+#define SSK_MODE_MAX 2
+
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_mptcp_subflow_queues_empty(struct sock *sk) __ksym;
extern void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) __ksym;
-#define SSK_MODE_ACTIVE 0
-#define SSK_MODE_BACKUP 1
-#define SSK_MODE_MAX 2
-
static __always_inline __u64 div_u64(__u64 dividend, __u32 divisor)
{
return dividend / divisor;
@@ -57,6 +56,19 @@ static __always_inline bool sk_stream_memory_free(const struct sock *sk)
return __sk_stream_memory_free(sk, 0);
}
+static struct mptcp_subflow_context *
+mptcp_lookup_subflow_by_id(struct mptcp_sock *msk, unsigned int id)
+{
+ struct mptcp_subflow_context *subflow;
+
+ bpf_for_each(mptcp_subflow, subflow, msk) {
+ if (subflow->subflow_id == id)
+ return subflow;
+ }
+
+ return NULL;
+}
+
SEC("struct_ops")
void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk)
{
@@ -67,8 +79,7 @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk)
{
}
-static int bpf_burst_get_send(struct mptcp_sock *msk,
- struct mptcp_sched_data *data)
+static int bpf_burst_get_send(struct mptcp_sock *msk)
{
struct bpf_subflow_send_info send_info[SSK_MODE_MAX];
struct mptcp_subflow_context *subflow;
@@ -84,16 +95,10 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
send_info[i].linger_time = -1;
}
- for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
- bool backup;
+ bpf_for_each(mptcp_subflow, subflow, msk) {
+ bool backup = subflow->backup || subflow->request_bkup;
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
- if (!subflow)
- break;
-
- backup = subflow->backup || subflow->request_bkup;
-
- ssk = mptcp_subflow_tcp_sock(subflow);
+ ssk = bpf_mptcp_subflow_tcp_sock(subflow);
if (!mptcp_subflow_active(subflow))
continue;
@@ -109,7 +114,7 @@ static int 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].subflow_id = subflow->subflow_id;
send_info[backup].linger_time = linger_time;
}
}
@@ -119,10 +124,10 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
if (!nr_active)
send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id;
- subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id);
+ subflow = mptcp_lookup_subflow_by_id(msk, send_info[SSK_MODE_ACTIVE].subflow_id);
if (!subflow)
return -1;
- ssk = mptcp_subflow_tcp_sock(subflow);
+ ssk = bpf_mptcp_subflow_tcp_sock(subflow);
if (!ssk || !sk_stream_memory_free(ssk))
return -1;
@@ -141,23 +146,18 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
return 0;
}
-static int bpf_burst_get_retrans(struct mptcp_sock *msk,
- struct mptcp_sched_data *data)
+static int bpf_burst_get_retrans(struct mptcp_sock *msk)
{
- 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, msk) {
+ struct sock *ssk = bpf_mptcp_subflow_tcp_sock(subflow);
if (!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);
@@ -166,23 +166,23 @@ static int 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);
@@ -194,8 +194,8 @@ int BPF_PROG(bpf_burst_get_subflow, struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
if (data->reinject)
- return bpf_burst_get_retrans(msk, data);
- return bpf_burst_get_send(msk, data);
+ return bpf_burst_get_retrans(msk);
+ return bpf_burst_get_send(msk);
}
SEC(".struct_ops")
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 10/11] mptcp: drop subflow contexts in mptcp_sched_data
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (8 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 09/11] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 11/11] Squash to "selftests/bpf: Add bpf scheduler test" - drop has_bytes_sent Geliang Tang
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 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" and the size of it "subflows" in struct mptcp_sched_data.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
include/net/mptcp.h | 2 --
1 file changed, 2 deletions(-)
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 814b5f2e3ed5..84d67947a517 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -104,8 +104,6 @@ struct mptcp_out_options {
struct mptcp_sched_data {
bool reinject;
- u8 subflows;
- struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
};
struct mptcp_sched_ops {
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next v5 11/11] Squash to "selftests/bpf: Add bpf scheduler test" - drop has_bytes_sent
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
` (9 preceding siblings ...)
2024-10-12 13:42 ` [PATCH mptcp-next v5 10/11] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
@ 2024-10-12 13:42 ` Geliang Tang
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2024-10-12 13:42 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Drop ss_search() and has_bytes_sent(), add a new bpf program to check
the bytes_sent.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../testing/selftests/bpf/prog_tests/mptcp.c | 48 ++++++++++---------
.../selftests/bpf/progs/mptcp_bpf_bytes.c | 39 +++++++++++++++
2 files changed, 65 insertions(+), 22 deletions(-)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 2738951842f6..cb0511e62df8 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -12,6 +12,7 @@
#include "mptcpify.skel.h"
#include "mptcp_subflow.skel.h"
#include "mptcp_bpf_iters_subflow.skel.h"
+#include "mptcp_bpf_bytes.skel.h"
#include "mptcp_bpf_first.skel.h"
#include "mptcp_bpf_bkup.skel.h"
#include "mptcp_bpf_rr.skel.h"
@@ -603,56 +604,59 @@ static struct nstoken *sched_init(char *flags, char *sched)
return NULL;
}
-static int ss_search(char *src, char *dst, char *port, char *keyword)
-{
- return SYS_NOFAIL("ip netns exec %s ss -enita src %s dst %s %s %d | grep -q '%s'",
- NS_TEST, src, dst, port, PORT_1, keyword);
-}
-
-static int has_bytes_sent(char *dst)
-{
- return ss_search(ADDR_1, dst, "sport", "bytes_sent:");
-}
-
static void send_data_and_verify(char *sched, bool addr1, bool addr2)
{
+ int server_fd, client_fd, err;
+ struct mptcp_bpf_bytes *skel;
struct timespec start, end;
- int server_fd, client_fd;
unsigned int delta_ms;
+ skel = mptcp_bpf_bytes__open_and_load();
+ if (!ASSERT_OK_PTR(skel, "open_and_load: bytes"))
+ return;
+
+ skel->bss->pid = getpid();
+
+ err = mptcp_bpf_bytes__attach(skel);
+ if (!ASSERT_OK(err, "skel_attach: bytes"))
+ goto skel_destroy;
+
server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
if (!ASSERT_OK_FD(server_fd, "start_mptcp_server"))
- return;
+ goto skel_destroy;
client_fd = connect_to_fd(server_fd, 0);
if (!ASSERT_OK_FD(client_fd, "connect_to_fd"))
- goto fail;
+ goto close_server;
if (clock_gettime(CLOCK_MONOTONIC, &start) < 0)
- goto fail;
+ goto close_client;
if (!ASSERT_OK(send_recv_data(server_fd, client_fd, total_bytes),
"send_recv_data"))
- goto fail;
+ goto close_client;
if (clock_gettime(CLOCK_MONOTONIC, &end) < 0)
- goto fail;
+ goto close_client;
delta_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
printf("%s: %u ms\n", sched, delta_ms);
if (addr1)
- CHECK(has_bytes_sent(ADDR_1), sched, "should have bytes_sent on addr1\n");
+ ASSERT_GT(skel->bss->bytes_sent_1, 0, "should have bytes_sent on addr1");
else
- CHECK(!has_bytes_sent(ADDR_1), sched, "shouldn't have bytes_sent on addr1\n");
+ ASSERT_EQ(skel->bss->bytes_sent_1, 0, "shouldn't have bytes_sent on addr1");
if (addr2)
- CHECK(has_bytes_sent(ADDR_2), sched, "should have bytes_sent on addr2\n");
+ ASSERT_GT(skel->bss->bytes_sent_2, 0, "should have bytes_sent on addr2");
else
- CHECK(!has_bytes_sent(ADDR_2), sched, "shouldn't have bytes_sent on addr2\n");
+ ASSERT_EQ(skel->bss->bytes_sent_2, 0, "shouldn't have bytes_sent on addr2");
+close_client:
close(client_fd);
-fail:
+close_server:
close(server_fd);
+skel_destroy:
+ mptcp_bpf_bytes__destroy(skel);
}
static void test_default(void)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c
new file mode 100644
index 000000000000..95770b0ebcf0
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bytes.c
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2024, Kylin Software */
+
+/* vmlinux.h, bpf_helpers.h and other 'define' */
+#include "bpf_tracing_net.h"
+#include "mptcp_bpf.h"
+
+char _license[] SEC("license") = "GPL";
+u64 bytes_sent_1 = 0;
+u64 bytes_sent_2 = 0;
+int pid;
+
+SEC("fexit/mptcp_sched_get_send")
+int BPF_PROG(trace_mptcp_sched_get_send, struct mptcp_sock *msk)
+{
+ struct mptcp_subflow_context *subflow;
+
+ if (bpf_get_current_pid_tgid() >> 32 != pid)
+ return 0;
+
+ if (!msk->pm.server_side)
+ return 0;
+
+ mptcp_for_each_subflow(msk, subflow) {
+ struct tcp_sock *tp;
+ struct sock *ssk;
+
+ subflow = bpf_core_cast(subflow, struct mptcp_subflow_context);
+ ssk = mptcp_subflow_tcp_sock(subflow);
+ tp = bpf_core_cast(ssk, struct tcp_sock);
+
+ if (subflow->subflow_id == 1)
+ bytes_sent_1 = tp->bytes_sent;
+ else if (subflow->subflow_id == 2)
+ bytes_sent_2 = tp->bytes_sent;
+ }
+
+ return 0;
+}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-10-12 13:42 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-12 13:42 [PATCH mptcp-next v5 00/11] use bpf_iter in bpf schedulers Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 01/11] Revert "mptcp: add sched_data helpers" Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 02/11] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 03/11] Revert "bpf: Export more bpf_burst related functions" Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 04/11] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 05/11] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 06/11] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 07/11] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 08/11] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 09/11] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 10/11] mptcp: drop subflow contexts in mptcp_sched_data Geliang Tang
2024-10-12 13:42 ` [PATCH mptcp-next v5 11/11] Squash to "selftests/bpf: Add bpf scheduler test" - drop has_bytes_sent Geliang Tang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox