* [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2
@ 2023-07-18 3:36 Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 01/13] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
` (14 more replies)
0 siblings, 15 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
v2:
- Init nr to -1 for bpf_bkup and bpf_stale.
- Update has_bytes_sent() to make sure only one item showed in 'ss -it',
this needs to start server with PORT_1.
- Rename to bpf_mptcp_subflow_memory_free() and
bpf_mptcp_subflow_queues_empty().
- Simplify div_u64().
- Move mptcp_subflow_set_stale() to kernel space. stale is a bit filed,
I haven't found a way to set a bit filed in BPF context yet, so set it
in kernel space.
- Sync with new bpf_tcp_ca.c.
Geliang Tang (13):
Squash to "bpf: Add bpf_mptcp_sched_ops"
Squash to "selftests/bpf: Add bpf scheduler test"
Squash to "selftests/bpf: Add bpf_first test"
Squash to "selftests/bpf: Add bpf_bkup scheduler"
Squash to "selftests/bpf: Add bpf_bkup test"
Squash to "selftests/bpf: Add bpf_rr test"
Squash to "selftests/bpf: Add bpf_red test"
mptcp: add subflow_set_stale helper
selftests/bpf: Add bpf_stale scheduler
selftests/bpf: Add bpf_stale test
bpf: Export more bpf_burst related functions
selftests/bpf: Add bpf_burst scheduler
selftests/bpf: Add bpf_burst test
net/mptcp/bpf.c | 44 ++--
net/mptcp/protocol.c | 4 +-
net/mptcp/protocol.h | 6 +
net/mptcp/sched.c | 6 +
tools/testing/selftests/bpf/bpf_tcp_helpers.h | 7 +-
.../testing/selftests/bpf/prog_tests/mptcp.c | 91 +++++++-
.../selftests/bpf/progs/mptcp_bpf_bkup.c | 5 +-
.../selftests/bpf/progs/mptcp_bpf_burst.c | 197 ++++++++++++++++++
.../selftests/bpf/progs/mptcp_bpf_stale.c | 63 ++++++
9 files changed, 384 insertions(+), 39 deletions(-)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_stale.c
--
2.35.3
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 01/13] Squash to "bpf: Add bpf_mptcp_sched_ops"
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 02/13] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
` (13 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Some code in net/ipv4/bpf_tcp_ca.c is removed by the commit
9f0265e921de ("bpf: Require only one of cong_avoid() and cong_control()
from a TCP CC"), sync this into net/mptcp/bpf.c.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/bpf.c | 27 ---------------------------
1 file changed, 27 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index c580add9c7f1..f388baf08d49 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -18,15 +18,9 @@
#ifdef CONFIG_BPF_JIT
extern struct bpf_struct_ops bpf_mptcp_sched_ops;
-extern struct btf *btf_vmlinux;
static const struct btf_type *mptcp_sched_type __read_mostly;
static u32 mptcp_sched_id;
-static u32 optional_sched_ops[] = {
- offsetof(struct mptcp_sched_ops, init),
- offsetof(struct mptcp_sched_ops, release),
-};
-
static const struct bpf_func_proto *
bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id,
const struct bpf_prog *prog)
@@ -101,25 +95,12 @@ static int bpf_mptcp_sched_check_member(const struct btf_type *t,
return 0;
}
-static bool is_optional_sched(u32 member_offset)
-{
- unsigned int i;
-
- for (i = 0; i < ARRAY_SIZE(optional_sched_ops); i++) {
- if (member_offset == optional_sched_ops[i])
- return true;
- }
-
- return false;
-}
-
static int bpf_mptcp_sched_init_member(const struct btf_type *t,
const struct btf_member *member,
void *kdata, const void *udata)
{
const struct mptcp_sched_ops *usched;
struct mptcp_sched_ops *sched;
- int prog_fd;
u32 moff;
usched = (const struct mptcp_sched_ops *)udata;
@@ -136,14 +117,6 @@ static int bpf_mptcp_sched_init_member(const struct btf_type *t,
return 1;
}
- if (!btf_type_resolve_func_ptr(btf_vmlinux, member->type, NULL))
- return 0;
-
- /* Ensure bpf_prog is provided for compulsory func ptr */
- prog_fd = (int)(*(unsigned long *)(udata + moff));
- if (!prog_fd && !is_optional_sched(moff))
- return -EINVAL;
-
return 0;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 02/13] Squash to "selftests/bpf: Add bpf scheduler test"
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 01/13] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 03/13] Squash to "selftests/bpf: Add bpf_first test" Geliang Tang
` (12 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Start server with PORT_1 and update has_bytes_sent.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/prog_tests/mptcp.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 3279ff50ff69..f648e5d49f12 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -296,6 +296,7 @@ static void send_data(int lfd, int fd, char *msg)
#define ADDR_1 "10.0.1.1"
#define ADDR_2 "10.0.1.2"
+#define PORT_1 10001
static struct nstoken *sched_init(char *flags, char *sched)
{
@@ -322,8 +323,8 @@ static int has_bytes_sent(char *addr)
{
char cmd[128];
- snprintf(cmd, sizeof(cmd), "ip netns exec %s ss -it dst %s | grep -q bytes_sent:",
- NS_TEST, addr);
+ snprintf(cmd, sizeof(cmd), "ip netns exec %s ss -it src %s sport %d dst %s | %s",
+ NS_TEST, ADDR_1, PORT_1, addr, "grep -q bytes_sent:");
return system(cmd);
}
@@ -335,7 +336,7 @@ static void test_default(void)
nstoken = sched_init("subflow", "default");
if (!ASSERT_OK_PTR(nstoken, "sched_init:default"))
goto fail;
- server_fd = start_mptcp_server(AF_INET, ADDR_1, 0, 0);
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
client_fd = connect_to_fd(server_fd, 0);
send_data(server_fd, client_fd, "default");
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 03/13] Squash to "selftests/bpf: Add bpf_first test"
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 01/13] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 02/13] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 04/13] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
` (11 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Start server with PORT_1.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/prog_tests/mptcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index f648e5d49f12..f09aafdff43c 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -369,7 +369,7 @@ static void test_first(void)
nstoken = sched_init("subflow", "bpf_first");
if (!ASSERT_OK_PTR(nstoken, "sched_init:bpf_first"))
goto fail;
- server_fd = start_mptcp_server(AF_INET, ADDR_1, 0, 0);
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
client_fd = connect_to_fd(server_fd, 0);
send_data(server_fd, client_fd, "bpf_first");
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 04/13] Squash to "selftests/bpf: Add bpf_bkup scheduler"
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (2 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 03/13] Squash to "selftests/bpf: Add bpf_first test" Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 05/13] Squash to "selftests/bpf: Add bpf_bkup test" Geliang Tang
` (10 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Init nr to -1.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
index e5ba97390e17..21493a3affdb 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
@@ -25,7 +25,7 @@ void BPF_STRUCT_OPS(bpf_bkup_data_init, struct mptcp_sock *msk,
int BPF_STRUCT_OPS(bpf_bkup_get_subflow, struct mptcp_sock *msk,
const struct mptcp_sched_data *data)
{
- int nr = 0;
+ int nr = -1;
for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
struct mptcp_subflow_context *subflow;
@@ -40,7 +40,8 @@ int BPF_STRUCT_OPS(bpf_bkup_get_subflow, struct mptcp_sock *msk,
}
}
- mptcp_subflow_set_scheduled(mptcp_subflow_ctx_by_pos(data, nr), true);
+ if (nr != -1)
+ mptcp_subflow_set_scheduled(mptcp_subflow_ctx_by_pos(data, nr), true);
return 0;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 05/13] Squash to "selftests/bpf: Add bpf_bkup test"
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (3 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 04/13] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 06/13] Squash to "selftests/bpf: Add bpf_rr test" Geliang Tang
` (9 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Start server with PORT_1.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/prog_tests/mptcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index f09aafdff43c..f5443c3d2d97 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -404,7 +404,7 @@ static void test_bkup(void)
nstoken = sched_init("subflow backup", "bpf_bkup");
if (!ASSERT_OK_PTR(nstoken, "sched_init:bpf_bkup"))
goto fail;
- server_fd = start_mptcp_server(AF_INET, ADDR_1, 0, 0);
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
client_fd = connect_to_fd(server_fd, 0);
send_data(server_fd, client_fd, "bpf_bkup");
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 06/13] Squash to "selftests/bpf: Add bpf_rr test"
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (4 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 05/13] Squash to "selftests/bpf: Add bpf_bkup test" Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 07/13] Squash to "selftests/bpf: Add bpf_red test" Geliang Tang
` (8 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Start server with PORT_1.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/prog_tests/mptcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index f5443c3d2d97..5e2f6504cc68 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -439,7 +439,7 @@ static void test_rr(void)
nstoken = sched_init("subflow", "bpf_rr");
if (!ASSERT_OK_PTR(nstoken, "sched_init:bpf_rr"))
goto fail;
- server_fd = start_mptcp_server(AF_INET, ADDR_1, 0, 0);
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
client_fd = connect_to_fd(server_fd, 0);
send_data(server_fd, client_fd, "bpf_rr");
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 07/13] Squash to "selftests/bpf: Add bpf_red test"
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (5 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 06/13] Squash to "selftests/bpf: Add bpf_rr test" Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper Geliang Tang
` (7 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Start server with PORT_1.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/prog_tests/mptcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 5e2f6504cc68..30fcc82b10ed 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -474,7 +474,7 @@ static void test_red(void)
nstoken = sched_init("subflow", "bpf_red");
if (!ASSERT_OK_PTR(nstoken, "sched_init:bpf_red"))
goto fail;
- server_fd = start_mptcp_server(AF_INET, ADDR_1, 0, 0);
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
client_fd = connect_to_fd(server_fd, 0);
send_data(server_fd, client_fd, "bpf_red");
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (6 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 07/13] Squash to "selftests/bpf: Add bpf_red test" Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-28 1:30 ` Mat Martineau
2023-07-18 3:36 ` [PATCH mptcp-next v2 09/13] selftests/bpf: Add bpf_stale scheduler Geliang Tang
` (6 subsequent siblings)
14 siblings, 1 reply; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Add mptcp_subflow_set_stale() helper.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/bpf.c | 1 +
net/mptcp/protocol.h | 2 ++
net/mptcp/sched.c | 6 ++++++
3 files changed, 9 insertions(+)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index f388baf08d49..e6f94d5e22fb 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -146,6 +146,7 @@ struct bpf_struct_ops bpf_mptcp_sched_ops = {
BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
+BTF_ID_FLAGS(func, mptcp_subflow_set_stale)
BTF_ID_FLAGS(func, mptcp_sched_data_set_contexts)
BTF_ID_FLAGS(func, mptcp_subflow_ctx_by_pos)
BTF_SET8_END(bpf_mptcp_sched_kfunc_ids)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 1b4457c44fe8..78b3beeb7d7a 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -662,6 +662,8 @@ int mptcp_init_sched(struct mptcp_sock *msk,
void mptcp_release_sched(struct mptcp_sock *msk);
void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
bool scheduled);
+void mptcp_subflow_set_stale(struct mptcp_subflow_context *subflow,
+ int stale);
void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
struct mptcp_sched_data *data);
struct mptcp_subflow_context *
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index a80cf0481edf..3f361e75e38c 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -127,6 +127,12 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
WRITE_ONCE(subflow->scheduled, scheduled);
}
+void mptcp_subflow_set_stale(struct mptcp_subflow_context *subflow,
+ int stale)
+{
+ subflow->stale = stale;
+}
+
void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
struct mptcp_sched_data *data)
{
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 09/13] selftests/bpf: Add bpf_stale scheduler
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (7 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 10/13] selftests/bpf: Add bpf_stale test Geliang Tang
` (5 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch implements the setting of stale flag in BPF MPTCP scheduler,
named bpf_stale. The stale flag will be set in bpf_stale_data_init() and
will be checked in bpf_stale_get_subflow().
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/bpf_tcp_helpers.h | 3 +-
.../selftests/bpf/progs/mptcp_bpf_stale.c | 63 +++++++++++++++++++
2 files changed, 65 insertions(+), 1 deletion(-)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_stale.c
diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index 945dd46c98c0..c749940c9103 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -234,7 +234,8 @@ extern void tcp_cong_avoid_ai(struct tcp_sock *tp, __u32 w, __u32 acked) __ksym;
#define MPTCP_SUBFLOWS_MAX 8
struct mptcp_subflow_context {
- __u32 backup : 1;
+ __u32 backup : 1,
+ stale : 1;
struct sock *tcp_sock; /* tcp sk backpointer */
} __attribute__((preserve_access_index));
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_stale.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_stale.c
new file mode 100644
index 000000000000..e8cc2e0c24b9
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_stale.c
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2023, SUSE. */
+
+#include <linux/bpf.h>
+#include "bpf_tcp_helpers.h"
+
+char _license[] SEC("license") = "GPL";
+
+extern void mptcp_subflow_set_stale(struct mptcp_subflow_context *subflow,
+ int stale) __ksym;
+
+SEC("struct_ops/mptcp_sched_stale_init")
+void BPF_PROG(mptcp_sched_stale_init, struct mptcp_sock *msk)
+{
+}
+
+SEC("struct_ops/mptcp_sched_stale_release")
+void BPF_PROG(mptcp_sched_stale_release, struct mptcp_sock *msk)
+{
+}
+
+void BPF_STRUCT_OPS(bpf_stale_data_init, struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
+{
+ struct mptcp_subflow_context *subflow;
+
+ mptcp_sched_data_set_contexts(msk, data);
+ subflow = mptcp_subflow_ctx_by_pos(data, 1);
+ if (subflow)
+ mptcp_subflow_set_stale(subflow, 1);
+}
+
+int BPF_STRUCT_OPS(bpf_stale_get_subflow, struct mptcp_sock *msk,
+ const 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 = mptcp_subflow_ctx_by_pos(data, i);
+ if (!subflow)
+ break;
+
+ if (BPF_CORE_READ_BITFIELD_PROBED(subflow, stale))
+ continue;
+
+ nr = i;
+ }
+
+ if (nr != -1)
+ mptcp_subflow_set_scheduled(mptcp_subflow_ctx_by_pos(data, nr), true);
+ return 0;
+}
+
+SEC(".struct_ops")
+struct mptcp_sched_ops stale = {
+ .init = (void *)mptcp_sched_stale_init,
+ .release = (void *)mptcp_sched_stale_release,
+ .data_init = (void *)bpf_stale_data_init,
+ .get_subflow = (void *)bpf_stale_get_subflow,
+ .name = "bpf_stale",
+};
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 10/13] selftests/bpf: Add bpf_stale test
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (8 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 09/13] selftests/bpf: Add bpf_stale scheduler Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 11/13] bpf: Export more bpf_burst related functions Geliang Tang
` (4 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the bpf_stale scheduler test: test_stale(). Use sysctl to
set net.mptcp.scheduler to use this sched. Add two veth net devices to
simulate the multiple addresses case. Use 'ip mptcp endpoint' command to
add the new endpoint ADDR_2 to PM netlink. Send data and check bytes_sent
of 'ss' output after it to make sure the data has been only sent on ADDR_1
since ADDR_2 is set as stale.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/bpf/prog_tests/mptcp.c | 38 +++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 30fcc82b10ed..c6aa34f3a0d7 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -11,6 +11,7 @@
#include "mptcp_bpf_bkup.skel.h"
#include "mptcp_bpf_rr.skel.h"
#include "mptcp_bpf_red.skel.h"
+#include "mptcp_bpf_stale.skel.h"
char NS_TEST[32];
@@ -489,6 +490,41 @@ static void test_red(void)
mptcp_bpf_red__destroy(red_skel);
}
+static void test_stale(void)
+{
+ struct mptcp_bpf_stale *stale_skel;
+ int server_fd, client_fd;
+ struct nstoken *nstoken;
+ struct bpf_link *link;
+
+ stale_skel = mptcp_bpf_stale__open_and_load();
+ if (!ASSERT_OK_PTR(stale_skel, "bpf_stale__open_and_load"))
+ return;
+
+ link = bpf_map__attach_struct_ops(stale_skel->maps.stale);
+ if (!ASSERT_OK_PTR(link, "bpf_map__attach_struct_ops")) {
+ mptcp_bpf_stale__destroy(stale_skel);
+ return;
+ }
+
+ nstoken = sched_init("subflow", "bpf_stale");
+ if (!ASSERT_OK_PTR(nstoken, "sched_init:bpf_stale"))
+ goto fail;
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
+ client_fd = connect_to_fd(server_fd, 0);
+
+ send_data(server_fd, client_fd, "bpf_stale");
+ ASSERT_OK(has_bytes_sent(ADDR_1), "has_bytes_sent addr_1");
+ ASSERT_GT(has_bytes_sent(ADDR_2), 0, "has_bytes_sent addr_2");
+
+ close(client_fd);
+ close(server_fd);
+fail:
+ cleanup_netns(nstoken);
+ bpf_link__destroy(link);
+ mptcp_bpf_stale__destroy(stale_skel);
+}
+
void test_mptcp(void)
{
if (test__start_subtest("base"))
@@ -503,4 +539,6 @@ void test_mptcp(void)
test_rr();
if (test__start_subtest("red"))
test_red();
+ if (test__start_subtest("stale"))
+ test_stale();
}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 11/13] bpf: Export more bpf_burst related functions
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (9 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 10/13] selftests/bpf: Add bpf_stale test Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-28 1:33 ` Mat Martineau
2023-07-18 3:36 ` [PATCH mptcp-next v2 12/13] selftests/bpf: Add bpf_burst scheduler Geliang Tang
` (3 subsequent siblings)
14 siblings, 1 reply; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
sk_stream_memory_free() and tcp_rtx_and_write_queues_empty() are needed
to export into the BPF context for bpf_burst scheduler. But these two
functions are inline ones. So this patch added two wrappers for them,
and export the wrappers in the BPF context.
Add more bpf_burst related functions into bpf_mptcp_sched_kfunc_set to make
sure these helpers can be accessed from the BPF context.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/bpf.c | 16 ++++++++++++++++
net/mptcp/protocol.c | 4 ++--
net/mptcp/protocol.h | 4 ++++
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index e6f94d5e22fb..12b747813dee 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -144,11 +144,27 @@ struct bpf_struct_ops bpf_mptcp_sched_ops = {
.name = "mptcp_sched_ops",
};
+bool bpf_mptcp_subflow_memory_free(const struct sock *sk)
+{
+ return sk_stream_memory_free(sk);
+}
+
+bool bpf_mptcp_subflow_queues_empty(const struct sock *sk)
+{
+ return tcp_rtx_and_write_queues_empty(sk);
+}
+
BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
BTF_ID_FLAGS(func, mptcp_subflow_set_stale)
BTF_ID_FLAGS(func, mptcp_sched_data_set_contexts)
BTF_ID_FLAGS(func, 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, bpf_mptcp_subflow_memory_free)
+BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty)
+BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale)
BTF_SET8_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 9f00a0288a0a..b4218108f17f 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);
}
@@ -494,7 +494,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 78b3beeb7d7a..cabda60f5f76 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -635,6 +635,10 @@ 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_memory_free(const struct sock *sk);
+bool bpf_mptcp_subflow_queues_empty(const 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.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 12/13] selftests/bpf: Add bpf_burst scheduler
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (10 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 11/13] bpf: Export more bpf_burst related functions Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 13/13] selftests/bpf: Add bpf_burst test Geliang Tang
` (2 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch implements the burst BPF MPTCP scheduler, named bpf_burst,
which is the default scheduler in protocol.c. bpf_burst_get_send() uses
the same logic as mptcp_subflow_get_send() and bpf_burst_get_retrans
uses the same logic as mptcp_subflow_get_retrans().
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/bpf_tcp_helpers.h | 4 +
.../selftests/bpf/progs/mptcp_bpf_burst.c | 197 ++++++++++++++++++
2 files changed, 201 insertions(+)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index c749940c9103..c1d7963c3bc8 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -36,6 +36,7 @@ enum sk_pacing {
struct sock {
struct sock_common __sk_common;
#define sk_state __sk_common.skc_state
+ int sk_wmem_queued;
unsigned long sk_pacing_rate;
__u32 sk_pacing_status; /* see enum sk_pacing */
} __attribute__((preserve_access_index));
@@ -234,8 +235,10 @@ extern void tcp_cong_avoid_ai(struct tcp_sock *tp, __u32 w, __u32 acked) __ksym;
#define MPTCP_SUBFLOWS_MAX 8
struct mptcp_subflow_context {
+ unsigned long avg_pacing_rate;
__u32 backup : 1,
stale : 1;
+ __u8 stale_count;
struct sock *tcp_sock; /* tcp sk backpointer */
} __attribute__((preserve_access_index));
@@ -260,6 +263,7 @@ struct mptcp_sched_ops {
struct mptcp_sock {
struct inet_connection_sock sk;
+ __u64 snd_nxt;
__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
new file mode 100644
index 000000000000..7af21d03277d
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
@@ -0,0 +1,197 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2023, SUSE. */
+
+#include <linux/bpf.h>
+#include <limits.h>
+#include "bpf_tcp_helpers.h"
+
+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 {
+ __u8 subflow_id;
+ __u64 linger_time;
+};
+
+static inline __u64 div_u64(__u64 dividend, __u32 divisor)
+{
+ return dividend / divisor;
+}
+
+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 bpf_mptcp_subflow_memory_free(const struct sock *sk) __ksym;
+extern bool bpf_mptcp_subflow_queues_empty(const 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
+
+SEC("struct_ops/mptcp_sched_burst_init")
+void BPF_PROG(mptcp_sched_burst_init, struct mptcp_sock *msk)
+{
+}
+
+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);
+}
+
+void BPF_STRUCT_OPS(bpf_burst_data_init, struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
+{
+ mptcp_sched_data_set_contexts(msk, data);
+}
+
+static int bpf_burst_get_send(struct mptcp_sock *msk,
+ const struct mptcp_sched_data *data)
+{
+ 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;
+ int i;
+
+ /* 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].linger_time = -1;
+ }
+
+ for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
+ subflow = mptcp_subflow_ctx_by_pos(data, i);
+ if (!subflow)
+ break;
+
+ ssk = mptcp_subflow_tcp_sock(subflow);
+ if (!mptcp_subflow_active(subflow))
+ continue;
+
+ pace = subflow->avg_pacing_rate;
+ if (!pace) {
+ /* init pacing rate from socket */
+ subflow->avg_pacing_rate = ssk->sk_pacing_rate;
+ pace = subflow->avg_pacing_rate;
+ if (!pace)
+ continue;
+ }
+
+ linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace);
+ if (linger_time < send_info[subflow->backup].linger_time) {
+ send_info[subflow->backup].subflow_id = i;
+ send_info[subflow->backup].linger_time = linger_time;
+ }
+ }
+ mptcp_set_timeout(sk);
+
+ /* pick the best backup if no other subflow is active */
+ 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);
+ if (!subflow)
+ return -1;
+ ssk = mptcp_subflow_tcp_sock(subflow);
+ if (!ssk || !bpf_mptcp_subflow_memory_free(ssk))
+ return -1;
+
+ burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt);
+ wmem = ssk->sk_wmem_queued;
+ if (!burst)
+ goto out;
+
+ 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;
+
+out:
+ mptcp_subflow_set_scheduled(subflow, true);
+ return 0;
+}
+
+static int bpf_burst_get_retrans(struct mptcp_sock *msk,
+ const struct mptcp_sched_data *data)
+{
+ int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id;
+ 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 = mptcp_subflow_ctx_by_pos(data, i);
+ if (!subflow)
+ break;
+
+ if (!mptcp_subflow_active(subflow))
+ continue;
+
+ ssk = mptcp_subflow_tcp_sock(subflow);
+ /* still data outstanding at TCP level? skip this */
+ if (!bpf_mptcp_subflow_queues_empty(ssk)) {
+ mptcp_pm_subflow_chk_stale(msk, ssk);
+ min_stale_count = min(min_stale_count, subflow->stale_count);
+ continue;
+ }
+
+ if (subflow->backup) {
+ if (backup == MPTCP_SUBFLOWS_MAX)
+ backup = i;
+ continue;
+ }
+
+ if (pick == MPTCP_SUBFLOWS_MAX)
+ pick = i;
+ }
+
+ if (pick < MPTCP_SUBFLOWS_MAX) {
+ subflow_id = pick;
+ goto out;
+ }
+ subflow_id = min_stale_count > 1 ? backup : MPTCP_SUBFLOWS_MAX;
+
+out:
+ subflow = mptcp_subflow_ctx_by_pos(data, subflow_id);
+ if (!subflow)
+ return -1;
+ mptcp_subflow_set_scheduled(subflow, true);
+ return 0;
+}
+
+int BPF_STRUCT_OPS(bpf_burst_get_subflow, struct mptcp_sock *msk,
+ const struct mptcp_sched_data *data)
+{
+ if (data->reinject)
+ return bpf_burst_get_retrans(msk, data);
+ return bpf_burst_get_send(msk, data);
+}
+
+SEC(".struct_ops")
+struct mptcp_sched_ops burst = {
+ .init = (void *)mptcp_sched_burst_init,
+ .release = (void *)mptcp_sched_burst_release,
+ .data_init = (void *)bpf_burst_data_init,
+ .get_subflow = (void *)bpf_burst_get_subflow,
+ .name = "bpf_burst",
+};
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v2 13/13] selftests/bpf: Add bpf_burst test
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (11 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 12/13] selftests/bpf: Add bpf_burst scheduler Geliang Tang
@ 2023-07-18 3:36 ` Geliang Tang
2023-07-18 5:01 ` selftests/bpf: Add bpf_burst test: Tests Results MPTCP CI
2023-07-28 2:56 ` MPTCP CI
2023-07-28 0:53 ` [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Mat Martineau
2023-07-28 16:02 ` Matthieu Baerts
14 siblings, 2 replies; 22+ messages in thread
From: Geliang Tang @ 2023-07-18 3:36 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the burst BPF MPTCP scheduler test: test_burst(). Use
sysctl to set net.mptcp.scheduler to use this sched. Add two veth net
devices to simulate the multiple addresses case. Use 'ip mptcp endpoint'
command to add the new endpoint ADDR_2 to PM netlink. Send data and check
bytes_sent of 'ss' output after it to make sure the data has been sent
on both net devices.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../testing/selftests/bpf/prog_tests/mptcp.c | 38 +++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index c6aa34f3a0d7..1be15973880e 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -12,6 +12,7 @@
#include "mptcp_bpf_rr.skel.h"
#include "mptcp_bpf_red.skel.h"
#include "mptcp_bpf_stale.skel.h"
+#include "mptcp_bpf_burst.skel.h"
char NS_TEST[32];
@@ -525,6 +526,41 @@ static void test_stale(void)
mptcp_bpf_stale__destroy(stale_skel);
}
+static void test_burst(void)
+{
+ struct mptcp_bpf_burst *burst_skel;
+ int server_fd, client_fd;
+ struct nstoken *nstoken;
+ struct bpf_link *link;
+
+ burst_skel = mptcp_bpf_burst__open_and_load();
+ if (!ASSERT_OK_PTR(burst_skel, "bpf_burst__open_and_load"))
+ return;
+
+ link = bpf_map__attach_struct_ops(burst_skel->maps.burst);
+ if (!ASSERT_OK_PTR(link, "bpf_map__attach_struct_ops")) {
+ mptcp_bpf_burst__destroy(burst_skel);
+ return;
+ }
+
+ nstoken = sched_init("subflow", "bpf_burst");
+ if (!ASSERT_OK_PTR(nstoken, "sched_init:bpf_burst"))
+ goto fail;
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
+ client_fd = connect_to_fd(server_fd, 0);
+
+ send_data(server_fd, client_fd, "bpf_burst");
+ ASSERT_OK(has_bytes_sent(ADDR_1), "has_bytes_sent addr 1");
+ ASSERT_OK(has_bytes_sent(ADDR_2), "has_bytes_sent addr 2");
+
+ close(client_fd);
+ close(server_fd);
+fail:
+ cleanup_netns(nstoken);
+ bpf_link__destroy(link);
+ mptcp_bpf_burst__destroy(burst_skel);
+}
+
void test_mptcp(void)
{
if (test__start_subtest("base"))
@@ -541,4 +577,6 @@ void test_mptcp(void)
test_red();
if (test__start_subtest("stale"))
test_stale();
+ if (test__start_subtest("burst"))
+ test_burst();
}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: selftests/bpf: Add bpf_burst test: Tests Results
2023-07-18 3:36 ` [PATCH mptcp-next v2 13/13] selftests/bpf: Add bpf_burst test Geliang Tang
@ 2023-07-18 5:01 ` MPTCP CI
2023-07-28 2:56 ` MPTCP CI
1 sibling, 0 replies; 22+ messages in thread
From: MPTCP CI @ 2023-07-18 5:01 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 (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6584199117799424
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6584199117799424/summary/summary.txt
- KVM Validation: debug (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/4843437464223744
- Summary: https://api.cirrus-ci.com/v1/artifact/task/4843437464223744/summary/summary.txt
- KVM Validation: debug (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/5494449095049216
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5494449095049216/summary/summary.txt
- KVM Validation: normal (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6134261296660480
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6134261296660480/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/64a0c9c1b0b4
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-debug
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 (Tessares)
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (12 preceding siblings ...)
2023-07-18 3:36 ` [PATCH mptcp-next v2 13/13] selftests/bpf: Add bpf_burst test Geliang Tang
@ 2023-07-28 0:53 ` Mat Martineau
2023-07-28 16:02 ` Matthieu Baerts
14 siblings, 0 replies; 22+ messages in thread
From: Mat Martineau @ 2023-07-28 0:53 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Tue, 18 Jul 2023, Geliang Tang wrote:
> v2:
> - Init nr to -1 for bpf_bkup and bpf_stale.
> - Update has_bytes_sent() to make sure only one item showed in 'ss -it',
> this needs to start server with PORT_1.
> - Rename to bpf_mptcp_subflow_memory_free() and
> bpf_mptcp_subflow_queues_empty().
> - Simplify div_u64().
> - Move mptcp_subflow_set_stale() to kernel space. stale is a bit filed,
> I haven't found a way to set a bit filed in BPF context yet, so set it
> in kernel space.
> - Sync with new bpf_tcp_ca.c.
>
> Geliang Tang (13):
Thanks for the patches Geliang.
I think the first 7 patches are ok to squash on the export branch:
> Squash to "bpf: Add bpf_mptcp_sched_ops"
> Squash to "selftests/bpf: Add bpf scheduler test"
> Squash to "selftests/bpf: Add bpf_first test"
> Squash to "selftests/bpf: Add bpf_bkup scheduler"
> Squash to "selftests/bpf: Add bpf_bkup test"
> Squash to "selftests/bpf: Add bpf_rr test"
> Squash to "selftests/bpf: Add bpf_red test"
I have questions for a few of the remaining patches, I will reply
separately to those.
- Mat
> mptcp: add subflow_set_stale helper
> selftests/bpf: Add bpf_stale scheduler
> selftests/bpf: Add bpf_stale test
> bpf: Export more bpf_burst related functions
> selftests/bpf: Add bpf_burst scheduler
> selftests/bpf: Add bpf_burst test
>
> net/mptcp/bpf.c | 44 ++--
> net/mptcp/protocol.c | 4 +-
> net/mptcp/protocol.h | 6 +
> net/mptcp/sched.c | 6 +
> tools/testing/selftests/bpf/bpf_tcp_helpers.h | 7 +-
> .../testing/selftests/bpf/prog_tests/mptcp.c | 91 +++++++-
> .../selftests/bpf/progs/mptcp_bpf_bkup.c | 5 +-
> .../selftests/bpf/progs/mptcp_bpf_burst.c | 197 ++++++++++++++++++
> .../selftests/bpf/progs/mptcp_bpf_stale.c | 63 ++++++
> 9 files changed, 384 insertions(+), 39 deletions(-)
> create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
> create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_stale.c
>
> --
> 2.35.3
>
>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper
2023-07-18 3:36 ` [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper Geliang Tang
@ 2023-07-28 1:30 ` Mat Martineau
2023-07-28 15:55 ` Matthieu Baerts
0 siblings, 1 reply; 22+ messages in thread
From: Mat Martineau @ 2023-07-28 1:30 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Tue, 18 Jul 2023, Geliang Tang wrote:
> Add mptcp_subflow_set_stale() helper.
>
I was trying to remember the use case for this. The closest thing I can
find is this:
=> the scheduler should be able to interact with the "stale" logic
we have in the upstream kernel: mark a subflow as stale / back
active.
from
https://lore.kernel.org/mptcp/dd4363e7-d057-97e8-0b5f-8570f39aa538@tessares.net/
I think that need is met by the change in patch 11 to export
mptcp_pm_subflow_chk_stale - if a particular scheduler wants to track some
stale-like metric, it can do so with its own sk_storage values. There's
also the matter of coordinating the values of stale_count and
stale_rcv_tstamp.
My suggestion is to drop patches 8, 9, and 10 unless there's a compelling
reason to allow a BPF scheduler to control this bit. If there's a need for
it please speak up!
- Mat
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> net/mptcp/bpf.c | 1 +
> net/mptcp/protocol.h | 2 ++
> net/mptcp/sched.c | 6 ++++++
> 3 files changed, 9 insertions(+)
>
> diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
> index f388baf08d49..e6f94d5e22fb 100644
> --- a/net/mptcp/bpf.c
> +++ b/net/mptcp/bpf.c
> @@ -146,6 +146,7 @@ struct bpf_struct_ops bpf_mptcp_sched_ops = {
>
> BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
> BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
> +BTF_ID_FLAGS(func, mptcp_subflow_set_stale)
> BTF_ID_FLAGS(func, mptcp_sched_data_set_contexts)
> BTF_ID_FLAGS(func, mptcp_subflow_ctx_by_pos)
> BTF_SET8_END(bpf_mptcp_sched_kfunc_ids)
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 1b4457c44fe8..78b3beeb7d7a 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -662,6 +662,8 @@ int mptcp_init_sched(struct mptcp_sock *msk,
> void mptcp_release_sched(struct mptcp_sock *msk);
> void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
> bool scheduled);
> +void mptcp_subflow_set_stale(struct mptcp_subflow_context *subflow,
> + int stale);
> void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
> struct mptcp_sched_data *data);
> struct mptcp_subflow_context *
> diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
> index a80cf0481edf..3f361e75e38c 100644
> --- a/net/mptcp/sched.c
> +++ b/net/mptcp/sched.c
> @@ -127,6 +127,12 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
> WRITE_ONCE(subflow->scheduled, scheduled);
> }
>
> +void mptcp_subflow_set_stale(struct mptcp_subflow_context *subflow,
> + int stale)
> +{
> + subflow->stale = stale;
> +}
> +
> void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
> struct mptcp_sched_data *data)
> {
> --
> 2.35.3
>
>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v2 11/13] bpf: Export more bpf_burst related functions
2023-07-18 3:36 ` [PATCH mptcp-next v2 11/13] bpf: Export more bpf_burst related functions Geliang Tang
@ 2023-07-28 1:33 ` Mat Martineau
0 siblings, 0 replies; 22+ messages in thread
From: Mat Martineau @ 2023-07-28 1:33 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Tue, 18 Jul 2023, Geliang Tang wrote:
> sk_stream_memory_free() and tcp_rtx_and_write_queues_empty() are needed
> to export into the BPF context for bpf_burst scheduler. But these two
> functions are inline ones. So this patch added two wrappers for them,
> and export the wrappers in the BPF context.
>
> Add more bpf_burst related functions into bpf_mptcp_sched_kfunc_set to make
> sure these helpers can be accessed from the BPF context.
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> net/mptcp/bpf.c | 16 ++++++++++++++++
> net/mptcp/protocol.c | 4 ++--
> net/mptcp/protocol.h | 4 ++++
> 3 files changed, 22 insertions(+), 2 deletions(-)
>
Patches 11-13 look good to add to the "features other trees" section of
the export branch for further testing:
Reviewed-by: Mat Martineau <martineau@kernel.org>
> diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
> index e6f94d5e22fb..12b747813dee 100644
> --- a/net/mptcp/bpf.c
> +++ b/net/mptcp/bpf.c
> @@ -144,11 +144,27 @@ struct bpf_struct_ops bpf_mptcp_sched_ops = {
> .name = "mptcp_sched_ops",
> };
>
> +bool bpf_mptcp_subflow_memory_free(const struct sock *sk)
> +{
> + return sk_stream_memory_free(sk);
> +}
> +
> +bool bpf_mptcp_subflow_queues_empty(const struct sock *sk)
> +{
> + return tcp_rtx_and_write_queues_empty(sk);
> +}
> +
> BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
> BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
> BTF_ID_FLAGS(func, mptcp_subflow_set_stale)
> BTF_ID_FLAGS(func, mptcp_sched_data_set_contexts)
> BTF_ID_FLAGS(func, 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, bpf_mptcp_subflow_memory_free)
> +BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty)
> +BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale)
> BTF_SET8_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 9f00a0288a0a..b4218108f17f 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);
> }
> @@ -494,7 +494,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 78b3beeb7d7a..cabda60f5f76 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -635,6 +635,10 @@ 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_memory_free(const struct sock *sk);
> +bool bpf_mptcp_subflow_queues_empty(const 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.35.3
>
>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: selftests/bpf: Add bpf_burst test: Tests Results
2023-07-18 3:36 ` [PATCH mptcp-next v2 13/13] selftests/bpf: Add bpf_burst test Geliang Tang
2023-07-18 5:01 ` selftests/bpf: Add bpf_burst test: Tests Results MPTCP CI
@ 2023-07-28 2:56 ` MPTCP CI
1 sibling, 0 replies; 22+ messages in thread
From: MPTCP CI @ 2023-07-28 2:56 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 (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/5024200105132032
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5024200105132032/summary/summary.txt
- KVM Validation: normal (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/5619233783021568
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5619233783021568/summary/summary.txt
- KVM Validation: debug (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6713049965395968
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6713049965395968/summary/summary.txt
- KVM Validation: debug (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/5587150058553344
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5587150058553344/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/8163a099bd40
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-debug
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 (Tessares)
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper
2023-07-28 1:30 ` Mat Martineau
@ 2023-07-28 15:55 ` Matthieu Baerts
2023-07-28 18:23 ` Mat Martineau
0 siblings, 1 reply; 22+ messages in thread
From: Matthieu Baerts @ 2023-07-28 15:55 UTC (permalink / raw)
To: Mat Martineau, Geliang Tang; +Cc: mptcp
Hi Mat,
On 28/07/2023 03:30, Mat Martineau wrote:
> On Tue, 18 Jul 2023, Geliang Tang wrote:
>
>> Add mptcp_subflow_set_stale() helper.
>>
>
> I was trying to remember the use case for this. The closest thing I can
> find is this:
>
> => the scheduler should be able to interact with the "stale" logic
> we have in the upstream kernel: mark a subflow as stale / back
> active.
>
> from
> https://lore.kernel.org/mptcp/dd4363e7-d057-97e8-0b5f-8570f39aa538@tessares.net/
>
> I think that need is met by the change in patch 11 to export
> mptcp_pm_subflow_chk_stale - if a particular scheduler wants to track
> some stale-like metric, it can do so with its own sk_storage values.
> There's also the matter of coordinating the values of stale_count and
> stale_rcv_tstamp.
>
> My suggestion is to drop patches 8, 9, and 10 unless there's a
> compelling reason to allow a BPF scheduler to control this bit. If
> there's a need for it please speak up!
If I'm not mistaken, the 'stale' logic is currently used by the core not
to use a subflow (when calling mptcp_subflow_active()). A packet
scheduler might want to proactively mark a subflow as stall, e.g. if the
latency is too high, too many retransmissions, etc. and just set the
subflow as stale.
But maybe we cannot do that because the core will reset stale in some
conditions? Maybe we need something similar but not reusing "stale"?
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
` (13 preceding siblings ...)
2023-07-28 0:53 ` [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Mat Martineau
@ 2023-07-28 16:02 ` Matthieu Baerts
14 siblings, 0 replies; 22+ messages in thread
From: Matthieu Baerts @ 2023-07-28 16:02 UTC (permalink / raw)
To: Geliang Tang, Mat Martineau; +Cc: mptcp
Hi Geliang, Mat,
On 18/07/2023 05:36, Geliang Tang wrote:
> v2:
> - Init nr to -1 for bpf_bkup and bpf_stale.
> - Update has_bytes_sent() to make sure only one item showed in 'ss -it',
> this needs to start server with PORT_1.
> - Rename to bpf_mptcp_subflow_memory_free() and
> bpf_mptcp_subflow_queues_empty().
> - Simplify div_u64().
> - Move mptcp_subflow_set_stale() to kernel space. stale is a bit filed,
> I haven't found a way to set a bit filed in BPF context yet, so set it
> in kernel space.
> - Sync with new bpf_tcp_ca.c.
>
> Geliang Tang (13):
> Squash to "bpf: Add bpf_mptcp_sched_ops"
> Squash to "selftests/bpf: Add bpf scheduler test"
> Squash to "selftests/bpf: Add bpf_first test"
> Squash to "selftests/bpf: Add bpf_bkup scheduler"
> Squash to "selftests/bpf: Add bpf_bkup test"
> Squash to "selftests/bpf: Add bpf_rr test"
> Squash to "selftests/bpf: Add bpf_red test"
> mptcp: add subflow_set_stale helper
> selftests/bpf: Add bpf_stale scheduler
> selftests/bpf: Add bpf_stale test
> bpf: Export more bpf_burst related functions
> selftests/bpf: Add bpf_burst scheduler
> selftests/bpf: Add bpf_burst test
Thank you for the patches and the reviews!
Just applied in our tree (feat. for other trees) with Mat's RvB tag on
patch 11-13:
New patches for t/upstream:
- 53ac64c3872b: "squashed" patch 1/13 in "bpf: Add bpf_mptcp_sched_ops"
- 0ab66f43ec70: "squashed" patch 2/13 in "selftests/bpf: Add bpf
scheduler test"
- 2fc5650638c1: "squashed" patch 3/13 in "selftests/bpf: Add bpf_first test"
- e98afc8e2110: "squashed" patch 4/13 in "selftests/bpf: Add bpf_bkup
scheduler"
- 0a920c696b80: "squashed" patch 5/13 in "selftests/bpf: Add bpf_bkup test"
- ca0924acae70: "squashed" patch 6/13 in "selftests/bpf: Add bpf_rr test"
- 4dfce80db661: "squashed" patch 7/13 in "selftests/bpf: Add bpf_red test"
- Results: b5ba626e6a54..59eafd2d73d8 (export)
- fd91a6aba636: bpf: Export more bpf_burst related functions
- ba9ff2266f7b: selftests/bpf: Add bpf_burst scheduler
- 558ed1c12d57: selftests/bpf: Add bpf_burst test
- Results: 59eafd2d73d8..e77fd85b3873 (export)
Tests are now in progress:
https://cirrus-ci.com/github/multipath-tcp/mptcp_net-next/export/20230728T160116
Cheers,
Matt
--
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper
2023-07-28 15:55 ` Matthieu Baerts
@ 2023-07-28 18:23 ` Mat Martineau
0 siblings, 0 replies; 22+ messages in thread
From: Mat Martineau @ 2023-07-28 18:23 UTC (permalink / raw)
To: Matthieu Baerts; +Cc: Geliang Tang, mptcp
[-- Attachment #1: Type: text/plain, Size: 1769 bytes --]
On Fri, 28 Jul 2023, Matthieu Baerts wrote:
> Hi Mat,
>
> On 28/07/2023 03:30, Mat Martineau wrote:
>> On Tue, 18 Jul 2023, Geliang Tang wrote:
>>
>>> Add mptcp_subflow_set_stale() helper.
>>>
>>
>> I was trying to remember the use case for this. The closest thing I can
>> find is this:
>>
>> => the scheduler should be able to interact with the "stale" logic
>> we have in the upstream kernel: mark a subflow as stale / back
>> active.
>>
>> from
>> https://lore.kernel.org/mptcp/dd4363e7-d057-97e8-0b5f-8570f39aa538@tessares.net/
>>
>> I think that need is met by the change in patch 11 to export
>> mptcp_pm_subflow_chk_stale - if a particular scheduler wants to track
>> some stale-like metric, it can do so with its own sk_storage values.
>> There's also the matter of coordinating the values of stale_count and
>> stale_rcv_tstamp.
>>
>> My suggestion is to drop patches 8, 9, and 10 unless there's a
>> compelling reason to allow a BPF scheduler to control this bit. If
>> there's a need for it please speak up!
>
> If I'm not mistaken, the 'stale' logic is currently used by the core not
> to use a subflow (when calling mptcp_subflow_active()). A packet
> scheduler might want to proactively mark a subflow as stall, e.g. if the
> latency is too high, too many retransmissions, etc. and just set the
> subflow as stale.
>
> But maybe we cannot do that because the core will reset stale in some
> conditions? Maybe we need something similar but not reusing "stale"?
>
That's what I'm thinking, yes. Individual BPF schedulers could create
their own "skip this subflow if possible" variables in their custom
sk_storage structs, and those would not have the complex interactions with
stale_count and stale_rcv_tstamp.
- Mat
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2023-07-28 18:23 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-18 3:36 [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 01/13] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 02/13] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 03/13] Squash to "selftests/bpf: Add bpf_first test" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 04/13] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 05/13] Squash to "selftests/bpf: Add bpf_bkup test" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 06/13] Squash to "selftests/bpf: Add bpf_rr test" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 07/13] Squash to "selftests/bpf: Add bpf_red test" Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 08/13] mptcp: add subflow_set_stale helper Geliang Tang
2023-07-28 1:30 ` Mat Martineau
2023-07-28 15:55 ` Matthieu Baerts
2023-07-28 18:23 ` Mat Martineau
2023-07-18 3:36 ` [PATCH mptcp-next v2 09/13] selftests/bpf: Add bpf_stale scheduler Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 10/13] selftests/bpf: Add bpf_stale test Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 11/13] bpf: Export more bpf_burst related functions Geliang Tang
2023-07-28 1:33 ` Mat Martineau
2023-07-18 3:36 ` [PATCH mptcp-next v2 12/13] selftests/bpf: Add bpf_burst scheduler Geliang Tang
2023-07-18 3:36 ` [PATCH mptcp-next v2 13/13] selftests/bpf: Add bpf_burst test Geliang Tang
2023-07-18 5:01 ` selftests/bpf: Add bpf_burst test: Tests Results MPTCP CI
2023-07-28 2:56 ` MPTCP CI
2023-07-28 0:53 ` [PATCH mptcp-next v2 00/13] BPF packet scheduler updates part 2 Mat Martineau
2023-07-28 16:02 ` 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.