MPTCP Linux Development
 help / color / mirror / Atom feed
* [PATCH mptcp-next 0/8] save sched_data at mptcp_sock
@ 2023-05-27 12:55 Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 1/8] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patchset adds sched_data pointer into mptcp_sock to to save some
data at MPTCP and subflows levels.

With these changes, the old patch "mptcp: register default scheduler" in
[1] now works.

https://patchwork.kernel.org/project/mptcp/cover/cover.1665753926.git.geliang.tang@suse.com/ [1]
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/342

Geliang Tang (8):
  Squash to "mptcp: add struct mptcp_sched_ops"
  Squash to "mptcp: add sched in mptcp_sock"
  Squash to "mptcp: add scheduler wrappers"
  mptcp: add last_snd in sched_data
  mptcp: add snd_burst in sched_data
  mptcp: register default scheduler
  Squash to "selftests/bpf: Add mptcp sched structs"
  Squash to "selftests/bpf: Add bpf_rr scheduler"

 include/net/mptcp.h                           |  4 +-
 net/mptcp/protocol.c                          | 28 +++++----
 net/mptcp/protocol.h                          |  9 +--
 net/mptcp/sched.c                             | 60 +++++++++++++++----
 tools/testing/selftests/bpf/bpf_tcp_helpers.h |  4 +-
 .../selftests/bpf/progs/mptcp_bpf_rr.c        |  4 +-
 6 files changed, 76 insertions(+), 33 deletions(-)

-- 
2.35.3


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 1/8] Squash to "mptcp: add struct mptcp_sched_ops"
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 2/8] Squash to "mptcp: add sched in mptcp_sock" Geliang Tang
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Use two tabs.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 include/net/mptcp.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 828b10ddabee..4bba29c99172 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -100,7 +100,7 @@ struct mptcp_out_options {
 #define MPTCP_SUBFLOWS_MAX	8
 
 struct mptcp_sched_data {
-	bool	reinject;
+	bool		reinject;
 	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
 };
 
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 2/8] Squash to "mptcp: add sched in mptcp_sock"
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 1/8] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 3/8] Squash to "mptcp: add scheduler wrappers" Geliang Tang
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Add sched_data pointer into mptcp_sock too.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 net/mptcp/protocol.h | 1 +
 net/mptcp/sched.c    | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index bd3771c7d79d..09a5e23adca1 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -311,6 +311,7 @@ struct mptcp_sock {
 				   */
 	struct sock	*first;
 	struct mptcp_pm_data	pm;
+	struct mptcp_sched_data *data;
 	struct mptcp_sched_ops	*sched;
 	struct {
 		u32	space;	/* bytes copied in last measurement window */
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index c7c167e48d72..fb0a5004980f 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -64,6 +64,10 @@ int mptcp_init_sched(struct mptcp_sock *msk,
 	if (!bpf_try_module_get(sched, sched->owner))
 		return -EBUSY;
 
+	msk->data = kzalloc(sizeof(struct mptcp_sched_data), GFP_ATOMIC);
+	if (!msk->data)
+		return -ENOMEM;
+
 	msk->sched = sched;
 	if (msk->sched->init)
 		msk->sched->init(msk);
@@ -81,6 +85,8 @@ void mptcp_release_sched(struct mptcp_sock *msk)
 	if (!sched)
 		return;
 
+	if (msk->data)
+		kfree(msk->data);
 	msk->sched = NULL;
 	if (sched->release)
 		sched->release(msk);
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 3/8] Squash to "mptcp: add scheduler wrappers"
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 1/8] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 2/8] Squash to "mptcp: add sched in mptcp_sock" Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 4/8] mptcp: add last_snd in sched_data Geliang Tang
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Use msk->data instead of the local variable data.

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 fb0a5004980f..414b646dc9b1 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -122,7 +122,6 @@ void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
 int mptcp_sched_get_send(struct mptcp_sock *msk)
 {
 	struct mptcp_subflow_context *subflow;
-	struct mptcp_sched_data data;
 
 	msk_owned_by_me(msk);
 
@@ -152,15 +151,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);
+	msk->data->reinject = false;
+	msk->sched->data_init(msk, msk->data);
+	return msk->sched->get_subflow(msk, msk->data);
 }
 
 int mptcp_sched_get_retrans(struct mptcp_sock *msk)
 {
 	struct mptcp_subflow_context *subflow;
-	struct mptcp_sched_data data;
 
 	msk_owned_by_me(msk);
 
@@ -183,7 +181,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);
+	msk->data->reinject = true;
+	msk->sched->data_init(msk, msk->data);
+	return msk->sched->get_subflow(msk, msk->data);
 }
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 4/8] mptcp: add last_snd in sched_data
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
                   ` (2 preceding siblings ...)
  2023-05-27 12:55 ` [PATCH mptcp-next 3/8] Squash to "mptcp: add scheduler wrappers" Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 5/8] mptcp: add snd_burst " Geliang Tang
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch moves last_snd from struct mptcp_sock to struct
mptcp_sched_data.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 include/net/mptcp.h  |  1 +
 net/mptcp/protocol.c | 14 +++++++-------
 net/mptcp/protocol.h |  1 -
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 4bba29c99172..4fd84768c5a3 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -101,6 +101,7 @@ struct mptcp_out_options {
 
 struct mptcp_sched_data {
 	bool		reinject;
+	struct sock	*last_snd;
 	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
 };
 
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 763f709fd5f5..59d36b354f6a 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1619,7 +1619,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
 					continue;
 				}
 				do_check_data_fin = true;
