MPTCP Linux Development
 help / color / mirror / Atom feed
* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox