* [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