-				msk->last_snd = ssk;
+				msk->data->last_snd = ssk;
 			}
 		}
 	}
@@ -1660,7 +1660,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
 			if (ret <= 0)
 				break;
 			copied += ret;
-			msk->last_snd = ssk;
+			msk->data->last_snd = ssk;
 			continue;
 		}
 
@@ -1673,7 +1673,7 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool
 			if (ret <= 0)
 				keep_pushing = false;
 			copied += ret;
-			msk->last_snd = ssk;
+			msk->data->last_snd = ssk;
 		}
 
 		mptcp_for_each_subflow(msk, subflow) {
@@ -2457,8 +2457,8 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
 		WRITE_ONCE(msk->first, NULL);
 
 out:
-	if (ssk == msk->last_snd)
-		msk->last_snd = NULL;
+	if (ssk == msk->data->last_snd)
+		msk->data->last_snd = NULL;
 
 	if (need_push)
 		__mptcp_push_pending(sk, 0);
@@ -2640,7 +2640,7 @@ static void __mptcp_retrans(struct sock *sk)
 
 			release_sock(ssk);
 
-			msk->last_snd = ssk;
+			msk->data->last_snd = ssk;
 		}
 	}
 	dfrag->already_sent = max(dfrag->already_sent, len);
@@ -3142,7 +3142,7 @@ static int mptcp_disconnect(struct sock *sk, int flags)
 	 * subflow
 	 */
 	mptcp_destroy_common(msk, MPTCP_CF_FASTCLOSE);
-	msk->last_snd = NULL;
+	msk->data->last_snd = NULL;
 	WRITE_ONCE(msk->flags, 0);
 	msk->cb_flags = 0;
 	msk->push_pending = 0;
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 09a5e23adca1..21d59b0875e7 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -266,7 +266,6 @@ struct mptcp_sock {
 	atomic64_t	rcv_wnd_sent;
 	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;
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 5/8] mptcp: add snd_burst in sched_data
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
                   ` (3 preceding siblings ...)
  2023-05-27 12:55 ` [PATCH mptcp-next 4/8] mptcp: add last_snd in sched_data Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 6/8] mptcp: register default scheduler Geliang Tang
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch moves snd_burst from struct mptcp_sock to struct
mptcp_sched_data.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 include/net/mptcp.h  |  1 +
 net/mptcp/protocol.c | 11 ++++++-----
 net/mptcp/protocol.h |  4 ++--
 net/mptcp/sched.c    |  2 +-
 4 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 4fd84768c5a3..d24f599b151f 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -102,6 +102,7 @@ struct mptcp_out_options {
 struct mptcp_sched_data {
 	bool		reinject;
 	struct sock	*last_snd;
+	int		snd_burst;
 	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
 };
 
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 59d36b354f6a..83bdbd0a7bbc 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1416,7 +1416,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;
@@ -1486,7 +1487,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;
 }
 
