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