* [PATCH mptcp-next 00/10] register default scheduler
@ 2022-10-07 15:02 Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 01/10] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Register the burst scheduler as the default one.
- depends on "refactor push pending" v5
Geliang Tang (10):
Squash to "mptcp: add struct mptcp_sched_ops"
Squash to "mptcp: add get_subflow wrappers" II
mptcp: add mptcp_sched_data_set_contexts helper
mptcp: add mptcp_sched_data argument
mptcp: register default scheduler
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/protocol.c | 33 ++++---
net/mptcp/protocol.h | 13 ++-
net/mptcp/sched.c | 91 ++++++++++---------
tools/testing/selftests/bpf/bpf_tcp_helpers.h | 9 +-
.../selftests/bpf/progs/mptcp_bpf_bkup.c | 10 +-
.../selftests/bpf/progs/mptcp_bpf_first.c | 10 +-
.../selftests/bpf/progs/mptcp_bpf_rr.c | 10 +-
9 files changed, 116 insertions(+), 68 deletions(-)
--
2.35.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH mptcp-next 01/10] Squash to "mptcp: add struct mptcp_sched_ops"
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 02/10] Squash to "mptcp: add get_subflow wrappers" II Geliang Tang
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 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 3d805760ae99..52b734e696a6 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] 12+ messages in thread
* [PATCH mptcp-next 02/10] Squash to "mptcp: add get_subflow wrappers" II
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 01/10] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 03/10] mptcp: add mptcp_sched_data_set_contexts helper Geliang Tang
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Use new api, use the return value of get_subflow.
Some cleanups.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/sched.c | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 52b734e696a6..cabcb34d8af7 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -116,8 +116,6 @@ static int mptcp_sched_data_init(struct mptcp_sock *msk, bool reinject,
for (; i < MPTCP_SUBFLOWS_MAX; i++)
data->contexts[i] = NULL;
- msk->snd_burst = 0;
-
return 0;
}
@@ -126,7 +124,7 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
struct mptcp_sched_data data;
struct sock *ssk = NULL;
- sock_owned_by_me((struct sock *)msk);
+ sock_owned_by_me((const struct sock *)msk);
/* the following check is moved out of mptcp_subflow_get_send */
if (__mptcp_check_fallback(msk)) {
@@ -148,9 +146,7 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
}
mptcp_sched_data_init(msk, false, &data);
- msk->sched->get_subflow(msk, &data);
-
- return 0;
+ return msk->sched->get_subflow(msk, &data);
}
int mptcp_sched_get_retrans(struct mptcp_sock *msk)
@@ -173,7 +169,5 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
}
mptcp_sched_data_init(msk, true, &data);
- msk->sched->get_subflow(msk, &data);
-
- return 0;
+ return msk->sched->get_subflow(msk, &data);
}
--
2.35.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH mptcp-next 03/10] mptcp: add mptcp_sched_data_set_contexts helper
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 01/10] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 02/10] Squash to "mptcp: add get_subflow wrappers" II Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 04/10] mptcp: add mptcp_sched_data argument Geliang Tang
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
Drop mptcp_sched_data_init, use sched->data_init() instead. 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 | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index cabcb34d8af7..126cc7fe0b5a 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -96,14 +96,12 @@ 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)
+void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
+ 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");
@@ -115,8 +113,6 @@ static int mptcp_sched_data_init(struct mptcp_sock *msk, bool reinject,
for (; i < MPTCP_SUBFLOWS_MAX; i++)
data->contexts[i] = NULL;
-
- return 0;
}
int mptcp_sched_get_send(struct mptcp_sock *msk)
@@ -145,7 +141,8 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
return 0;
}
- mptcp_sched_data_init(msk, false, &data);
+ data.reinject = false;
+ msk->sched->data_init(msk, &data);
return msk->sched->get_subflow(msk, &data);
}
@@ -168,6 +165,7 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
return 0;
}
- mptcp_sched_data_init(msk, true, &data);
+ 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] 12+ messages in thread
* [PATCH mptcp-next 04/10] mptcp: add mptcp_sched_data argument
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (2 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 03/10] mptcp: add mptcp_sched_data_set_contexts helper Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 05/10] mptcp: register default scheduler Geliang Tang
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
This patch passes struct mptcp_sched_data argument to get_subflow()
functions.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 18 +++++++++++-------
net/mptcp/protocol.h | 6 ++++--
net/mptcp/sched.c | 20 ++++++++++----------
3 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 23c62779e410..1154bc746148 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1512,7 +1512,8 @@ void mptcp_check_and_set_pending(struct sock *sk)
}
static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
- struct mptcp_sendmsg_info *info)
+ struct mptcp_sendmsg_info *info,
+ struct mptcp_sched_data *data)
{
struct mptcp_sock *msk = mptcp_sk(sk);
struct mptcp_data_frag *dfrag;
@@ -1561,10 +1562,11 @@ static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
void __mptcp_push_pending(struct sock *sk, unsigned int flags)
{
struct mptcp_sock *msk = mptcp_sk(sk);
+ struct mptcp_sched_data data;
int ret = 0;
again:
- while (mptcp_send_head(sk) && !mptcp_sched_get_send(msk)) {
+ while (mptcp_send_head(sk) && !mptcp_sched_get_send(msk, &data)) {
struct mptcp_subflow_context *subflow;
struct mptcp_sendmsg_info info = {
.flags = flags,
@@ -1575,7 +1577,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
lock_sock(ssk);
- ret = __subflow_push_pending(sk, ssk, &info);
+ ret = __subflow_push_pending(sk, ssk, &info, &data);
release_sock(ssk);
if (ret <= 0) {
@@ -1605,6 +1607,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk,
struct mptcp_sendmsg_info info = {
.data_lock_held = true,
};
+ struct mptcp_sched_data data;
int ret = 0;
again:
@@ -1614,7 +1617,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk,
* spooling the first chunk of data
*/
if (first) {
- ret = __subflow_push_pending(sk, ssk, &info);
+ ret = __subflow_push_pending(sk, ssk, &info, &data);
if (ret <= 0) {
if (ret == -EAGAIN)
goto again;
@@ -1625,7 +1628,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk,
continue;
}
- if (mptcp_sched_get_send(msk))
+ if (mptcp_sched_get_send(msk, &data))
goto out;
mptcp_for_each_subflow(msk, subflow) {
@@ -1642,7 +1645,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk,
continue;
}
- ret = __subflow_push_pending(sk, ssk, &info);
+ ret = __subflow_push_pending(sk, ssk, &info, &data);
if (ret <= 0) {
if (ret == -EAGAIN)
goto again;
@@ -2482,6 +2485,7 @@ static void __mptcp_retrans(struct sock *sk)
struct mptcp_subflow_context *subflow;
struct mptcp_sendmsg_info info = {};
struct mptcp_data_frag *dfrag;
+ struct mptcp_sched_data data;
struct sock *ssk;
int ret, err;
u16 len = 0;
@@ -2489,7 +2493,7 @@ static void __mptcp_retrans(struct sock *sk)
mptcp_clean_una_wakeup(sk);
/* first check ssk: need to kick "stale" logic */
- err = mptcp_sched_get_retrans(msk);
+ err = mptcp_sched_get_retrans(msk, &data);
dfrag = mptcp_rtx_head(sk);
if (!dfrag) {
if (mptcp_data_fin_enabled(msk)) {
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 05f4c6fd0cd8..ffcb9d02896b 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -639,8 +639,10 @@ 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);
-int mptcp_sched_get_send(struct mptcp_sock *msk);
-int mptcp_sched_get_retrans(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 126cc7fe0b5a..ab4683e15868 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -115,9 +115,9 @@ void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
data->contexts[i] = NULL;
}
-int mptcp_sched_get_send(struct mptcp_sock *msk)
+int mptcp_sched_get_send(struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
{
- struct mptcp_sched_data data;
struct sock *ssk = NULL;
sock_owned_by_me((const struct sock *)msk);
@@ -141,14 +141,14 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
return 0;
}
- data.reinject = false;
- msk->sched->data_init(msk, &data);
- return msk->sched->get_subflow(msk, &data);
+ 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)
+int mptcp_sched_get_retrans(struct mptcp_sock *msk,
+ struct mptcp_sched_data *data)
{
- struct mptcp_sched_data data;
struct sock *ssk = NULL;
sock_owned_by_me((const struct sock *)msk);
@@ -165,7 +165,7 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
return 0;
}
- data.reinject = true;
- msk->sched->data_init(msk, &data);
- return msk->sched->get_subflow(msk, &data);
+ 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] 12+ messages in thread
* [PATCH mptcp-next 05/10] mptcp: register default scheduler
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (3 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 04/10] mptcp: add mptcp_sched_data argument Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 06/10] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 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().
Use data->snd_burst instead of msk->snd_burst.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 15 ++++++------
net/mptcp/protocol.h | 7 +++---
net/mptcp/sched.c | 55 ++++++++++++++++++++++++++++----------------
3 files changed, 47 insertions(+), 30 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 1154bc746148..d99a09ada0d4 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
*/
-struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
+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;
@@ -1476,7 +1477,7 @@ struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
subflow->avg_pacing_rate = div_u64((u64)subflow->avg_pacing_rate * wmem +
READ_ONCE(ssk->sk_pacing_rate) * burst,
burst + wmem);
- msk->snd_burst = burst;
+ data->snd_burst = burst;
return ssk;
}
@@ -1488,8 +1489,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
@@ -1535,12 +1534,13 @@ static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
info->sent += ret;
copied += ret;
len -= ret;
+ data->snd_burst -= ret;
mptcp_update_post_push(msk, dfrag, ret);
}
WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
- if (msk->snd_burst <= 0 ||
+ if (data->snd_burst <= 0 ||
!sk_stream_memory_free(ssk) ||
!mptcp_subflow_active(mptcp_subflow_ctx(ssk))) {
err = -EAGAIN;
@@ -1617,6 +1617,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk,
* spooling the first chunk of data
*/
if (first) {
+ data.snd_burst = 0;
ret = __subflow_push_pending(sk, ssk, &info, &data);
if (ret <= 0) {
if (ret == -EAGAIN)
@@ -2206,7 +2207,7 @@ 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)
+struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk)
{
struct sock *backup = NULL, *pick = NULL;
struct mptcp_subflow_context *subflow;
@@ -2278,7 +2279,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) {
@@ -3886,6 +3886,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 ffcb9d02896b..fd0f41bf090c 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -258,7 +258,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
@@ -632,13 +631,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(struct mptcp_sock *msk);
-struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk);
+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,
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index ab4683e15868..8ee6e15b6534 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,11 +77,19 @@ 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)
{
@@ -118,8 +153,6 @@ void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
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 */
@@ -133,14 +166,6 @@ int mptcp_sched_get_send(struct mptcp_sock *msk,
return -EINVAL;
}
- if (!msk->sched) {
- ssk = mptcp_subflow_get_send(msk);
- 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);
@@ -149,22 +174,12 @@ int mptcp_sched_get_send(struct mptcp_sock *msk,
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] 12+ messages in thread
* [PATCH mptcp-next 06/10] Squash to "bpf: Add bpf_mptcp_sched_ops"
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (4 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 05/10] mptcp: register default scheduler Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 07/10] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 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] 12+ messages in thread
* [PATCH mptcp-next 07/10] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set"
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (5 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 06/10] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 08/10] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 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] 12+ messages in thread
* [PATCH mptcp-next 08/10] Squash to "selftests/bpf: Add bpf_first scheduler"
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (6 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 07/10] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 09/10] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 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] 12+ messages in thread
* [PATCH mptcp-next 09/10] Squash to "selftests/bpf: Add bpf_bkup scheduler"
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (7 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 08/10] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 10/10] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
2022-10-11 22:32 ` [PATCH mptcp-next 00/10] register default scheduler Mat Martineau
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 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] 12+ messages in thread
* [PATCH mptcp-next 10/10] Squash to "selftests/bpf: Add bpf_rr scheduler"
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (8 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 09/10] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
@ 2022-10-07 15:02 ` Geliang Tang
2022-10-11 22:32 ` [PATCH mptcp-next 00/10] register default scheduler Mat Martineau
10 siblings, 0 replies; 12+ messages in thread
From: Geliang Tang @ 2022-10-07 15:02 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_rr.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index ce4e98f83e43..e101428e5906 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -16,8 +16,14 @@ 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;
@@ -35,12 +41,14 @@ void BPF_STRUCT_OPS(bpf_rr_get_subflow, const struct mptcp_sock *msk,
}
mptcp_subflow_set_scheduled(data->contexts[nr], true);
+ 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] 12+ messages in thread
* Re: [PATCH mptcp-next 00/10] register default scheduler
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
` (9 preceding siblings ...)
2022-10-07 15:02 ` [PATCH mptcp-next 10/10] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
@ 2022-10-11 22:32 ` Mat Martineau
10 siblings, 0 replies; 12+ messages in thread
From: Mat Martineau @ 2022-10-11 22:32 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
On Fri, 7 Oct 2022, Geliang Tang wrote:
> Register the burst scheduler as the default one.
>
> - depends on "refactor push pending" v5
>
Hi Geliang -
I couldn't get these to apply on v5 or v6 of the other series, I also
tried using older export tags. But I think there are some issues to work
on with "refactor push pending", so it might be best to get that series
settled before rebasing and reposting this.
- Mat
> Geliang Tang (10):
> Squash to "mptcp: add struct mptcp_sched_ops"
> Squash to "mptcp: add get_subflow wrappers" II
> mptcp: add mptcp_sched_data_set_contexts helper
> mptcp: add mptcp_sched_data argument
> mptcp: register default scheduler
> 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/protocol.c | 33 ++++---
> net/mptcp/protocol.h | 13 ++-
> net/mptcp/sched.c | 91 ++++++++++---------
> tools/testing/selftests/bpf/bpf_tcp_helpers.h | 9 +-
> .../selftests/bpf/progs/mptcp_bpf_bkup.c | 10 +-
> .../selftests/bpf/progs/mptcp_bpf_first.c | 10 +-
> .../selftests/bpf/progs/mptcp_bpf_rr.c | 10 +-
> 9 files changed, 116 insertions(+), 68 deletions(-)
>
> --
> 2.35.3
>
>
>
--
Mat Martineau
Intel
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2022-10-11 22:32 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-07 15:02 [PATCH mptcp-next 00/10] register default scheduler Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 01/10] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 02/10] Squash to "mptcp: add get_subflow wrappers" II Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 03/10] mptcp: add mptcp_sched_data_set_contexts helper Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 04/10] mptcp: add mptcp_sched_data argument Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 05/10] mptcp: register default scheduler Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 06/10] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 07/10] Squash to "bpf: Add bpf_mptcp_sched_kfunc_set" Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 08/10] Squash to "selftests/bpf: Add bpf_first scheduler" Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 09/10] Squash to "selftests/bpf: Add bpf_bkup scheduler" Geliang Tang
2022-10-07 15:02 ` [PATCH mptcp-next 10/10] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
2022-10-11 22:32 ` [PATCH mptcp-next 00/10] register default 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.