@@ -1504,7 +1505,7 @@ static void mptcp_update_post_push(struct mptcp_sock *msk,
 
 	dfrag->already_sent += sent;
 
-	msk->snd_burst -= sent;
+	msk->data->snd_burst -= sent;
 
 	snd_nxt_new += dfrag->already_sent;
 
@@ -1555,7 +1556,7 @@ static int __subflow_push_pending(struct sock *sk, struct sock *ssk,
 		}
 		WRITE_ONCE(msk->first_pending, mptcp_send_next(sk));
 
-		if (msk->snd_burst <= 0 ||
+		if (msk->data->snd_burst <= 0 ||
 		    !sk_stream_memory_free(ssk) ||
 		    !mptcp_subflow_active(mptcp_subflow_ctx(ssk))) {
 			err = copied;
@@ -2349,7 +2350,7 @@ bool __mptcp_retransmit_pending_data(struct sock *sk)
 	mptcp_data_unlock(sk);
 
 	msk->first_pending = rtx_head;
-	msk->snd_burst = 0;
+	msk->data->snd_burst = 0;
 
 	/* be sure to clear the "sent status" on all re-injected fragments */
 	list_for_each_entry(cur, &msk->rtx_queue, list) {
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 21d59b0875e7..760fdd888e31 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -266,7 +266,6 @@ struct mptcp_sock {
 	atomic64_t	rcv_wnd_sent;
 	u64		rcv_data_fin_seq;
 	int		rmem_fwd_alloc;
-	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
@@ -659,7 +658,8 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
 				 bool scheduled);
 void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
 				   struct mptcp_sched_data *data);
-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 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);
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 414b646dc9b1..e1c8548a52c0 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -144,7 +144,7 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
 	if (!msk->sched) {
 		struct sock *ssk;
 
-		ssk = mptcp_subflow_get_send(msk);
+		ssk = mptcp_subflow_get_send(msk, msk->data);
 		if (!ssk)
 			return -EINVAL;
 		mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 6/8] mptcp: register default scheduler
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
                   ` (4 preceding siblings ...)
  2023-05-27 12:55 ` [PATCH mptcp-next 5/8] mptcp: add snd_burst " Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 7/8] Squash to "selftests/bpf: Add mptcp sched structs" Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 8/8] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
  7 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

This patch defines the default packet scheduler mptcp_sched_default.
Register it in mptcp_sched_init(), which is invoked in mptcp_proto_init().
Skip deleting this default scheduler in mptcp_unregister_scheduler().

Set msk->sched to the default scheduler when the input parameter of
mptcp_init_sched() is NULL.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 net/mptcp/protocol.c |  3 ++-
 net/mptcp/protocol.h |  3 ++-
 net/mptcp/sched.c    | 38 ++++++++++++++++++++++++++++++++++++--
 3 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 83bdbd0a7bbc..5447f8b0598b 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2278,7 +2278,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;
@@ -4005,6 +4005,7 @@ void __init mptcp_proto_init(void)
 
 	mptcp_subflow_init();
 	mptcp_pm_init();
+	mptcp_sched_init();
 	mptcp_token_init();
 
 	if (proto_register(&mptcp_prot, 1) != 0)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 760fdd888e31..9552d5f581f6 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -651,6 +651,7 @@ 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);
@@ -660,7 +661,7 @@ void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
 				   struct mptcp_sched_data *data);
 struct sock *mptcp_subflow_get_send(const struct mptcp_sock *msk,
 				    struct mptcp_sched_data *data);
-struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk);
+struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk);
 int mptcp_sched_get_send(struct mptcp_sock *msk);
 int mptcp_sched_get_retrans(struct mptcp_sock *msk);
 
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index e1c8548a52c0..69f9e56ffff9 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -16,6 +16,33 @@
 static DEFINE_SPINLOCK(mptcp_sched_list_lock);
 static LIST_HEAD(mptcp_sched_list);
 
