* [PATCH mptcp-next v8 00/15] refactor push pending
@ 2022-10-14 13:32 Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 01/15] Revert "mptcp: add get_subflow wrappers" Geliang Tang
` (14 more replies)
0 siblings, 15 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
v8:
- merge "register default scheduler" into this series.
- Move "multi-subflow scheduling" out of this series.
- This series should be merged between the commit "mptcp: add get_subflow
wrappers" and "bpf: Add bpf_mptcp_sched_ops", except the squash-to patches.
v7:
- update delegate sending in patch 10
- rebase to export/20221011T063543.
v6:
- drop all msk->last_snd, add last_snd variable instead in patch 13
- fix lock_sock issue in patch 3
- merge squash-to patches
v5:
- address Mat's comments in v4.
v4:
- update __mptcp_subflow_push_pending as Mat suggested.
- add more patches from "BPF redundant scheduler" series.
v3:
- add a cleanup patch.
- remove msk->last_snd in mptcp_subflow_get_send().
- add the loop that calls the scheduler again in __mptcp_push_pending().
v2:
- add snd_burst check in dfrags loop as Mat suggested.
Refactor __mptcp_push_pending() and __mptcp_subflow_push_pending() to
remove duplicate code and support redundant scheduler more easily in
__mptcp_subflow_push_pending().
Geliang Tang (15):
Revert "mptcp: add get_subflow wrappers"
Squash to "mptcp: add struct mptcp_sched_ops"
mptcp: use msk instead of mptcp_sk(sk)
mptcp: change 'first' as a parameter
mptcp: drop snd_burst in mptcp_sock
mptcp: refactor push_pending logic
mptcp: drop last_snd in mptcp_sock
mptcp: add sched_data_set_contexts helper
mptcp: register default scheduler
mptcp: add scheduler wrappers
Squash to "bpf: Add bpf_mptcp_sched_ops"
Squash to "bpf: Add bpf_mptcp_sched_kfunc_set"
Squash to "selftests/bpf: Add bpf_first scheduler"
Squash to "selftests/bpf: Add bpf_bkup scheduler"
Squash to "selftests/bpf: Add bpf_rr scheduler"
include/net/mptcp.h | 7 +-
net/mptcp/bpf.c | 1 +
net/mptcp/pm.c | 9 +-
net/mptcp/pm_netlink.c | 3 -
net/mptcp/protocol.c | 208 ++++++++----------
net/mptcp/protocol.h | 15 +-
net/mptcp/sched.c | 117 ++++++----
tools/testing/selftests/bpf/bpf_tcp_helpers.h | 10 +-
.../selftests/bpf/progs/mptcp_bpf_bkup.c | 10 +-
.../selftests/bpf/progs/mptcp_bpf_first.c | 10 +-
.../selftests/bpf/progs/mptcp_bpf_rr.c | 16 +-
11 files changed, 212 insertions(+), 194 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 01/15] Revert "mptcp: add get_subflow wrappers"
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 02/15] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
` (13 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This reverts commit 517ab13fd55a51e77c1dd39d6023fe568aa250a5.
---
net/mptcp/protocol.c | 26 ++++++++++----
net/mptcp/protocol.h | 4 ---
net/mptcp/sched.c | 85 --------------------------------------------
3 files changed, 20 insertions(+), 95 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index d34765db0700..8ad13569cb25 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1406,7 +1406,7 @@ bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
* returns the subflow that will transmit the next DSS
* additionally updates the rtx timeout
*/
-struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
+static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
{
struct subflow_send_info send_info[SSK_MODE_MAX];
struct mptcp_subflow_context *subflow;
@@ -1417,6 +1417,15 @@ struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
u64 linger_time;
long tout = 0;
+ sock_owned_by_me(sk);
+
+ if (__mptcp_check_fallback(msk)) {
+ if (!msk->first)
+ return NULL;
+ return __tcp_can_send(msk->first) &&
+ sk_stream_memory_free(msk->first) ? msk->first : NULL;
+ }
+
/* re-use last subflow, if the burst allow that */
if (msk->last_snd && msk->snd_burst > 0 &&
sk_stream_memory_free(msk->last_snd) &&
@@ -1547,7 +1556,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_subflow_get_send(msk);
/* First check. If the ssk has changed since
* the last round, release prev_ssk
@@ -1616,7 +1625,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_subflow_get_send(mptcp_sk(sk));
if (!xmit_ssk)
goto out;
if (xmit_ssk != ssk) {
@@ -2193,12 +2202,17 @@ static void mptcp_timeout_timer(struct timer_list *t)
*
* A backup subflow is returned only if that is the only kind available.
*/
-struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk)
+static struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk)
{
struct sock *backup = NULL, *pick = NULL;
struct mptcp_subflow_context *subflow;
int min_stale_count = INT_MAX;
+ sock_owned_by_me((const struct sock *)msk);
+
+ if (__mptcp_check_fallback(msk))
+ return NULL;
+
mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
@@ -2481,7 +2495,7 @@ static void __mptcp_retrans(struct sock *sk)
mptcp_clean_una_wakeup(sk);
/* first check ssk: need to kick "stale" logic */
- ssk = mptcp_sched_get_retrans(msk);
+ ssk = mptcp_subflow_get_retrans(msk);
dfrag = mptcp_rtx_head(sk);
if (!dfrag) {
if (mptcp_data_fin_enabled(msk)) {
@@ -3199,7 +3213,7 @@ void __mptcp_check_push(struct sock *sk, struct sock *ssk)
return;
if (!sock_owned_by_user(sk)) {
- struct sock *xmit_ssk = mptcp_sched_get_send(mptcp_sk(sk));
+ struct sock *xmit_ssk = mptcp_subflow_get_send(mptcp_sk(sk));
if (xmit_ssk == ssk)
__mptcp_subflow_push_pending(sk, ssk);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 2358a4083eb3..270c187c9001 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -641,10 +641,6 @@ 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);
-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);
static inline bool __tcp_can_send(const struct sock *ssk)
{
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 044c5ec8bbfb..d295b92a5789 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -93,88 +93,3 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
{
WRITE_ONCE(subflow->scheduled, scheduled);
}
-
-static int mptcp_sched_data_init(struct mptcp_sock *msk, bool reinject,
- struct mptcp_sched_data *data)
-{
- struct mptcp_subflow_context *subflow;
- int i = 0;
-
- data->reinject = reinject;
-
- 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;
- }
-
- for (; i < MPTCP_SUBFLOWS_MAX; i++)
- data->contexts[i] = NULL;
-
- return 0;
-}
-
-struct sock *mptcp_sched_get_send(struct mptcp_sock *msk)
-{
- struct mptcp_sched_data data;
- struct sock *ssk = NULL;
- int i;
-
- sock_owned_by_me((struct sock *)msk);
-
- /* the following check is moved out of mptcp_subflow_get_send */
- if (__mptcp_check_fallback(msk)) {
- if (!msk->first)
- return NULL;
- return __tcp_can_send(msk->first) &&
- sk_stream_memory_free(msk->first) ? msk->first : NULL;
- }
-
- if (!msk->sched)
- return mptcp_subflow_get_send(msk);
-
- mptcp_sched_data_init(msk, false, &data);
- msk->sched->get_subflow(msk, &data);
-
- for (i = 0; i < MPTCP_SUBFLOWS_MAX; i++) {
- if (data.contexts[i] && READ_ONCE(data.contexts[i]->scheduled)) {
- ssk = data.contexts[i]->tcp_sock;
- msk->last_snd = ssk;
- break;
- }
- }
-
- return ssk;
-}
-
-struct sock *mptcp_sched_get_retrans(struct mptcp_sock *msk)
-{
- struct mptcp_sched_data data;
- struct sock *ssk = NULL;
- int i;
-
- sock_owned_by_me((const struct sock *)msk);
-
- /* the following check is moved out of mptcp_subflow_get_retrans */
- if (__mptcp_check_fallback(msk))
- return NULL;
-
- if (!msk->sched)
- return mptcp_subflow_get_retrans(msk);
-
- mptcp_sched_data_init(msk, true, &data);
- msk->sched->get_subflow(msk, &data);
-
- for (i = 0; i < MPTCP_SUBFLOWS_MAX; i++) {
- if (data.contexts[i] && READ_ONCE(data.contexts[i]->scheduled)) {
- ssk = data.contexts[i]->tcp_sock;
- msk->last_snd = ssk;
- break;
- }
- }
-
- return ssk;
-}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 02/15] Squash to "mptcp: add struct mptcp_sched_ops"
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 01/15] Revert "mptcp: add get_subflow wrappers" Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 23:53 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 03/15] mptcp: use msk instead of mptcp_sk(sk) Geliang Tang
` (12 subsequent siblings)
14 siblings, 1 reply; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
New api:
- add new data_init
- add snd_burst in mptcp_sched_data
- add an int return value for get_subflow
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
include/net/mptcp.h | 7 +++++--
net/mptcp/sched.c | 2 +-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index c25939b2af68..cac5b0d512fd 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -101,12 +101,15 @@ struct mptcp_out_options {
struct mptcp_sched_data {
bool reinject;
+ int snd_burst;
struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
};
struct mptcp_sched_ops {
- void (*get_subflow)(const struct mptcp_sock *msk,
- struct mptcp_sched_data *data);
+ void (*data_init)(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data);
+ int (*get_subflow)(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data);
char name[MPTCP_SCHED_NAME_MAX];
struct module *owner;
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index d295b92a5789..949663742f14 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -33,7 +33,7 @@ struct mptcp_sched_ops *mptcp_sched_find(const char *name)
int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
{
- if (!sched->get_subflow)
+ if (!sched->data_init || !sched->get_subflow)
return -EINVAL;
spin_lock(&mptcp_sched_list_lock);
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 03/15] mptcp: use msk instead of mptcp_sk(sk)
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 01/15] Revert "mptcp: add get_subflow wrappers" Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 02/15] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 04/15] mptcp: change 'first' as a parameter Geliang Tang
` (11 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Use msk instead of mptcp_sk(sk) in the functions where the variable
"msk = mptcp_sk(sk)" has been defined.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 8ad13569cb25..989708e85779 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1625,7 +1625,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_subflow_get_send(mptcp_sk(sk));
+ xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk);
if (!xmit_ssk)
goto out;
if (xmit_ssk != ssk) {
@@ -2256,7 +2256,7 @@ bool __mptcp_retransmit_pending_data(struct sock *sk)
struct mptcp_data_frag *cur, *rtx_head;
struct mptcp_sock *msk = mptcp_sk(sk);
- if (__mptcp_check_fallback(mptcp_sk(sk)))
+ if (__mptcp_check_fallback(msk))
return false;
if (tcp_rtx_and_write_queues_empty(sk))
@@ -2938,7 +2938,7 @@ bool __mptcp_close(struct sock *sk, long timeout)
sock_hold(sk);
pr_debug("msk=%p state=%d", sk, sk->sk_state);
- if (mptcp_sk(sk)->token)
+ if (msk->token)
mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL);
if (sk->sk_state == TCP_CLOSE) {
@@ -2997,8 +2997,8 @@ static int mptcp_disconnect(struct sock *sk, int flags)
mptcp_stop_timer(sk);
sk_stop_timer(sk, &sk->sk_timer);
- if (mptcp_sk(sk)->token)
- mptcp_event(MPTCP_EVENT_CLOSED, mptcp_sk(sk), NULL, GFP_KERNEL);
+ if (msk->token)
+ mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL);
/* msk->subflow is still intact, the following will not free the first
* subflow
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 04/15] mptcp: change 'first' as a parameter
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (2 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 03/15] mptcp: use msk instead of mptcp_sk(sk) Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 05/15] mptcp: drop snd_burst in mptcp_sock Geliang Tang
` (10 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
The function mptcp_subflow_process_delegated() uses the input ssk first,
while __mptcp_check_push() invokes the packet scheduler first.
So this patch adds a new parameter named 'first' for the function
__mptcp_subflow_push_pending() to deal with these two cases separately.
With this change, the code that invokes the packet scheduler in the
function __mptcp_check_push() can be removed, and replaced by invoking
__mptcp_subflow_push_pending() directly.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 989708e85779..c807220277e1 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1602,7 +1602,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
__mptcp_check_send_data_fin(sk);
}
-static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
+static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first)
{
struct mptcp_sock *msk = mptcp_sk(sk);
struct mptcp_sendmsg_info info = {
@@ -1611,7 +1611,6 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
struct mptcp_data_frag *dfrag;
struct sock *xmit_ssk;
int len, copied = 0;
- bool first = true;
info.flags = 0;
while ((dfrag = mptcp_send_head(sk))) {
@@ -1621,8 +1620,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
while (len > 0) {
int ret = 0;
- /* the caller already invoked the packet scheduler,
- * check for a different subflow usage only after
+ /* check for a different subflow usage only after
* spooling the first chunk of data
*/
xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk);
@@ -3212,16 +3210,10 @@ void __mptcp_check_push(struct sock *sk, struct sock *ssk)
if (!mptcp_send_head(sk))
return;
- if (!sock_owned_by_user(sk)) {
- struct sock *xmit_ssk = mptcp_subflow_get_send(mptcp_sk(sk));
-
- if (xmit_ssk == ssk)
- __mptcp_subflow_push_pending(sk, ssk);
- else if (xmit_ssk)
- mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk), MPTCP_DELEGATE_SEND);
- } else {
+ if (!sock_owned_by_user(sk))
+ __mptcp_subflow_push_pending(sk, ssk, false);
+ else
__set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags);
- }
}
#define MPTCP_FLAGS_PROCESS_CTX_NEED (BIT(MPTCP_PUSH_PENDING) | \
@@ -3312,7 +3304,7 @@ void mptcp_subflow_process_delegated(struct sock *ssk)
if (test_bit(MPTCP_DELEGATE_SEND, &subflow->delegated_status)) {
mptcp_data_lock(sk);
if (!sock_owned_by_user(sk))
- __mptcp_subflow_push_pending(sk, ssk);
+ __mptcp_subflow_push_pending(sk, ssk, true);
else
__set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags);
mptcp_data_unlock(sk);
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 05/15] mptcp: drop snd_burst in mptcp_sock
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (3 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 04/15] mptcp: change 'first' as a parameter Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-15 0:08 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 06/15] mptcp: refactor push_pending logic Geliang Tang
` (9 subsequent siblings)
14 siblings, 1 reply; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Drop snd_burst of struct mptcp_sock, use data->snd_burst instead of
msk->snd_burst.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 18 ++++++++++--------
net/mptcp/protocol.h | 1 -
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index c807220277e1..e95a49e5bc89 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1406,7 +1406,8 @@ bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
* returns the subflow that will transmit the next DSS
* additionally updates the rtx timeout
*/
-static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
+static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
{
struct subflow_send_info send_info[SSK_MODE_MAX];
struct mptcp_subflow_context *subflow;
@@ -1427,7 +1428,7 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
}
/* re-use last subflow, if the burst allow that */
- if (msk->last_snd && msk->snd_burst > 0 &&
+ if (msk->last_snd && data->snd_burst > 0 &&
sk_stream_memory_free(msk->last_snd) &&
mptcp_subflow_active(mptcp_subflow_ctx(msk->last_snd))) {
mptcp_set_timeout(sk);
@@ -1496,7 +1497,7 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
READ_ONCE(ssk->sk_pacing_rate) * burst,
burst + wmem);
msk->last_snd = ssk;
- msk->snd_burst = burst;
+ data->snd_burst = burst;
return ssk;
}
@@ -1514,8 +1515,6 @@ static void mptcp_update_post_push(struct mptcp_sock *msk,
dfrag->already_sent += sent;
- msk->snd_burst -= sent;
-
snd_nxt_new += dfrag->already_sent;
/* snd_nxt_new can be smaller than snd_nxt in case mptcp
@@ -1541,6 +1540,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
{
struct sock *prev_ssk = NULL, *ssk = NULL;
struct mptcp_sock *msk = mptcp_sk(sk);
+ struct mptcp_sched_data data = { 0 };
struct mptcp_sendmsg_info info = {
.flags = flags,
};
@@ -1556,7 +1556,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
int ret = 0;
prev_ssk = ssk;
- ssk = mptcp_subflow_get_send(msk);
+ ssk = mptcp_subflow_get_send(msk, &data);
/* First check. If the ssk has changed since
* the last round, release prev_ssk
@@ -1584,6 +1584,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
do_check_data_fin = true;
info.sent += ret;
len -= ret;
+ data.snd_burst -= ret;
mptcp_update_post_push(msk, dfrag, ret);
}
@@ -1605,6 +1606,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first)
{
struct mptcp_sock *msk = mptcp_sk(sk);
+ struct mptcp_sched_data data = { 0 };
struct mptcp_sendmsg_info info = {
.data_lock_held = true,
};
@@ -1623,7 +1625,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
/* check for a different subflow usage only after
* spooling the first chunk of data
*/
- xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk);
+ xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk, &data);
if (!xmit_ssk)
goto out;
if (xmit_ssk != ssk) {
@@ -1639,6 +1641,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
info.sent += ret;
copied += ret;
len -= ret;
+ data.snd_burst -= ret;
first = false;
mptcp_update_post_push(msk, dfrag, ret);
@@ -2277,7 +2280,6 @@ bool __mptcp_retransmit_pending_data(struct sock *sk)
mptcp_data_unlock(sk);
msk->first_pending = rtx_head;
- msk->snd_burst = 0;
/* be sure to clear the "sent status" on all re-injected fragments */
list_for_each_entry(cur, &msk->rtx_queue, list) {
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 270c187c9001..b731e7b37f5a 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -259,7 +259,6 @@ struct mptcp_sock {
u64 rcv_data_fin_seq;
int rmem_fwd_alloc;
struct sock *last_snd;
- int snd_burst;
int old_wspace;
u64 recovery_snd_nxt; /* in recovery mode accept up to this seq;
* recovery related fields are under data_lock
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 06/15] mptcp: refactor push_pending logic
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (4 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 05/15] mptcp: drop snd_burst in mptcp_sock Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-15 0:11 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 07/15] mptcp: drop last_snd in mptcp_sock Geliang Tang
` (8 subsequent siblings)
14 siblings, 1 reply; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
To support redundant package schedulers more easily, this patch refactors
__mptcp_push_pending() logic from:
For each dfrag:
While sends succeed:
Call the scheduler (selects subflow and msk->snd_burst)
Update subflow locks (push/release/acquire as needed)
Send the dfrag data with mptcp_sendmsg_frag()
Update already_sent, snd_nxt, snd_burst
Update msk->first_pending
Push/release on final subflow
->
While the scheduler selects one subflow:
Lock the subflow
For each pending dfrag:
While sends succeed:
Send the dfrag data with mptcp_sendmsg_frag()
Update already_sent, snd_nxt, snd_burst
Update msk->first_pending
Break if required by msk->snd_burst / etc
Push and release the subflow
Refactors __mptcp_subflow_push_pending logic from:
For each dfrag:
While sends succeed:
Call the scheduler (selects subflow and msk->snd_burst)
Send the dfrag data with mptcp_subflow_delegate(), break
Send the dfrag data with mptcp_sendmsg_frag()
Update dfrag->already_sent, msk->snd_nxt, msk->snd_burst
Update msk->first_pending
->
While first_pending isn't empty:
Call the scheduler (selects subflow and msk->snd_burst)
Send the dfrag data with mptcp_subflow_delegate(), break
Send the dfrag data with mptcp_sendmsg_frag()
For each pending dfrag:
While sends succeed:
Send the dfrag data with mptcp_sendmsg_frag()
Update already_sent, snd_nxt, snd_burst
Update msk->first_pending
Break if required by msk->snd_burst / etc
Move the duplicate code from __mptcp_push_pending() and
__mptcp_subflow_push_pending() into a new helper function, named
__subflow_push_pending(). Simplify __mptcp_push_pending() and
__mptcp_subflow_push_pending() by invoking this helper.
Also move the burst check conditions out of the function
mptcp_subflow_get_send(), check them in __mptcp_push_pending() and
__mptcp_subflow_push_pending() in the inner "for each pending dfrag"
loop.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 160 +++++++++++++++++++------------------------
1 file changed, 72 insertions(+), 88 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index e95a49e5bc89..c3a4e0148c4a 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1427,14 +1427,6 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
sk_stream_memory_free(msk->first) ? msk->first : NULL;
}
- /* re-use last subflow, if the burst allow that */
- if (msk->last_snd && data->snd_burst > 0 &&
- sk_stream_memory_free(msk->last_snd) &&
- mptcp_subflow_active(mptcp_subflow_ctx(msk->last_snd))) {
- mptcp_set_timeout(sk);
- return msk->last_snd;
- }
-
/* pick the subflow with the lower wmem/wspace ratio */
for (i = 0; i < SSK_MODE_MAX; ++i) {
send_info[i].ssk = NULL;
@@ -1501,12 +1493,6 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
return ssk;
}
-static void mptcp_push_release(struct sock *ssk, struct mptcp_sendmsg_info *info)
-{
- tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle, info->size_goal);
- release_sock(ssk);
-}
-
static void mptcp_update_post_push(struct mptcp_sock *msk,
struct mptcp_data_frag *dfrag,
u32 sent)
@@ -1536,70 +1522,83 @@ void mptcp_check_and_set_pending(struct sock *sk)
mptcp_sk(sk)->push_pending |= BIT(MPTCP_PUSH_PENDING);
}
-void __mptcp_push_pending(struct sock *sk, unsigned int flags)
+static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
+ struct mptcp_sendmsg_info *info,
+ struct mptcp_sched_data *data)
{
- struct sock *prev_ssk = NULL, *ssk = NULL;
struct mptcp_sock *msk = mptcp_sk(sk);
- struct mptcp_sched_data data = { 0 };
- struct mptcp_sendmsg_info info = {
- .flags = flags,
- };
- bool do_check_data_fin = false;
struct mptcp_data_frag *dfrag;
- int len;
+ int len, copied = 0, err = 0;
while ((dfrag = mptcp_send_head(sk))) {
- info.sent = dfrag->already_sent;
- info.limit = dfrag->data_len;
+ info->sent = dfrag->already_sent;
+ info->limit = dfrag->data_len;
len = dfrag->data_len - dfrag->already_sent;
while (len > 0) {
int ret = 0;
- prev_ssk = ssk;
- ssk = mptcp_subflow_get_send(msk, &data);
-
- /* First check. If the ssk has changed since
- * the last round, release prev_ssk
- */
- if (ssk != prev_ssk && prev_ssk)
- mptcp_push_release(prev_ssk, &info);
- if (!ssk)
- goto out;
-
- /* Need to lock the new subflow only if different
- * from the previous one, otherwise we are still
- * helding the relevant lock
- */
- if (ssk != prev_ssk)
- lock_sock(ssk);
-
- ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
+ ret = mptcp_sendmsg_frag(sk, ssk, dfrag, info);
if (ret <= 0) {
- if (ret == -EAGAIN)
- continue;
- mptcp_push_release(ssk, &info);
+ err = copied ? : ret;
goto out;
}
- do_check_data_fin = true;
- info.sent += ret;
+ info->sent += ret;
+ copied += ret;
len -= ret;
- data.snd_burst -= ret;
+ data->snd_burst -= ret;
mptcp_update_post_push(msk, dfrag, ret);
}
WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
+
+ if (data->snd_burst <= 0 ||
+ !sk_stream_memory_free(ssk) ||
+ !mptcp_subflow_active(mptcp_subflow_ctx(ssk))) {
+ err = copied ? : -EAGAIN;
+ goto out;
+ }
+ mptcp_set_timeout(sk);
+ }
+ err = copied;
+
+out:
+ if (copied) {
+ tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle,
+ info->size_goal);
}
- /* at this point we held the socket lock for the last subflow we used */
- if (ssk)
- mptcp_push_release(ssk, &info);
+ return err;
+}
+
+void __mptcp_push_pending(struct sock *sk, unsigned int flags)
+{
+ struct mptcp_sock *msk = mptcp_sk(sk);
+ struct mptcp_sched_data data = { 0 };
+ struct mptcp_sendmsg_info info = {
+ .flags = flags,
+ };
+ struct sock *ssk;
+ int ret = 0;
+
+again:
+ while (mptcp_send_head(sk) && (ssk = mptcp_subflow_get_send(msk, &data))) {
+ lock_sock(ssk);
+ ret = __subflow_push_pending(sk, ssk, &info, &data);
+ release_sock(ssk);
+
+ if (ret <= 0) {
+ if (ret == -EAGAIN)
+ goto again;
+ goto out;
+ }
+ }
out:
/* ensure the rtx timer is running */
if (!mptcp_timer_pending(sk))
mptcp_reset_timer(sk);
- if (do_check_data_fin)
+ if (ret > 0)
__mptcp_check_send_data_fin(sk);
}
@@ -1610,52 +1609,37 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
struct mptcp_sendmsg_info info = {
.data_lock_held = true,
};
- struct mptcp_data_frag *dfrag;
struct sock *xmit_ssk;
- int len, copied = 0;
+ int ret = 0;
info.flags = 0;
- while ((dfrag = mptcp_send_head(sk))) {
- info.sent = dfrag->already_sent;
- info.limit = dfrag->data_len;
- len = dfrag->data_len - dfrag->already_sent;
- while (len > 0) {
- int ret = 0;
-
- /* check for a different subflow usage only after
- * spooling the first chunk of data
- */
- xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk, &data);
- if (!xmit_ssk)
- goto out;
- if (xmit_ssk != ssk) {
- mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk),
- MPTCP_DELEGATE_SEND);
- goto out;
- }
-
- ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
- if (ret <= 0)
- goto out;
-
- info.sent += ret;
- copied += ret;
- len -= ret;
- data.snd_burst -= ret;
- first = false;
+again:
+ while (mptcp_send_head(sk)) {
+ /* check for a different subflow usage only after
+ * spooling the first chunk of data
+ */
+ xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk, &data);
+ if (!xmit_ssk)
+ goto out;
+ if (xmit_ssk != ssk) {
+ mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk),
+ MPTCP_DELEGATE_SEND);
+ goto out;
+ }
- mptcp_update_post_push(msk, dfrag, ret);
+ ret = __subflow_push_pending(sk, ssk, &info, &data);
+ if (ret <= 0) {
+ if (ret == -EAGAIN)
+ goto again;
+ break;
}
- WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
}
out:
/* __mptcp_alloc_tx_skb could have released some wmem and we are
* not going to flush it via release_sock()
*/
- if (copied) {
- tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
- info.size_goal);
+ if (ret > 0) {
if (!mptcp_timer_pending(sk))
mptcp_reset_timer(sk);
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 07/15] mptcp: drop last_snd in mptcp_sock
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (5 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 06/15] mptcp: refactor push_pending logic Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 08/15] mptcp: add sched_data_set_contexts helper Geliang Tang
` (7 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
msk->last_snd is no longer used anymore, drop it as well as the macro
MPTCP_RESET_SCHEDULER.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/pm.c | 9 +--------
net/mptcp/pm_netlink.c | 3 ---
net/mptcp/protocol.c | 11 +----------
net/mptcp/protocol.h | 2 --
4 files changed, 2 insertions(+), 23 deletions(-)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 45e2a48397b9..cdeb7280ac76 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -282,15 +282,8 @@ void mptcp_pm_mp_prio_received(struct sock *ssk, u8 bkup)
pr_debug("subflow->backup=%d, bkup=%d\n", subflow->backup, bkup);
msk = mptcp_sk(sk);
- if (subflow->backup != bkup) {
+ if (subflow->backup != bkup)
subflow->backup = bkup;
- mptcp_data_lock(sk);
- if (!sock_owned_by_user(sk))
- msk->last_snd = NULL;
- else
- __set_bit(MPTCP_RESET_SCHEDULER, &msk->cb_flags);
- mptcp_data_unlock(sk);
- }
mptcp_event(MPTCP_EVENT_SUB_PRIORITY, msk, ssk, GFP_ATOMIC);
}
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 9813ed0fde9b..1f2da4aedcb4 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -475,9 +475,6 @@ static void __mptcp_pm_send_ack(struct mptcp_sock *msk, struct mptcp_subflow_con
slow = lock_sock_fast(ssk);
if (prio) {
- if (subflow->backup != backup)
- msk->last_snd = NULL;
-
subflow->send_mp_prio = 1;
subflow->backup = backup;
subflow->request_bkup = backup;
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index c3a4e0148c4a..106d22730954 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1479,16 +1479,13 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
burst = min_t(int, MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt);
wmem = READ_ONCE(ssk->sk_wmem_queued);
- if (!burst) {
- msk->last_snd = NULL;
+ if (!burst)
return ssk;
- }
subflow = mptcp_subflow_ctx(ssk);
subflow->avg_pacing_rate = div_u64((u64)subflow->avg_pacing_rate * wmem +
READ_ONCE(ssk->sk_pacing_rate) * burst,
burst + wmem);
- msk->last_snd = ssk;
data->snd_burst = burst;
return ssk;
}
@@ -2353,9 +2350,6 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
msk->first = NULL;
out:
- if (ssk == msk->last_snd)
- msk->last_snd = NULL;
-
if (need_push)
__mptcp_push_pending(sk, 0);
}
@@ -2988,7 +2982,6 @@ static int mptcp_disconnect(struct sock *sk, int flags)
* subflow
*/
mptcp_destroy_common(msk, MPTCP_CF_FASTCLOSE);
- msk->last_snd = NULL;
WRITE_ONCE(msk->flags, 0);
msk->cb_flags = 0;
msk->push_pending = 0;
@@ -3249,8 +3242,6 @@ static void mptcp_release_cb(struct sock *sk)
__mptcp_set_connected(sk);
if (__test_and_clear_bit(MPTCP_ERROR_REPORT, &msk->cb_flags))
__mptcp_error_report(sk);
- if (__test_and_clear_bit(MPTCP_RESET_SCHEDULER, &msk->cb_flags))
- msk->last_snd = NULL;
}
__mptcp_update_rmem(sk);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index b731e7b37f5a..e553fe70f9a2 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -124,7 +124,6 @@
#define MPTCP_RETRANSMIT 4
#define MPTCP_FLUSH_JOIN_LIST 5
#define MPTCP_CONNECTED 6
-#define MPTCP_RESET_SCHEDULER 7
static inline bool before64(__u64 seq1, __u64 seq2)
{
@@ -258,7 +257,6 @@ struct mptcp_sock {
atomic64_t rcv_wnd_sent;
u64 rcv_data_fin_seq;
int rmem_fwd_alloc;
- struct sock *last_snd;
int old_wspace;
u64 recovery_snd_nxt; /* in recovery mode accept up to this seq;
* recovery related fields are under data_lock
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 08/15] mptcp: add sched_data_set_contexts helper
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (6 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 07/15] mptcp: drop last_snd in mptcp_sock Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 09/15] mptcp: register default scheduler Geliang Tang
` (6 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Add a new helper mptcp_sched_data_set_contexts(), it will be used in
the BPF contexts.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/sched.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 949663742f14..0d7c73e9562e 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -93,3 +93,22 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
{
WRITE_ONCE(subflow->scheduled, scheduled);
}
+
+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;
+ }
+
+ for (; i < MPTCP_SUBFLOWS_MAX; i++)
+ data->contexts[i] = NULL;
+}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 09/15] mptcp: register default scheduler
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (7 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 08/15] mptcp: add sched_data_set_contexts helper Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-15 0:25 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 10/15] mptcp: add scheduler wrappers Geliang Tang
` (5 subsequent siblings)
14 siblings, 1 reply; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch defines the default packet scheduler mptcp_sched_default.
Register it in mptcp_sched_init(), which is invoked in mptcp_proto_init().
Skip deleting this default scheduler in mptcp_unregister_scheduler().
Set msk->sched to the default scheduler when the input parameter of
mptcp_init_sched() is NULL.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 7 ++++---
net/mptcp/protocol.h | 4 ++++
net/mptcp/sched.c | 38 ++++++++++++++++++++++++++++++++++++--
3 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 106d22730954..93c2b5d71254 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1406,8 +1406,8 @@ bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
* returns the subflow that will transmit the next DSS
* additionally updates the rtx timeout
*/
-static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
- struct mptcp_sched_data *data)
+struct sock *mptcp_subflow_get_send(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
{
struct subflow_send_info send_info[SSK_MODE_MAX];
struct mptcp_subflow_context *subflow;
@@ -2184,7 +2184,7 @@ static void mptcp_timeout_timer(struct timer_list *t)
*
* A backup subflow is returned only if that is the only kind available.
*/
-static struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk)
+struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk)
{
struct sock *backup = NULL, *pick = NULL;
struct mptcp_subflow_context *subflow;
@@ -3851,6 +3851,7 @@ void __init mptcp_proto_init(void)
mptcp_subflow_init();
mptcp_pm_init();
+ mptcp_sched_init();
mptcp_token_init();
if (proto_register(&mptcp_prot, MPTCP_USE_SLAB) != 0)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index e553fe70f9a2..cdea1efb14a5 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -633,11 +633,15 @@ void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
struct mptcp_sched_ops *mptcp_sched_find(const char *name);
int mptcp_register_scheduler(struct mptcp_sched_ops *sched);
void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched);
+void mptcp_sched_init(void);
int mptcp_init_sched(struct mptcp_sock *msk,
struct mptcp_sched_ops *sched);
void mptcp_release_sched(struct mptcp_sock *msk);
void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
bool scheduled);
+struct sock *mptcp_subflow_get_send(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data);
+struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk);
static inline bool __tcp_can_send(const struct sock *ssk)
{
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 0d7c73e9562e..92057ca94cf4 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -16,6 +16,33 @@
static DEFINE_SPINLOCK(mptcp_sched_list_lock);
static LIST_HEAD(mptcp_sched_list);
+static void mptcp_sched_default_data_init(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
+{
+ data->snd_burst = 0;
+}
+
+static int mptcp_sched_default_get_subflow(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
+{
+ struct sock *ssk;
+
+ ssk = data->reinject ? mptcp_subflow_get_retrans(msk) :
+ mptcp_subflow_get_send(msk, data);
+ if (!ssk)
+ return -EINVAL;
+
+ mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
+ return 0;
+}
+
+static struct mptcp_sched_ops mptcp_sched_default = {
+ .data_init = mptcp_sched_default_data_init,
+ .get_subflow = mptcp_sched_default_get_subflow,
+ .name = "default",
+ .owner = THIS_MODULE,
+};
+
/* Must be called with rcu read lock held */
struct mptcp_sched_ops *mptcp_sched_find(const char *name)
{
@@ -50,16 +77,24 @@ int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched)
{
+ if (sched == &mptcp_sched_default)
+ return;
+
spin_lock(&mptcp_sched_list_lock);
list_del_rcu(&sched->list);
spin_unlock(&mptcp_sched_list_lock);
}
+void mptcp_sched_init(void)
+{
+ mptcp_register_scheduler(&mptcp_sched_default);
+}
+
int mptcp_init_sched(struct mptcp_sock *msk,
struct mptcp_sched_ops *sched)
{
if (!sched)
- goto out;
+ sched = &mptcp_sched_default;
if (!bpf_try_module_get(sched, sched->owner))
return -EBUSY;
@@ -70,7 +105,6 @@ int mptcp_init_sched(struct mptcp_sock *msk,
pr_debug("sched=%s", msk->sched->name);
-out:
return 0;
}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 10/15] mptcp: add scheduler wrappers
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (8 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 09/15] mptcp: register default scheduler Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 11/15] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
` (4 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch defines two packet scheduler wrappers mptcp_sched_get_send()
and mptcp_sched_get_retrans(), invoke data_init() and get_subflow() of
msk->sched in them.
Set data->reinject to true in mptcp_sched_get_retrans(), set it false in
mptcp_sched_get_send().
If msk->sched is NULL, use default functions mptcp_subflow_get_send()
and mptcp_subflow_get_retrans() to send data.
Move sock_owned_by_me() check and fallback check into the wrappers from
mptcp_subflow_get_send() and mptcp_subflow_get_retrans().
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 14 -----------
net/mptcp/protocol.h | 4 ++++
net/mptcp/sched.c | 55 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 59 insertions(+), 14 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 93c2b5d71254..8974ce86fbad 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1418,15 +1418,6 @@ struct sock *mptcp_subflow_get_send(const struct mptcp_sock *msk,
u64 linger_time;
long tout = 0;
- sock_owned_by_me(sk);
-
- if (__mptcp_check_fallback(msk)) {
- if (!msk->first)
- return NULL;
- return __tcp_can_send(msk->first) &&
- sk_stream_memory_free(msk->first) ? msk->first : NULL;
- }
-
/* pick the subflow with the lower wmem/wspace ratio */
for (i = 0; i < SSK_MODE_MAX; ++i) {
send_info[i].ssk = NULL;
@@ -2190,11 +2181,6 @@ struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk)
struct mptcp_subflow_context *subflow;
int min_stale_count = INT_MAX;
- sock_owned_by_me((const struct sock *)msk);
-
- if (__mptcp_check_fallback(msk))
- return NULL;
-
mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index cdea1efb14a5..95500d0293fb 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -642,6 +642,10 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
struct sock *mptcp_subflow_get_send(const struct mptcp_sock *msk,
struct mptcp_sched_data *data);
struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk);
+int mptcp_sched_get_send(struct mptcp_sock *msk,
+ struct mptcp_sched_data *data);
+int mptcp_sched_get_retrans(struct mptcp_sock *msk,
+ struct mptcp_sched_data *data);
static inline bool __tcp_can_send(const struct sock *ssk)
{
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 92057ca94cf4..fd29797af3bc 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -146,3 +146,58 @@ void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
for (; i < MPTCP_SUBFLOWS_MAX; i++)
data->contexts[i] = NULL;
}
+
+int mptcp_sched_get_send(struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
+{
+ struct sock *ssk = NULL;
+
+ sock_owned_by_me((const struct sock *)msk);
+
+ /* the following check is moved out of mptcp_subflow_get_send */
+ if (__mptcp_check_fallback(msk)) {
+ if (msk->first &&
+ __tcp_can_send(msk->first) &&
+ sk_stream_memory_free(msk->first)) {
+ mptcp_subflow_set_scheduled(mptcp_subflow_ctx(msk->first), true);
+ return 0;
+ }
+ return -EINVAL;
+ }
+
+ if (!msk->sched) {
+ ssk = mptcp_subflow_get_send(msk, data);
+ if (!ssk)
+ return -EINVAL;
+ mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
+ return 0;
+ }
+
+ data->reinject = false;
+ msk->sched->data_init(msk, data);
+ return msk->sched->get_subflow(msk, data);
+}
+
+int mptcp_sched_get_retrans(struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
+{
+ struct sock *ssk = NULL;
+
+ sock_owned_by_me((const struct sock *)msk);
+
+ /* the following check is moved out of mptcp_subflow_get_retrans */
+ if (__mptcp_check_fallback(msk))
+ return -EINVAL;
+
+ if (!msk->sched) {
+ ssk = mptcp_subflow_get_retrans(msk);
+ if (!ssk)
+ return -EINVAL;
+ mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
+ return 0;
+ }
+
+ data->reinject = true;
+ msk->sched->data_init(msk, data);
+ return msk->sched->get_subflow(msk, data);
+}
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 11/15] Squash to "bpf: Add bpf_mptcp_sched_ops"
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (9 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 10/15] mptcp: add scheduler wrappers Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 12/15] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
` (3 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Use new API.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/bpf_tcp_helpers.h | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index c7d4a9a69cfc..701cc31359d3 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -240,6 +240,7 @@ struct mptcp_subflow_context {
struct mptcp_sched_data {
bool reinject;
+ int snd_burst;
struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
} __attribute__((preserve_access_index));
@@ -249,8 +250,10 @@ struct mptcp_sched_ops {
void (*init)(const struct mptcp_sock *msk);
void (*release)(const struct mptcp_sock *msk);
- void (*get_subflow)(const struct mptcp_sock *msk,
- struct mptcp_sched_data *data);
+ void (*data_init)(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data);
+ int (*get_subflow)(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data);
void *owner;
};
@@ -265,5 +268,7 @@ struct mptcp_sock {
extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
bool scheduled) __ksym;
+extern void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data) __ksym;
#endif
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 12/15] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set"
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (10 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 11/15] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 13/15] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
` (2 subsequent siblings)
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Add mptcp_sched_data_set_contexts in kfunc_set.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/bpf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 0a768898990f..03decb05755f 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -164,6 +164,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_sched_data_set_contexts)
BTF_SET8_END(bpf_mptcp_sched_kfunc_ids)
static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = {
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 13/15] Squash to "selftests/bpf: Add bpf_first scheduler"
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (11 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 12/15] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 14/15] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 15/15] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Use new API.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
index fcd733e88b02..e4caa2dd8c6f 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
@@ -16,16 +16,24 @@ void BPF_PROG(mptcp_sched_first_release, const struct mptcp_sock *msk)
{
}
-void BPF_STRUCT_OPS(bpf_first_get_subflow, const struct mptcp_sock *msk,
+void BPF_STRUCT_OPS(bpf_first_data_init, const struct mptcp_sock *msk,
struct mptcp_sched_data *data)
+{
+ mptcp_sched_data_set_contexts(msk, data);
+}
+
+int BPF_STRUCT_OPS(bpf_first_get_subflow, const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
{
mptcp_subflow_set_scheduled(data->contexts[0], true);
+ return 0;
}
SEC(".struct_ops")
struct mptcp_sched_ops first = {
.init = (void *)mptcp_sched_first_init,
.release = (void *)mptcp_sched_first_release,
+ .data_init = (void *)bpf_first_data_init,
.get_subflow = (void *)bpf_first_get_subflow,
.name = "bpf_first",
};
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 14/15] Squash to "selftests/bpf: Add bpf_bkup scheduler"
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (12 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 13/15] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 15/15] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
14 siblings, 0 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Use new API.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
index 949e053e980c..b2724426676e 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
@@ -16,8 +16,14 @@ void BPF_PROG(mptcp_sched_bkup_release, const struct mptcp_sock *msk)
{
}
-void BPF_STRUCT_OPS(bpf_bkup_get_subflow, const struct mptcp_sock *msk,
+void BPF_STRUCT_OPS(bpf_bkup_data_init, const struct mptcp_sock *msk,
struct mptcp_sched_data *data)
+{
+ mptcp_sched_data_set_contexts(msk, data);
+}
+
+int BPF_STRUCT_OPS(bpf_bkup_get_subflow, const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
{
int nr = 0;
@@ -32,12 +38,14 @@ void BPF_STRUCT_OPS(bpf_bkup_get_subflow, const struct mptcp_sock *msk,
}
mptcp_subflow_set_scheduled(data->contexts[nr], true);
+ return 0;
}
SEC(".struct_ops")
struct mptcp_sched_ops bkup = {
.init = (void *)mptcp_sched_bkup_init,
.release = (void *)mptcp_sched_bkup_release,
+ .data_init = (void *)bpf_bkup_data_init,
.get_subflow = (void *)bpf_bkup_get_subflow,
.name = "bpf_bkup",
};
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH mptcp-next v8 15/15] Squash to "selftests/bpf: Add bpf_rr scheduler"
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
` (13 preceding siblings ...)
2022-10-14 13:32 ` [PATCH mptcp-next v8 14/15] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
@ 2022-10-14 13:32 ` Geliang Tang
2022-10-14 14:18 ` Squash to "selftests/bpf: Add bpf_rr scheduler": Build Failure MPTCP CI
2022-10-14 15:49 ` Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results MPTCP CI
14 siblings, 2 replies; 22+ messages in thread
From: Geliang Tang @ 2022-10-14 13:32 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Use last_snd instead of msk->last_snd, then last_snd of struct
mptcp_sock could be removed.
Use new API.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
tools/testing/selftests/bpf/bpf_tcp_helpers.h | 1 -
tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 16 +++++++++++++---
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index 701cc31359d3..ee64b29bf9bb 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -260,7 +260,6 @@ struct mptcp_sched_ops {
struct mptcp_sock {
struct inet_connection_sock sk;
- struct sock *last_snd;
__u32 token;
struct sock *first;
char ca_name[TCP_CA_NAME_MAX];
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index ce4e98f83e43..2d27523b5a7c 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -5,6 +5,7 @@
#include "bpf_tcp_helpers.h"
char _license[] SEC("license") = "GPL";
+struct sock *last_snd = NULL;
SEC("struct_ops/mptcp_sched_rr_init")
void BPF_PROG(mptcp_sched_rr_init, const struct mptcp_sock *msk)
@@ -16,16 +17,22 @@ void BPF_PROG(mptcp_sched_rr_release, const struct mptcp_sock *msk)
{
}
-void BPF_STRUCT_OPS(bpf_rr_get_subflow, const struct mptcp_sock *msk,
+void BPF_STRUCT_OPS(bpf_rr_data_init, const struct mptcp_sock *msk,
struct mptcp_sched_data *data)
+{
+ mptcp_sched_data_set_contexts(msk, data);
+}
+
+int BPF_STRUCT_OPS(bpf_rr_get_subflow, const struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
{
int nr = 0;
for (int i = 0; i < MPTCP_SUBFLOWS_MAX; i++) {
- if (!msk->last_snd || !data->contexts[i])
+ if (!last_snd || !data->contexts[i])
break;
- if (data->contexts[i]->tcp_sock == msk->last_snd) {
+ if (data->contexts[i]->tcp_sock == last_snd) {
if (i + 1 == MPTCP_SUBFLOWS_MAX || !data->contexts[i + 1])
break;
@@ -35,12 +42,15 @@ void BPF_STRUCT_OPS(bpf_rr_get_subflow, const struct mptcp_sock *msk,
}
mptcp_subflow_set_scheduled(data->contexts[nr], true);
+ last_snd = data->contexts[nr]->tcp_sock;
+ return 0;
}
SEC(".struct_ops")
struct mptcp_sched_ops rr = {
.init = (void *)mptcp_sched_rr_init,
.release = (void *)mptcp_sched_rr_release,
+ .data_init = (void *)bpf_rr_data_init,
.get_subflow = (void *)bpf_rr_get_subflow,
.name = "bpf_rr",
};
--
2.35.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: Squash to "selftests/bpf: Add bpf_rr scheduler": Build Failure
2022-10-14 13:32 ` [PATCH mptcp-next v8 15/15] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
@ 2022-10-14 14:18 ` MPTCP CI
2022-10-14 15:49 ` Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results MPTCP CI
1 sibling, 0 replies; 22+ messages in thread
From: MPTCP CI @ 2022-10-14 14:18 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
But sadly, our CI spotted some issues with it when trying to build it.
You can find more details there:
https://patchwork.kernel.org/project/mptcp/patch/a03e67a73655bf701cd26be3dc58480372fdf8f3.1665753926.git.geliang.tang@suse.com/
https://github.com/multipath-tcp/mptcp_net-next/actions/runs/3250457897
Status: failure
Initiator: MPTCPimporter
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/7d412455802e
Feel free to reply to this email if you cannot access logs, if you need
some support to fix the error, if this doesn't seem to be caused by your
modifications or if the error is a false positive one.
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (Tessares)
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results
2022-10-14 13:32 ` [PATCH mptcp-next v8 15/15] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
2022-10-14 14:18 ` Squash to "selftests/bpf: Add bpf_rr scheduler": Build Failure MPTCP CI
@ 2022-10-14 15:49 ` MPTCP CI
1 sibling, 0 replies; 22+ messages in thread
From: MPTCP CI @ 2022-10-14 15:49 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:
- Unstable: 1 failed test(s): packetdrill_add_addr 🔴:
- Task: https://cirrus-ci.com/task/5124182068428800
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5124182068428800/summary/summary.txt
- {"code":404,"message":
- "Can't find artifacts containing file conclusion.txt"}:
- Task: https://cirrus-ci.com/task/6250081975271424
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6250081975271424/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/7d412455802e
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 v8 02/15] Squash to "mptcp: add struct mptcp_sched_ops"
2022-10-14 13:32 ` [PATCH mptcp-next v8 02/15] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
@ 2022-10-14 23:53 ` Mat Martineau
0 siblings, 0 replies; 22+ messages in thread
From: Mat Martineau @ 2022-10-14 23:53 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Fri, 14 Oct 2022, Geliang Tang wrote:
> New api:
> - add new data_init
> - add snd_burst in mptcp_sched_data
> - add an int return value for get_subflow
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> include/net/mptcp.h | 7 +++++--
> net/mptcp/sched.c | 2 +-
> 2 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/include/net/mptcp.h b/include/net/mptcp.h
> index c25939b2af68..cac5b0d512fd 100644
> --- a/include/net/mptcp.h
> +++ b/include/net/mptcp.h
> @@ -101,12 +101,15 @@ struct mptcp_out_options {
>
> struct mptcp_sched_data {
> bool reinject;
> + int snd_burst;
I suggest moving this addition to "mptcp: drop snd_burst in mptcp_sock",
since it isn't used until then.
> struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
> };
>
> struct mptcp_sched_ops {
> - void (*get_subflow)(const struct mptcp_sock *msk,
> - struct mptcp_sched_data *data);
> + void (*data_init)(const struct mptcp_sock *msk,
> + struct mptcp_sched_data *data);
> + int (*get_subflow)(const struct mptcp_sock *msk,
> + struct mptcp_sched_data *data);
>
> char name[MPTCP_SCHED_NAME_MAX];
> struct module *owner;
> diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
> index d295b92a5789..949663742f14 100644
> --- a/net/mptcp/sched.c
> +++ b/net/mptcp/sched.c
> @@ -33,7 +33,7 @@ struct mptcp_sched_ops *mptcp_sched_find(const char *name)
>
> int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
> {
> - if (!sched->get_subflow)
> + if (!sched->data_init || !sched->get_subflow)
> return -EINVAL;
>
> spin_lock(&mptcp_sched_list_lock);
> --
> 2.35.3
>
>
>
--
Mat Martineau
Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v8 05/15] mptcp: drop snd_burst in mptcp_sock
2022-10-14 13:32 ` [PATCH mptcp-next v8 05/15] mptcp: drop snd_burst in mptcp_sock Geliang Tang
@ 2022-10-15 0:08 ` Mat Martineau
0 siblings, 0 replies; 22+ messages in thread
From: Mat Martineau @ 2022-10-15 0:08 UTC (permalink / raw)
To: Geliang Tang, Paolo Abeni; +Cc: mptcp
On Fri, 14 Oct 2022, Geliang Tang wrote:
> Drop snd_burst of struct mptcp_sock, use data->snd_burst instead of
> msk->snd_burst.
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> net/mptcp/protocol.c | 18 ++++++++++--------
> net/mptcp/protocol.h | 1 -
> 2 files changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index c807220277e1..e95a49e5bc89 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -1406,7 +1406,8 @@ bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
> * returns the subflow that will transmit the next DSS
> * additionally updates the rtx timeout
> */
> -static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
> +static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
> + struct mptcp_sched_data *data)
> {
> struct subflow_send_info send_info[SSK_MODE_MAX];
> struct mptcp_subflow_context *subflow;
> @@ -1427,7 +1428,7 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
> }
>
> /* re-use last subflow, if the burst allow that */
> - if (msk->last_snd && msk->snd_burst > 0 &&
> + if (msk->last_snd && data->snd_burst > 0 &&
> sk_stream_memory_free(msk->last_snd) &&
> mptcp_subflow_active(mptcp_subflow_ctx(msk->last_snd))) {
> mptcp_set_timeout(sk);
> @@ -1496,7 +1497,7 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
> READ_ONCE(ssk->sk_pacing_rate) * burst,
> burst + wmem);
> msk->last_snd = ssk;
> - msk->snd_burst = burst;
> + data->snd_burst = burst;
> return ssk;
> }
>
> @@ -1514,8 +1515,6 @@ static void mptcp_update_post_push(struct mptcp_sock *msk,
>
> dfrag->already_sent += sent;
>
> - msk->snd_burst -= sent;
> -
> snd_nxt_new += dfrag->already_sent;
>
> /* snd_nxt_new can be smaller than snd_nxt in case mptcp
> @@ -1541,6 +1540,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> {
> struct sock *prev_ssk = NULL, *ssk = NULL;
> struct mptcp_sock *msk = mptcp_sk(sk);
> + struct mptcp_sched_data data = { 0 };
I think moving snd_burst to struct mptcp_sched_data will make the default
scheduler behave differently. The old location (in msk) would use the
burst length even across multiple pushes. Clearing snd_burst more
frequently can cause the scheduler to switch subflows more often when
multiple subflows are available.
The patch after this (removing last_snd) also contributes to that
behavior.
Paolo, do you think it's important to use a "burst" across multiple
mptcp_push_pending() calls, or is it mostly relevant within a single push?
- Mat
> struct mptcp_sendmsg_info info = {
> .flags = flags,
> };
> @@ -1556,7 +1556,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> int ret = 0;
>
> prev_ssk = ssk;
> - ssk = mptcp_subflow_get_send(msk);
> + ssk = mptcp_subflow_get_send(msk, &data);
>
> /* First check. If the ssk has changed since
> * the last round, release prev_ssk
> @@ -1584,6 +1584,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> do_check_data_fin = true;
> info.sent += ret;
> len -= ret;
> + data.snd_burst -= ret;
>
> mptcp_update_post_push(msk, dfrag, ret);
> }
> @@ -1605,6 +1606,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first)
> {
> struct mptcp_sock *msk = mptcp_sk(sk);
> + struct mptcp_sched_data data = { 0 };
> struct mptcp_sendmsg_info info = {
> .data_lock_held = true,
> };
> @@ -1623,7 +1625,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
> /* check for a different subflow usage only after
> * spooling the first chunk of data
> */
> - xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk);
> + xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk, &data);
> if (!xmit_ssk)
> goto out;
> if (xmit_ssk != ssk) {
> @@ -1639,6 +1641,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
> info.sent += ret;
> copied += ret;
> len -= ret;
> + data.snd_burst -= ret;
> first = false;
>
> mptcp_update_post_push(msk, dfrag, ret);
> @@ -2277,7 +2280,6 @@ bool __mptcp_retransmit_pending_data(struct sock *sk)
> mptcp_data_unlock(sk);
>
> msk->first_pending = rtx_head;
> - msk->snd_burst = 0;
>
> /* be sure to clear the "sent status" on all re-injected fragments */
> list_for_each_entry(cur, &msk->rtx_queue, list) {
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 270c187c9001..b731e7b37f5a 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -259,7 +259,6 @@ struct mptcp_sock {
> u64 rcv_data_fin_seq;
> int rmem_fwd_alloc;
> struct sock *last_snd;
> - int snd_burst;
> int old_wspace;
> u64 recovery_snd_nxt; /* in recovery mode accept up to this seq;
> * recovery related fields are under data_lock
> --
> 2.35.3
>
>
>
--
Mat Martineau
Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v8 06/15] mptcp: refactor push_pending logic
2022-10-14 13:32 ` [PATCH mptcp-next v8 06/15] mptcp: refactor push_pending logic Geliang Tang
@ 2022-10-15 0:11 ` Mat Martineau
0 siblings, 0 replies; 22+ messages in thread
From: Mat Martineau @ 2022-10-15 0:11 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Fri, 14 Oct 2022, Geliang Tang wrote:
> To support redundant package schedulers more easily, this patch refactors
> __mptcp_push_pending() logic from:
>
> For each dfrag:
> While sends succeed:
> Call the scheduler (selects subflow and msk->snd_burst)
> Update subflow locks (push/release/acquire as needed)
> Send the dfrag data with mptcp_sendmsg_frag()
> Update already_sent, snd_nxt, snd_burst
> Update msk->first_pending
> Push/release on final subflow
>
> ->
>
> While the scheduler selects one subflow:
> Lock the subflow
> For each pending dfrag:
> While sends succeed:
> Send the dfrag data with mptcp_sendmsg_frag()
> Update already_sent, snd_nxt, snd_burst
> Update msk->first_pending
> Break if required by msk->snd_burst / etc
> Push and release the subflow
>
> Refactors __mptcp_subflow_push_pending logic from:
>
> For each dfrag:
> While sends succeed:
> Call the scheduler (selects subflow and msk->snd_burst)
> Send the dfrag data with mptcp_subflow_delegate(), break
> Send the dfrag data with mptcp_sendmsg_frag()
> Update dfrag->already_sent, msk->snd_nxt, msk->snd_burst
> Update msk->first_pending
>
> ->
>
> While first_pending isn't empty:
> Call the scheduler (selects subflow and msk->snd_burst)
> Send the dfrag data with mptcp_subflow_delegate(), break
> Send the dfrag data with mptcp_sendmsg_frag()
> For each pending dfrag:
> While sends succeed:
> Send the dfrag data with mptcp_sendmsg_frag()
> Update already_sent, snd_nxt, snd_burst
> Update msk->first_pending
> Break if required by msk->snd_burst / etc
>
> Move the duplicate code from __mptcp_push_pending() and
> __mptcp_subflow_push_pending() into a new helper function, named
> __subflow_push_pending(). Simplify __mptcp_push_pending() and
> __mptcp_subflow_push_pending() by invoking this helper.
>
> Also move the burst check conditions out of the function
> mptcp_subflow_get_send(), check them in __mptcp_push_pending() and
> __mptcp_subflow_push_pending() in the inner "for each pending dfrag"
> loop.
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
> ---
> net/mptcp/protocol.c | 160 +++++++++++++++++++------------------------
> 1 file changed, 72 insertions(+), 88 deletions(-)
>
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index e95a49e5bc89..c3a4e0148c4a 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -1427,14 +1427,6 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
> sk_stream_memory_free(msk->first) ? msk->first : NULL;
> }
>
> - /* re-use last subflow, if the burst allow that */
> - if (msk->last_snd && data->snd_burst > 0 &&
> - sk_stream_memory_free(msk->last_snd) &&
> - mptcp_subflow_active(mptcp_subflow_ctx(msk->last_snd))) {
> - mptcp_set_timeout(sk);
> - return msk->last_snd;
> - }
> -
> /* pick the subflow with the lower wmem/wspace ratio */
> for (i = 0; i < SSK_MODE_MAX; ++i) {
> send_info[i].ssk = NULL;
> @@ -1501,12 +1493,6 @@ static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
> return ssk;
> }
>
> -static void mptcp_push_release(struct sock *ssk, struct mptcp_sendmsg_info *info)
> -{
> - tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle, info->size_goal);
> - release_sock(ssk);
> -}
> -
> static void mptcp_update_post_push(struct mptcp_sock *msk,
> struct mptcp_data_frag *dfrag,
> u32 sent)
> @@ -1536,70 +1522,83 @@ void mptcp_check_and_set_pending(struct sock *sk)
> mptcp_sk(sk)->push_pending |= BIT(MPTCP_PUSH_PENDING);
> }
>
> -void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> +static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
> + struct mptcp_sendmsg_info *info,
> + struct mptcp_sched_data *data)
> {
> - struct sock *prev_ssk = NULL, *ssk = NULL;
> struct mptcp_sock *msk = mptcp_sk(sk);
> - struct mptcp_sched_data data = { 0 };
> - struct mptcp_sendmsg_info info = {
> - .flags = flags,
> - };
> - bool do_check_data_fin = false;
> struct mptcp_data_frag *dfrag;
> - int len;
> + int len, copied = 0, err = 0;
>
> while ((dfrag = mptcp_send_head(sk))) {
> - info.sent = dfrag->already_sent;
> - info.limit = dfrag->data_len;
> + info->sent = dfrag->already_sent;
> + info->limit = dfrag->data_len;
> len = dfrag->data_len - dfrag->already_sent;
> while (len > 0) {
> int ret = 0;
>
> - prev_ssk = ssk;
> - ssk = mptcp_subflow_get_send(msk, &data);
> -
> - /* First check. If the ssk has changed since
> - * the last round, release prev_ssk
> - */
> - if (ssk != prev_ssk && prev_ssk)
> - mptcp_push_release(prev_ssk, &info);
> - if (!ssk)
> - goto out;
> -
> - /* Need to lock the new subflow only if different
> - * from the previous one, otherwise we are still
> - * helding the relevant lock
> - */
> - if (ssk != prev_ssk)
> - lock_sock(ssk);
> -
> - ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
> + ret = mptcp_sendmsg_frag(sk, ssk, dfrag, info);
> if (ret <= 0) {
> - if (ret == -EAGAIN)
> - continue;
> - mptcp_push_release(ssk, &info);
> + err = copied ? : ret;
> goto out;
> }
>
> - do_check_data_fin = true;
> - info.sent += ret;
> + info->sent += ret;
> + copied += ret;
> len -= ret;
> - data.snd_burst -= ret;
> + data->snd_burst -= ret;
>
> mptcp_update_post_push(msk, dfrag, ret);
> }
> WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
> +
> + if (data->snd_burst <= 0 ||
> + !sk_stream_memory_free(ssk) ||
> + !mptcp_subflow_active(mptcp_subflow_ctx(ssk))) {
> + err = copied ? : -EAGAIN;
> + goto out;
> + }
> + mptcp_set_timeout(sk);
> + }
> + err = copied;
> +
> +out:
> + if (copied) {
> + tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle,
> + info->size_goal);
> }
>
> - /* at this point we held the socket lock for the last subflow we used */
> - if (ssk)
> - mptcp_push_release(ssk, &info);
> + return err;
> +}
> +
> +void __mptcp_push_pending(struct sock *sk, unsigned int flags)
> +{
> + struct mptcp_sock *msk = mptcp_sk(sk);
> + struct mptcp_sched_data data = { 0 };
> + struct mptcp_sendmsg_info info = {
> + .flags = flags,
> + };
> + struct sock *ssk;
> + int ret = 0;
> +
> +again:
> + while (mptcp_send_head(sk) && (ssk = mptcp_subflow_get_send(msk, &data))) {
> + lock_sock(ssk);
> + ret = __subflow_push_pending(sk, ssk, &info, &data);
> + release_sock(ssk);
> +
> + if (ret <= 0) {
> + if (ret == -EAGAIN)
> + goto again;
> + goto out;
> + }
> + }
>
> out:
> /* ensure the rtx timer is running */
> if (!mptcp_timer_pending(sk))
> mptcp_reset_timer(sk);
> - if (do_check_data_fin)
> + if (ret > 0)
> __mptcp_check_send_data_fin(sk);
> }
>
> @@ -1610,52 +1609,37 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
> struct mptcp_sendmsg_info info = {
> .data_lock_held = true,
> };
> - struct mptcp_data_frag *dfrag;
> struct sock *xmit_ssk;
> - int len, copied = 0;
> + int ret = 0;
>
> info.flags = 0;
> - while ((dfrag = mptcp_send_head(sk))) {
> - info.sent = dfrag->already_sent;
> - info.limit = dfrag->data_len;
> - len = dfrag->data_len - dfrag->already_sent;
> - while (len > 0) {
> - int ret = 0;
> -
> - /* check for a different subflow usage only after
> - * spooling the first chunk of data
> - */
> - xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk, &data);
> - if (!xmit_ssk)
> - goto out;
> - if (xmit_ssk != ssk) {
> - mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk),
> - MPTCP_DELEGATE_SEND);
> - goto out;
> - }
> -
> - ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
> - if (ret <= 0)
> - goto out;
> -
> - info.sent += ret;
> - copied += ret;
> - len -= ret;
> - data.snd_burst -= ret;
> - first = false;
> +again:
> + while (mptcp_send_head(sk)) {
> + /* check for a different subflow usage only after
> + * spooling the first chunk of data
> + */
> + xmit_ssk = first ? ssk : mptcp_subflow_get_send(msk, &data);
> + if (!xmit_ssk)
> + goto out;
> + if (xmit_ssk != ssk) {
> + mptcp_subflow_delegate(mptcp_subflow_ctx(xmit_ssk),
> + MPTCP_DELEGATE_SEND);
> + goto out;
> + }
>
> - mptcp_update_post_push(msk, dfrag, ret);
> + ret = __subflow_push_pending(sk, ssk, &info, &data);
I think there should still be a "first = false;" before the loop runs
again so that the scheduler will get called on the next iteration. This
will help avoid a tight loop if EAGAIN is returned on the line above.
- Mat
> + if (ret <= 0) {
> + if (ret == -EAGAIN)
> + goto again;
> + break;
> }
> - WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
> }
>
> out:
> /* __mptcp_alloc_tx_skb could have released some wmem and we are
> * not going to flush it via release_sock()
> */
> - if (copied) {
> - tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
> - info.size_goal);
> + if (ret > 0) {
> if (!mptcp_timer_pending(sk))
> mptcp_reset_timer(sk);
>
> --
> 2.35.3
>
>
>
--
Mat Martineau
Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH mptcp-next v8 09/15] mptcp: register default scheduler
2022-10-14 13:32 ` [PATCH mptcp-next v8 09/15] mptcp: register default scheduler Geliang Tang
@ 2022-10-15 0:25 ` Mat Martineau
0 siblings, 0 replies; 22+ messages in thread
From: Mat Martineau @ 2022-10-15 0:25 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Fri, 14 Oct 2022, Geliang Tang wrote:
> This patch defines the default packet scheduler mptcp_sched_default.
> Register it in mptcp_sched_init(), which is invoked in mptcp_proto_init().
> Skip deleting this default scheduler in mptcp_unregister_scheduler().
>
> Set msk->sched to the default scheduler when the input parameter of
> mptcp_init_sched() is NULL.
>
> Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Hi Geliang -
Is there a benefit to registering the default scheduler? It adds an
indirect call for the common case of using the default scheduler.
The scheduler wrappers can make direct calls to the default scheduler if
msk->sched is NULL. It looks like this is partially handled already in
"mptcp: add scheduler wrappers", so it doesn't seem necessary to handle it
both ways. Some changes to setting the "default" scheduler and handling
that name as a special case would still be needed.
- Mat
> ---
> net/mptcp/protocol.c | 7 ++++---
> net/mptcp/protocol.h | 4 ++++
> net/mptcp/sched.c | 38 ++++++++++++++++++++++++++++++++++++--
> 3 files changed, 44 insertions(+), 5 deletions(-)
>
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index 106d22730954..93c2b5d71254 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -1406,8 +1406,8 @@ bool mptcp_subflow_active(struct mptcp_subflow_context *subflow)
> * returns the subflow that will transmit the next DSS
> * additionally updates the rtx timeout
> */
> -static struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk,
> - struct mptcp_sched_data *data)
> +struct sock *mptcp_subflow_get_send(const struct mptcp_sock *msk,
> + struct mptcp_sched_data *data)
> {
> struct subflow_send_info send_info[SSK_MODE_MAX];
> struct mptcp_subflow_context *subflow;
> @@ -2184,7 +2184,7 @@ static void mptcp_timeout_timer(struct timer_list *t)
> *
> * A backup subflow is returned only if that is the only kind available.
> */
> -static struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk)
> +struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk)
> {
> struct sock *backup = NULL, *pick = NULL;
> struct mptcp_subflow_context *subflow;
> @@ -3851,6 +3851,7 @@ void __init mptcp_proto_init(void)
>
> mptcp_subflow_init();
> mptcp_pm_init();
> + mptcp_sched_init();
> mptcp_token_init();
>
> if (proto_register(&mptcp_prot, MPTCP_USE_SLAB) != 0)
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index e553fe70f9a2..cdea1efb14a5 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -633,11 +633,15 @@ void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
> struct mptcp_sched_ops *mptcp_sched_find(const char *name);
> int mptcp_register_scheduler(struct mptcp_sched_ops *sched);
> void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched);
> +void mptcp_sched_init(void);
> int mptcp_init_sched(struct mptcp_sock *msk,
> struct mptcp_sched_ops *sched);
> void mptcp_release_sched(struct mptcp_sock *msk);
> void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
> bool scheduled);
> +struct sock *mptcp_subflow_get_send(const struct mptcp_sock *msk,
> + struct mptcp_sched_data *data);
> +struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk);
>
> static inline bool __tcp_can_send(const struct sock *ssk)
> {
> diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
> index 0d7c73e9562e..92057ca94cf4 100644
> --- a/net/mptcp/sched.c
> +++ b/net/mptcp/sched.c
> @@ -16,6 +16,33 @@
> static DEFINE_SPINLOCK(mptcp_sched_list_lock);
> static LIST_HEAD(mptcp_sched_list);
>
> +static void mptcp_sched_default_data_init(const struct mptcp_sock *msk,
> + struct mptcp_sched_data *data)
> +{
> + data->snd_burst = 0;
> +}
> +
> +static int mptcp_sched_default_get_subflow(const struct mptcp_sock *msk,
> + struct mptcp_sched_data *data)
> +{
> + struct sock *ssk;
> +
> + ssk = data->reinject ? mptcp_subflow_get_retrans(msk) :
> + mptcp_subflow_get_send(msk, data);
> + if (!ssk)
> + return -EINVAL;
> +
> + mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
> + return 0;
> +}
> +
> +static struct mptcp_sched_ops mptcp_sched_default = {
> + .data_init = mptcp_sched_default_data_init,
> + .get_subflow = mptcp_sched_default_get_subflow,
> + .name = "default",
> + .owner = THIS_MODULE,
> +};
> +
> /* Must be called with rcu read lock held */
> struct mptcp_sched_ops *mptcp_sched_find(const char *name)
> {
> @@ -50,16 +77,24 @@ int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
>
> void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched)
> {
> + if (sched == &mptcp_sched_default)
> + return;
> +
> spin_lock(&mptcp_sched_list_lock);
> list_del_rcu(&sched->list);
> spin_unlock(&mptcp_sched_list_lock);
> }
>
> +void mptcp_sched_init(void)
> +{
> + mptcp_register_scheduler(&mptcp_sched_default);
> +}
> +
> int mptcp_init_sched(struct mptcp_sock *msk,
> struct mptcp_sched_ops *sched)
> {
> if (!sched)
> - goto out;
> + sched = &mptcp_sched_default;
>
> if (!bpf_try_module_get(sched, sched->owner))
> return -EBUSY;
> @@ -70,7 +105,6 @@ int mptcp_init_sched(struct mptcp_sock *msk,
>
> pr_debug("sched=%s", msk->sched->name);
>
> -out:
> return 0;
> }
>
> --
> 2.35.3
>
>
>
--
Mat Martineau
Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2022-10-15 0:25 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-14 13:32 [PATCH mptcp-next v8 00/15] refactor push pending Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 01/15] Revert "mptcp: add get_subflow wrappers" Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 02/15] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
2022-10-14 23:53 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 03/15] mptcp: use msk instead of mptcp_sk(sk) Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 04/15] mptcp: change 'first' as a parameter Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 05/15] mptcp: drop snd_burst in mptcp_sock Geliang Tang
2022-10-15 0:08 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 06/15] mptcp: refactor push_pending logic Geliang Tang
2022-10-15 0:11 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 07/15] mptcp: drop last_snd in mptcp_sock Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 08/15] mptcp: add sched_data_set_contexts helper Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 09/15] mptcp: register default scheduler Geliang Tang
2022-10-15 0:25 ` Mat Martineau
2022-10-14 13:32 ` [PATCH mptcp-next v8 10/15] mptcp: add scheduler wrappers Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 11/15] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 12/15] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 13/15] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 14/15] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
2022-10-14 13:32 ` [PATCH mptcp-next v8 15/15] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
2022-10-14 14:18 ` Squash to "selftests/bpf: Add bpf_rr scheduler": Build Failure MPTCP CI
2022-10-14 15:49 ` Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results MPTCP CI
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox