* [PATCH mptcp-next v2 0/5] BPF redundant scheduler
@ 2022-05-11 12:17 Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 1/5] Squash to "mptcp: add get_subflow wrappers" Geliang Tang
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Geliang Tang @ 2022-05-11 12:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
v2:
- add MPTCP_SUBFLOWS_MAX limit to avoid infinite loops when the
scheduler always sets call_again to true.
- track the largest copied amount.
- deal with __mptcp_subflow_push_pending() and the retransmit loop.
- depends on "BPF round-robin scheduler" v14.
v1:
Implements the redundant BPF MPTCP scheduler, which sends all packets
redundantly on all available subflows.
depends on:
- BPF round-robin scheduler, v13
Geliang Tang (5):
Squash to "mptcp: add get_subflow wrappers"
mptcp: add redundant subflows support
mptcp: add call_again flag in mptcp_sched_ops
selftests/bpf: add bpf_red scheduler
selftests/bpf: add bpf_red test
include/net/mptcp.h | 1 +
net/mptcp/protocol.c | 64 ++++++++++++++-----
net/mptcp/protocol.h | 4 +-
net/mptcp/sched.c | 11 +++-
.../testing/selftests/bpf/prog_tests/mptcp.c | 38 +++++++++++
.../selftests/bpf/progs/mptcp_bpf_red.c | 54 ++++++++++++++++
6 files changed, 151 insertions(+), 21 deletions(-)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH mptcp-next v2 1/5] Squash to "mptcp: add get_subflow wrappers"
2022-05-11 12:17 [PATCH mptcp-next v2 0/5] BPF redundant scheduler Geliang Tang
@ 2022-05-11 12:17 ` Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 2/5] mptcp: add redundant subflows support Geliang Tang
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2022-05-11 12:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Add call_again parameter for mptcp_sched_get_send() and
mptcp_sched_get_retrans().
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 13 +++++++++----
net/mptcp/protocol.h | 4 ++--
net/mptcp/sched.c | 10 ++++++++--
3 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index ea3c93322592..74dc832a9d9d 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1558,6 +1558,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
};
struct mptcp_data_frag *dfrag;
int len, copied = 0;
+ bool call_again;
while ((dfrag = mptcp_send_head(sk))) {
info.sent = dfrag->already_sent;
@@ -1567,7 +1568,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
int ret = 0;
prev_ssk = ssk;
- ssk = mptcp_sched_get_send(msk);
+ ssk = mptcp_sched_get_send(msk, &call_again);
/* First check. If the ssk has changed since
* the last round, release prev_ssk
@@ -1618,6 +1619,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
.data_lock_held = true,
};
struct mptcp_data_frag *dfrag;
+ bool call_again = false;
struct sock *xmit_ssk;
int len, copied = 0;
bool first = true;
@@ -1634,7 +1636,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
* check for a different subflow usage only after
* spooling the first chunk of data
*/
- xmit_ssk = first ? ssk : mptcp_sched_get_send(mptcp_sk(sk));
+ xmit_ssk = first ? ssk : mptcp_sched_get_send(mptcp_sk(sk), &call_again);
if (!xmit_ssk)
goto out;
if (xmit_ssk != ssk) {
@@ -2461,12 +2463,13 @@ static void __mptcp_retrans(struct sock *sk)
struct mptcp_data_frag *dfrag;
size_t copied = 0;
struct sock *ssk;
+ bool call_again;
int ret;
mptcp_clean_una_wakeup(sk);
/* first check ssk: need to kick "stale" logic */
- ssk = mptcp_sched_get_retrans(msk);
+ ssk = mptcp_sched_get_retrans(msk, &call_again);
dfrag = mptcp_rtx_head(sk);
if (!dfrag) {
if (mptcp_data_fin_enabled(msk)) {
@@ -3111,11 +3114,13 @@ void __mptcp_data_acked(struct sock *sk)
void __mptcp_check_push(struct sock *sk, struct sock *ssk)
{
+ bool call_again;
+
if (!mptcp_send_head(sk))
return;
if (!sock_owned_by_user(sk)) {
- struct sock *xmit_ssk = mptcp_sched_get_send(mptcp_sk(sk));
+ struct sock *xmit_ssk = mptcp_sched_get_send(mptcp_sk(sk), &call_again);
if (xmit_ssk == ssk)
__mptcp_subflow_push_pending(sk, ssk);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 59a23838782f..2fe0021a678e 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -631,8 +631,8 @@ int mptcp_init_sched(struct mptcp_sock *msk,
void mptcp_release_sched(struct mptcp_sock *msk);
struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk);
struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk);
-struct sock *mptcp_sched_get_send(struct mptcp_sock *msk);
-struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk);
+struct sock *mptcp_sched_get_send(struct mptcp_sock *msk, bool *call_again);
+struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk, bool *call_again);
static inline bool __mptcp_subflow_active(struct mptcp_subflow_context *subflow)
{
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index f86b97292044..0d5fc96a2ce0 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -112,12 +112,14 @@ static int mptcp_sched_data_init(struct mptcp_sock *msk,
return 0;
}
-struct sock *mptcp_sched_get_send(struct mptcp_sock *msk)
+struct sock *mptcp_sched_get_send(struct mptcp_sock *msk, bool *call_again)
{
struct mptcp_sched_data data;
sock_owned_by_me((struct sock *)msk);
+ *call_again = 0;
+
/* the following check is moved out of mptcp_subflow_get_send */
if (__mptcp_check_fallback(msk)) {
if (!msk->first)
@@ -132,15 +134,18 @@ struct sock *mptcp_sched_get_send(struct mptcp_sock *msk)
msk->sched->get_subflow(msk, false, &data);
msk->last_snd = data.sock;
+ *call_again = data.call_again;
return data.sock;
}
-struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk)
+struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk, bool *call_again)
{
struct mptcp_sched_data data;
sock_owned_by_me((const struct sock *)msk);
+ *call_again = 0;
+
/* the following check is moved out of mptcp_subflow_get_retrans */
if (__mptcp_check_fallback(msk))
return NULL;
@@ -152,5 +157,6 @@ struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk)
msk->sched->get_subflow(msk, true, &data);
msk->last_snd = data.sock;
+ *call_again = data.call_again;
return data.sock;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH mptcp-next v2 2/5] mptcp: add redundant subflows support
2022-05-11 12:17 [PATCH mptcp-next v2 0/5] BPF redundant scheduler Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 1/5] Squash to "mptcp: add get_subflow wrappers" Geliang Tang
@ 2022-05-11 12:17 ` Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 3/5] mptcp: add call_again flag in mptcp_sched_ops Geliang Tang
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2022-05-11 12:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the redundant subflows support, sending all packets
redundantly on all available subflows.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 40 ++++++++++++++++++++++++++++------------
1 file changed, 28 insertions(+), 12 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 74dc832a9d9d..1105c8ad670f 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1559,6 +1559,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
struct mptcp_data_frag *dfrag;
int len, copied = 0;
bool call_again;
+ int max = 0;
while ((dfrag = mptcp_send_head(sk))) {
info.sent = dfrag->already_sent;
@@ -1586,18 +1587,25 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
lock_sock(ssk);
ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
- if (ret <= 0) {
+ if (ret <= 0 && !call_again) {
mptcp_push_release(ssk, &info);
goto out;
}
- info.sent += ret;
- copied += ret;
- len -= ret;
+ if (ret > max)
+ max = ret;
- mptcp_update_post_push(msk, dfrag, ret);
+ if (!call_again) {
+ info.sent += max;
+ copied += max;
+ len -= max;
+
+ mptcp_update_post_push(msk, dfrag, max);
+ max = 0;
+ }
}
- WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
+ if (!call_again)
+ WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
}
/* at this point we held the socket lock for the last subflow we used */
@@ -1623,6 +1631,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
struct sock *xmit_ssk;
int len, copied = 0;
bool first = true;
+ int max = 0;
info.flags = 0;
while ((dfrag = mptcp_send_head(sk))) {
@@ -1646,17 +1655,24 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
}
ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
- if (ret <= 0)
+ if (ret <= 0 && !call_again)
goto out;
- info.sent += ret;
- copied += ret;
- len -= ret;
+ if (ret > max)
+ max = ret;
+
first = false;
+ if (!call_again) {
+ info.sent += max;
+ copied += max;
+ len -= max;
- mptcp_update_post_push(msk, dfrag, ret);
+ mptcp_update_post_push(msk, dfrag, max);
+ max = 0;
+ }
}
- WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
+ if (!call_again)
+ WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
}
out:
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH mptcp-next v2 3/5] mptcp: add call_again flag in mptcp_sched_ops
2022-05-11 12:17 [PATCH mptcp-next v2 0/5] BPF redundant scheduler Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 1/5] Squash to "mptcp: add get_subflow wrappers" Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 2/5] mptcp: add redundant subflows support Geliang Tang
@ 2022-05-11 12:17 ` Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 4/5] selftests/bpf: add bpf_red scheduler Geliang Tang
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2022-05-11 12:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds call_again flag in struct mptcp_sched_ops, init it as
true. Set it to false when the scheduler set call_again = true over
MPTCP_SUBFLOWS_MAX times to avoid infinite loops.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
include/net/mptcp.h | 1 +
net/mptcp/protocol.c | 21 +++++++++++++++------
net/mptcp/sched.c | 1 +
3 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index d48c66de8466..8c9991ef591a 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -112,6 +112,7 @@ struct mptcp_sched_ops {
char name[MPTCP_SCHED_NAME_MAX];
struct module *owner;
struct list_head list;
+ bool call_again;
void (*init)(const struct mptcp_sock *msk);
void (*release)(const struct mptcp_sock *msk);
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 1105c8ad670f..9c1ebd7a507e 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1560,6 +1560,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
int len, copied = 0;
bool call_again;
int max = 0;
+ int nr = 0;
while ((dfrag = mptcp_send_head(sk))) {
info.sent = dfrag->already_sent;
@@ -1587,7 +1588,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
lock_sock(ssk);
ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
- if (ret <= 0 && !call_again) {
+ if (ret <= 0 && (!call_again || !msk->sched->call_again)) {
mptcp_push_release(ssk, &info);
goto out;
}
@@ -1595,16 +1596,20 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
if (ret > max)
max = ret;
- if (!call_again) {
+ if (!call_again || !msk->sched->call_again) {
info.sent += max;
copied += max;
len -= max;
mptcp_update_post_push(msk, dfrag, max);
max = 0;
+ } else if (nr++ >= MPTCP_SUBFLOWS_MAX) {
+ mptcp_push_release(ssk, &info);
+ WRITE_ONCE(msk->sched->call_again, false);
+ goto out;
}
}
- if (!call_again)
+ if (!call_again || !msk->sched->call_again)
WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
}
@@ -1632,6 +1637,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
int len, copied = 0;
bool first = true;
int max = 0;
+ int nr = 0;
info.flags = 0;
while ((dfrag = mptcp_send_head(sk))) {
@@ -1655,23 +1661,26 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
}
ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
- if (ret <= 0 && !call_again)
+ if (ret <= 0 && (!call_again || !msk->sched->call_again))
goto out;
if (ret > max)
max = ret;
first = false;
- if (!call_again) {
+ if (!call_again || !msk->sched->call_again) {
info.sent += max;
copied += max;
len -= max;
mptcp_update_post_push(msk, dfrag, max);
max = 0;
+ } else if (nr++ >= MPTCP_SUBFLOWS_MAX) {
+ WRITE_ONCE(msk->sched->call_again, false);
+ goto out;
}
}
- if (!call_again)
+ if (!call_again || !msk->sched->call_again)
WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
}
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 0d5fc96a2ce0..10736c334ab0 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -67,6 +67,7 @@ int mptcp_init_sched(struct mptcp_sock *msk,
msk->sched = sched;
if (msk->sched->init)
msk->sched->init(msk);
+ WRITE_ONCE(msk->sched->call_again, true);
pr_debug("sched=%s", msk->sched->name);
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH mptcp-next v2 4/5] selftests/bpf: add bpf_red scheduler
2022-05-11 12:17 [PATCH mptcp-next v2 0/5] BPF redundant scheduler Geliang Tang
` (2 preceding siblings ...)
2022-05-11 12:17 ` [PATCH mptcp-next v2 3/5] mptcp: add call_again flag in mptcp_sched_ops Geliang Tang
@ 2022-05-11 12:17 ` Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 5/5] selftests/bpf: add bpf_red test Geliang Tang
2022-05-13 1:15 ` [PATCH mptcp-next v2 0/5] BPF redundant scheduler Mat Martineau
5 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2022-05-11 12:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch implements the redundant BPF MPTCP scheduler, named bpf_red,
which sends all packets redundantly on all available subflows.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
.../selftests/bpf/progs/mptcp_bpf_red.c | 54 +++++++++++++++++++
1 file changed, 54 insertions(+)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
new file mode 100644
index 000000000000..ea006a895cf1
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2022, SUSE. */
+
+#include <linux/bpf.h>
+#include "bpf_tcp_helpers.h"
+
+char _license[] SEC("license") = "GPL";
+
+SEC("struct_ops/mptcp_sched_red_init")
+void BPF_PROG(mptcp_sched_red_init, const struct mptcp_sock *msk)
+{
+}
+
+SEC("struct_ops/mptcp_sched_red_release")
+void BPF_PROG(mptcp_sched_red_release, const struct mptcp_sock *msk)
+{
+}
+
+void BPF_STRUCT_OPS(bpf_red_get_subflow, const struct mptcp_sock *msk,
+ bool reinject, struct mptcp_sched_data *data)
+{
+ struct sock *ssk = data->contexts[0]->tcp_sock;
+ int i;
+
+ if (reinject) {
+ data->sock = ssk;
+ data->call_again = 0;
+ return;
+ }
+
+ for (i = 0; i < MPTCP_SUBFLOWS_MAX && i < data->subflows; i++) {
+ if (!msk->last_snd)
+ break;
+
+ if (data->contexts[i]->tcp_sock == msk->last_snd) {
+ if (i + 1 == MPTCP_SUBFLOWS_MAX || !data->contexts[i + 1])
+ break;
+
+ ssk = data->contexts[i + 1]->tcp_sock;
+ break;
+ }
+ }
+
+ data->sock = ssk;
+ data->call_again = i + 1 == data->subflows ? 0 : 1;
+}
+
+SEC(".struct_ops")
+struct mptcp_sched_ops red = {
+ .init = (void *)mptcp_sched_red_init,
+ .release = (void *)mptcp_sched_red_release,
+ .get_subflow = (void *)bpf_red_get_subflow,
+ .name = "bpf_red",
+};
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH mptcp-next v2 5/5] selftests/bpf: add bpf_red test
2022-05-11 12:17 [PATCH mptcp-next v2 0/5] BPF redundant scheduler Geliang Tang
` (3 preceding siblings ...)
2022-05-11 12:17 ` [PATCH mptcp-next v2 4/5] selftests/bpf: add bpf_red scheduler Geliang Tang
@ 2022-05-11 12:17 ` Geliang Tang
2022-05-13 1:15 ` [PATCH mptcp-next v2 0/5] BPF redundant scheduler Mat Martineau
5 siblings, 0 replies; 7+ messages in thread
From: Geliang Tang @ 2022-05-11 12:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch adds the redundant BPF MPTCP scheduler test. Use sysctl to
set net.mptcp.scheduler to use this sched.
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 6303eba67fab..58300a30f218 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -7,6 +7,7 @@
#include "network_helpers.h"
#include "mptcp_bpf_first.skel.h"
#include "mptcp_bpf_rr.skel.h"
+#include "mptcp_bpf_red.skel.h"
#ifndef TCP_CA_NAME_MAX
#define TCP_CA_NAME_MAX 16
@@ -405,6 +406,41 @@ static void test_rr(void)
mptcp_bpf_rr__destroy(rr_skel);
}
+static void test_red(void)
+{
+ struct mptcp_bpf_red *red_skel;
+ int server_fd, client_fd;
+ struct bpf_link *link;
+
+ red_skel = mptcp_bpf_red__open_and_load();
+ if (!ASSERT_OK_PTR(red_skel, "bpf_red__open_and_load"))
+ return;
+
+ link = bpf_map__attach_struct_ops(red_skel->maps.red);
+ if (!ASSERT_OK_PTR(link, "bpf_map__attach_struct_ops")) {
+ mptcp_bpf_red__destroy(red_skel);
+ return;
+ }
+
+ system("ip link add veth1 type veth");
+ system("ip addr add 10.0.1.1/24 dev veth1");
+ system("ip link set veth1 up");
+ system("ip mptcp endpoint add 10.0.1.1 subflow");
+ system("sysctl -qw net.mptcp.scheduler=bpf_red");
+ server_fd = start_mptcp_server(AF_INET, NULL, 0, 0);
+ client_fd = connect_to_mptcp_fd(server_fd, 0);
+
+ send_data(server_fd, client_fd);
+
+ close(client_fd);
+ close(server_fd);
+ system("sysctl -qw net.mptcp.scheduler=default");
+ system("ip mptcp endpoint flush");
+ system("ip link del veth1");
+ bpf_link__destroy(link);
+ mptcp_bpf_red__destroy(red_skel);
+}
+
void test_mptcp(void)
{
if (test__start_subtest("base"))
@@ -413,4 +449,6 @@ void test_mptcp(void)
test_first();
if (test__start_subtest("rr"))
test_rr();
+ if (test__start_subtest("red"))
+ test_red();
}
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH mptcp-next v2 0/5] BPF redundant scheduler
2022-05-11 12:17 [PATCH mptcp-next v2 0/5] BPF redundant scheduler Geliang Tang
` (4 preceding siblings ...)
2022-05-11 12:17 ` [PATCH mptcp-next v2 5/5] selftests/bpf: add bpf_red test Geliang Tang
@ 2022-05-13 1:15 ` Mat Martineau
5 siblings, 0 replies; 7+ messages in thread
From: Mat Martineau @ 2022-05-13 1:15 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Wed, 11 May 2022, Geliang Tang wrote:
> v2:
> - add MPTCP_SUBFLOWS_MAX limit to avoid infinite loops when the
> scheduler always sets call_again to true.
> - track the largest copied amount.
> - deal with __mptcp_subflow_push_pending() and the retransmit loop.
> - depends on "BPF round-robin scheduler" v14.
Thanks for those updates.
As we talked about in the meeting this week, I think it's still good to
revise this to be able to return multiple subflows (whether in a bitmap or
array) from the BPF scheduler function. That is more likely to be workable
with __mptcp_subflow_push_pending() and the way it chains to send on
different subflows with mptcp_subflow_delegate().
- Mat
>
> v1:
>
> Implements the redundant BPF MPTCP scheduler, which sends all packets
> redundantly on all available subflows.
>
> depends on:
> - BPF round-robin scheduler, v13
>
> Geliang Tang (5):
> Squash to "mptcp: add get_subflow wrappers"
> mptcp: add redundant subflows support
> mptcp: add call_again flag in mptcp_sched_ops
> selftests/bpf: add bpf_red scheduler
> selftests/bpf: add bpf_red test
>
> include/net/mptcp.h | 1 +
> net/mptcp/protocol.c | 64 ++++++++++++++-----
> net/mptcp/protocol.h | 4 +-
> net/mptcp/sched.c | 11 +++-
> .../testing/selftests/bpf/prog_tests/mptcp.c | 38 +++++++++++
> .../selftests/bpf/progs/mptcp_bpf_red.c | 54 ++++++++++++++++
> 6 files changed, 151 insertions(+), 21 deletions(-)
> create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
>
> --
> 2.34.1
>
>
>
--
Mat Martineau
Intel
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-05-13 1:15 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-05-11 12:17 [PATCH mptcp-next v2 0/5] BPF redundant scheduler Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 1/5] Squash to "mptcp: add get_subflow wrappers" Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 2/5] mptcp: add redundant subflows support Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 3/5] mptcp: add call_again flag in mptcp_sched_ops Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 4/5] selftests/bpf: add bpf_red scheduler Geliang Tang
2022-05-11 12:17 ` [PATCH mptcp-next v2 5/5] selftests/bpf: add bpf_red test Geliang Tang
2022-05-13 1:15 ` [PATCH mptcp-next v2 0/5] BPF redundant scheduler Mat Martineau
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.