+static void mptcp_sched_default_data_init(const struct mptcp_sock *msk,
+					  struct mptcp_sched_data *data)
+{
+	data->snd_burst = 0;
+}
+
+static int mptcp_sched_default_get_subflow(const struct mptcp_sock *msk,
+					   struct mptcp_sched_data *data)
+{
+	struct sock *ssk;
+
+	ssk = data->reinject ? mptcp_subflow_get_retrans(msk) :
+			       mptcp_subflow_get_send(msk, data);
+	if (!ssk)
+		return -EINVAL;
+
+	mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
+	return 0;
+}
+
+static struct mptcp_sched_ops mptcp_sched_default = {
+	.data_init	= mptcp_sched_default_data_init,
+	.get_subflow	= mptcp_sched_default_get_subflow,
+	.name		= "default",
+	.owner		= THIS_MODULE,
+};
+
 /* Must be called with rcu read lock held */
 struct mptcp_sched_ops *mptcp_sched_find(const char *name)
 {
@@ -50,16 +77,24 @@ int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
 
 void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched)
 {
+	if (sched == &mptcp_sched_default)
+		return;
+
 	spin_lock(&mptcp_sched_list_lock);
 	list_del_rcu(&sched->list);
 	spin_unlock(&mptcp_sched_list_lock);
 }
 
+void mptcp_sched_init(void)
+{
+	mptcp_register_scheduler(&mptcp_sched_default);
+}
+
 int mptcp_init_sched(struct mptcp_sock *msk,
 		     struct mptcp_sched_ops *sched)
 {
 	if (!sched)
-		goto out;
+		sched = &mptcp_sched_default;
 
 	if (!bpf_try_module_get(sched, sched->owner))
 		return -EBUSY;
@@ -74,7 +109,6 @@ int mptcp_init_sched(struct mptcp_sock *msk,
 
 	pr_debug("sched=%s", msk->sched->name);
 
-out:
 	return 0;
 }
 
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 7/8] Squash to "selftests/bpf: Add mptcp sched structs"
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
                   ` (5 preceding siblings ...)
  2023-05-27 12:55 ` [PATCH mptcp-next 6/8] mptcp: register default scheduler Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 12:55 ` [PATCH mptcp-next 8/8] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
  7 siblings, 0 replies; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Use two tabs.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/bpf_tcp_helpers.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index 72c618037386..fcb023a749ad 100644
--- a/tools/testing/selftests/bpf/bpf_tcp_helpers.h
+++ b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
@@ -239,7 +239,7 @@ struct mptcp_subflow_context {
 } __attribute__((preserve_access_index));
 
 struct mptcp_sched_data {
-	bool	reinject;
+	bool		reinject;
 	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
 } __attribute__((preserve_access_index));
 
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH mptcp-next 8/8] Squash to "selftests/bpf: Add bpf_rr scheduler"
  2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
                   ` (6 preceding siblings ...)
  2023-05-27 12:55 ` [PATCH mptcp-next 7/8] Squash to "selftests/bpf: Add mptcp sched structs" Geliang Tang
@ 2023-05-27 12:55 ` Geliang Tang
  2023-05-27 15:28   ` Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results MPTCP CI
  7 siblings, 1 reply; 11+ messages in thread
From: Geliang Tang @ 2023-05-27 12:55 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

Use data->last_snd instead of msk->last_snd.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
 tools/testing/selftests/bpf/bpf_tcp_helpers.h    | 2 +-
 tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/bpf/bpf_tcp_helpers.h b/tools/testing/selftests/bpf/bpf_tcp_helpers.h
index fcb023a749ad..b6a0789fe33b 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;
+	struct sock	*last_snd;
 	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
 } __attribute__((preserve_access_index));
 
@@ -259,7 +260,6 @@ struct mptcp_sched_ops {
 struct mptcp_sock {
 	struct inet_connection_sock	sk;
 
-	struct sock	*last_snd;
 	__u32		token;
 	struct sock	*first;
 	char		ca_name[TCP_CA_NAME_MAX];
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index e101428e5906..4b4141056fe2 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -28,10 +28,10 @@ int BPF_STRUCT_OPS(bpf_rr_get_subflow, const struct mptcp_sock *msk,
 	int nr = 0;
 
 	for (int i = 0; i < MPTCP_SUBFLOWS_MAX; i++) {
-		if (!msk->last_snd || !data->contexts[i])
+		if (!data->last_snd || !data->contexts[i])
 			break;
 
-		if (data->contexts[i]->tcp_sock == msk->last_snd) {
+		if (data->contexts[i]->tcp_sock == data->last_snd) {
 			if (i + 1 == MPTCP_SUBFLOWS_MAX || !data->contexts[i + 1])
 				break;
 
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results
  2023-05-27 12:55 ` [PATCH mptcp-next 8/8] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
@ 2023-05-27 15:28   ` MPTCP CI
  2023-05-28 16:37     ` Matthieu Baerts
  0 siblings, 1 reply; 11+ messages in thread
From: MPTCP CI @ 2023-05-27 15:28 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp

Hi Geliang,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal (except selftest_mptcp_join):
  - Unstable: 1 failed test(s): selftest_simult_flows 🔴:
  - Task: https://cirrus-ci.com/task/6601570566012928
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/6601570566012928/summary/summary.txt

- KVM Validation: normal (only selftest_mptcp_join):
  - Success! ✅:
  - Task: https://cirrus-ci.com/task/6707669310898176
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/6707669310898176/summary/summary.txt

- KVM Validation: debug (except selftest_mptcp_join):
  - Unstable: 3 failed test(s): packetdrill_add_addr packetdrill_fastopen selftest_diag - Critical: 1 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/5897883124236288
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5897883124236288/summary/summary.txt

- KVM Validation: debug (only selftest_mptcp_join):
  - Critical: 1 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/5003560975335424
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5003560975335424/summary/summary.txt

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/f83d4fc5e61e


If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:

    $ cd [kernel source code]
    $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
        --pull always mptcp/mptcp-upstream-virtme-docker:latest \
        auto-debug

For more details:

    https://github.com/multipath-tcp/mptcp-upstream-virtme-docker


Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (Tessares)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results
  2023-05-27 15:28   ` Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results MPTCP CI
@ 2023-05-28 16:37     ` Matthieu Baerts
  0 siblings, 0 replies; 11+ messages in thread
From: Matthieu Baerts @ 2023-05-28 16:37 UTC (permalink / raw)
  To: mptcp, Geliang Tang

Hi Geliang,

Thank you for this new series.

On 27/05/2023 17:28, MPTCP CI wrote:
> Hi Geliang,
> 
> Thank you for your modifications, that's great!
> 
> Our CI did some validations and here is its report:
> 
> - KVM Validation: normal (except selftest_mptcp_join):
>   - Unstable: 1 failed test(s): selftest_simult_flows 🔴:
>   - Task: https://cirrus-ci.com/task/6601570566012928
>   - Summary: https://api.cirrus-ci.com/v1/artifact/task/6601570566012928/summary/summary.txt
> 
> - KVM Validation: normal (only selftest_mptcp_join):
>   - Success! ✅:
>   - Task: https://cirrus-ci.com/task/6707669310898176
>   - Summary: https://api.cirrus-ci.com/v1/artifact/task/6707669310898176/summary/summary.txt
> 
> - KVM Validation: debug (except selftest_mptcp_join):
>   - Unstable: 3 failed test(s): packetdrill_add_addr packetdrill_fastopen selftest_diag - Critical: 1 Call Trace(s) ❌:
>   - Task: https://cirrus-ci.com/task/5897883124236288
>   - Summary: https://api.cirrus-ci.com/v1/artifact/task/5897883124236288/summary/summary.txt
> 
> - KVM Validation: debug (only selftest_mptcp_join):
>   - Critical: 1 Call Trace(s) ❌:
>   - Task: https://cirrus-ci.com/task/5003560975335424
>   - Summary: https://api.cirrus-ci.com/v1/artifact/task/5003560975335424/summary/summary.txt

I guess you saw it but unfortunately it looks like the public CI
reported a `slab-use-after-free` in `__mptcp_close_ssk`
(`net/mptcp/protocol.c:2461`) with this series:

> + ./mptcp_join.sh
> # Created /tmp/tmp.FC1TzYQDFn (size 1 KB) containing data sent by client
> # Created /tmp/tmp.M8EVH4NZGj (size 1 KB) containing data sent by server
> [   63.584639][   T24] IPv6: ADDRCONF(NETDEV_CHANGE): ns2eth1: link becomes ready
> [   63.593396][   T24] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth1: link becomes ready
> [   66.013274][   T24] IPv6: ADDRCONF(NETDEV_CHANGE): ns2eth2: link becomes ready
> [   66.020623][   T24] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth2: link becomes ready
> [   68.388253][    T9] IPv6: ADDRCONF(NETDEV_CHANGE): ns2eth3: link becomes ready
> [   68.396729][    T9] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth3: link becomes ready
> [   70.754933][   T71] IPv6: ADDRCONF(NETDEV_CHANGE): ns2eth4: link becomes ready
> [   70.761723][   T71] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth4: link becomes ready
> [   74.549238][  T233 ]
> ==================================================================
> BUG: KASAN: slab-use-after-free in __mptcp_close_ssk (net/mptcp/protocol.c:2461) 
> Read of size 8 at addr ffff888007885388 by task mptcp_connect/233
> 
> CPU: 3 PID: 233 Comm: mptcp_connect Not tainted 6.4.0-rc3-gf83d4fc5e61e #1
> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
> Call Trace:
>  <TASK>
> dump_stack_lvl (lib/dump_stack.c:107) 
> print_address_description.constprop.0 (mm/kasan/report.c:352) 
> print_report (mm/kasan/report.c:463) 
> ? kasan_addr_to_slab (arch/x86/include/asm/bitops.h:207) 
> ? __mptcp_close_ssk (net/mptcp/protocol.c:2461) 
> kasan_report (mm/kasan/report.c:574) 
> ? __mptcp_close_ssk (net/mptcp/protocol.c:2461) 
> __mptcp_close_ssk (net/mptcp/protocol.c:2461) 
> mptcp_destroy_common (net/mptcp/protocol.c:3313) 
> ? __kmem_cache_free (mm/slub.c:3786) 
> mptcp_destroy (include/net/sock.h:1471) 
> __mptcp_destroy_sock (net/mptcp/protocol.c:2977) 
> __mptcp_close (net/mptcp/protocol.c:3076) 
> ? __mptcp_unaccepted_force_close (net/mptcp/protocol.c:3012) 
> ? lockdep_hardirqs_on_prepare.part.0 (kernel/locking/lockdep.c:4273) 
> mptcp_close (net/mptcp/protocol.c:3091) 
> inet_release (net/ipv4/af_inet.c:427) 
> __sock_release (net/socket.c:654) 
> sock_close (net/socket.c:1399) 
> __fput (fs/file_table.c:321) 
> task_work_run (kernel/task_work.c:181 (discriminator 1)) 
> ? task_work_func_match (kernel/task_work.c:44) 
> ? task_work_cancel (kernel/task_work.c:147) 
> exit_to_user_mode_prepare (include/linux/resume_user_mode.h:49) 
> syscall_exit_to_user_mode (kernel/entry/common.c:130) 
> do_syscall_64 (arch/x86/entry/common.c:87) 
> entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120) 
> RIP: 0033:0x7fb807331117
> Code: ff e8 2d 16 02 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 03 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 41 c3 48 83 ec 18 89 7c 24 0c e8 43 b9 f7 ff
> All code
> ========
>    0:	ff                   	(bad)  
>    1:	e8 2d 16 02 00       	call   0x21633
>    6:	66 2e 0f 1f 84 00 00 	cs nopw 0x0(%rax,%rax,1)
>    d:	00 00 00 
>   10:	0f 1f 00             	nopl   (%rax)
>   13:	f3 0f 1e fa          	endbr64 
>   17:	64 8b 04 25 18 00 00 	mov    %fs:0x18,%eax
>   1e:	00 
>   1f:	85 c0                	test   %eax,%eax
>   21:	75 10                	jne    0x33
>   23:	b8 03 00 00 00       	mov    $0x3,%eax
>   28:	0f 05                	syscall 
>   2a:*	48 3d 00 f0 ff ff    	cmp    $0xfffffffffffff000,%rax		<-- trapping instruction
>   30:	77 41                	ja     0x73
>   32:	c3                   	ret    
>   33:	48 83 ec 18          	sub    $0x18,%rsp
>   37:	89 7c 24 0c          	mov    %edi,0xc(%rsp)
>   3b:	e8 43 b9 f7 ff       	call   0xfffffffffff7b983
> 
> Code starting with the faulting instruction
> ===========================================
>    0:	48 3d 00 f0 ff ff    	cmp    $0xfffffffffffff000,%rax
>    6:	77 41                	ja     0x49
>    8:	c3                   	ret    
>    9:	48 83 ec 18          	sub    $0x18,%rsp
>    d:	89 7c 24 0c          	mov    %edi,0xc(%rsp)
>   11:	e8 43 b9 f7 ff       	call   0xfffffffffff7b959
> RSP: 002b:00007fff341972a8 EFLAGS: 00000246 ORIG_RAX: 0000000000000003
> RAX: 0000000000000000 RBX: 0000000000000001 RCX: 00007fb807331117
> RDX: 0000000000000000 RSI: 00007fff34195260 RDI: 0000000000000004
> RBP: 0000000000000000 R08: 00000000050d5de2 R09: 00007fb807435280
> R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
> R13: 0000000000000004 R14: 00007fff34197460 R15: 00007fff34197360
>  </TASK>
> 
> Allocated by task 240:
> kasan_save_stack (mm/kasan/common.c:46) 
> kasan_set_track (mm/kasan/common.c:52) 
> __kasan_kmalloc (mm/kasan/common.c:384) 
> mptcp_init_sched (net/mptcp/sched.c:102) 
> mptcp_sk_clone_init (include/linux/instrumented.h:40 (discriminator 3)) 
> subflow_syn_recv_sock (net/mptcp/subflow.c:818) 
> tcp_check_req (net/ipv4/tcp_minisocks.c:809) 
> tcp_v4_rcv (net/ipv4/tcp_ipv4.c:2079) 
> ip_protocol_deliver_rcu (net/ipv4/ip_input.c:205) 
> ip_local_deliver_finish (include/linux/rcupdate.h:802) 
> ip_local_deliver (include/linux/netfilter.h:303) 
> ip_rcv (include/linux/netfilter.h:303) 
> __netif_receive_skb_one_core (net/core/dev.c:5484) 
> process_backlog (include/linux/rcupdate.h:802) 
> __napi_poll.constprop.0 (net/core/dev.c:6500) 
> net_rx_action (net/core/dev.c:6566) 
> __do_softirq (arch/x86/include/asm/jump_label.h:27) 
> 
> Freed by task 233:
> kasan_save_stack (mm/kasan/common.c:46) 
> kasan_set_track (mm/kasan/common.c:52) 
> kasan_save_free_info (mm/kasan/generic.c:523) 
> ____kasan_slab_free (mm/kasan/common.c:238) 
> slab_free_freelist_hook (mm/slub.c:1807) 
> __kmem_cache_free (mm/slub.c:3786) 
> mptcp_release_sched (net/mptcp/sched.c:124) 
> __mptcp_destroy_sock (net/mptcp/protocol.c:2975) 
> __mptcp_close (net/mptcp/protocol.c:3076) 
> mptcp_close (net/mptcp/protocol.c:3091) 
> inet_release (net/ipv4/af_inet.c:427) 
> __sock_release (net/socket.c:654) 
> sock_close (net/socket.c:1399) 
> __fput (fs/file_table.c:321) 
> task_work_run (kernel/task_work.c:181 (discriminator 1)) 
> exit_to_user_mode_prepare (include/linux/resume_user_mode.h:49) 
> syscall_exit_to_user_mode (kernel/entry/common.c:130) 
> do_syscall_64 (arch/x86/entry/common.c:87) 
> entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120) 
> 
> The buggy address belongs to the object at ffff888007885380
>  which belongs to the cache kmalloc-96 of size 96
> ==========================================

https://cirrus-ci.com/task/5003560975335424?logs=test#L7842-L7971

Cheers,
Matt
-- 
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2023-05-28 16:37 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-27 12:55 [PATCH mptcp-next 0/8] save sched_data at mptcp_sock Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 1/8] Squash to "mptcp: add struct mptcp_sched_ops" Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 2/8] Squash to "mptcp: add sched in mptcp_sock" Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 3/8] Squash to "mptcp: add scheduler wrappers" Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 4/8] mptcp: add last_snd in sched_data Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 5/8] mptcp: add snd_burst " Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 6/8] mptcp: register default scheduler Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 7/8] Squash to "selftests/bpf: Add mptcp sched structs" Geliang Tang
2023-05-27 12:55 ` [PATCH mptcp-next 8/8] Squash to "selftests/bpf: Add bpf_rr scheduler" Geliang Tang
2023-05-27 15:28   ` Squash to "selftests/bpf: Add bpf_rr scheduler": Tests Results MPTCP CI
2023-05-28 16:37     ` Matthieu Baerts

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox