Skip to content

Commit ee2708a

Browse files
geliangtangkuba-moo
authored andcommitted
mptcp: use get_retrans wrapper
This patch adds the multiple subflows support for __mptcp_retrans(). Use get_retrans() wrapper instead of mptcp_subflow_get_retrans() in it. Check the subflow scheduled flags to test which subflow or subflows are picked by the scheduler, use them to send data. Move msk_owned_by_me() and fallback checks into get_retrans() wrapper from mptcp_subflow_get_retrans(). Reviewed-by: Mat Martineau <martineau@kernel.org> Signed-off-by: Geliang Tang <geliang.tang@suse.com> Signed-off-by: Mat Martineau <martineau@kernel.org> Link: https://lore.kernel.org/r/20230821-upstream-net-next-20230818-v1-9-0c860fb256a8@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 0fa1b37 commit ee2708a

File tree

2 files changed

+43
-28
lines changed

2 files changed

+43
-28
lines changed

net/mptcp/protocol.c

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2233,11 +2233,6 @@ struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk)
22332233
struct mptcp_subflow_context *subflow;
22342234
int min_stale_count = INT_MAX;
22352235

2236-
msk_owned_by_me(msk);
2237-
2238-
if (__mptcp_check_fallback(msk))
2239-
return NULL;
2240-
22412236
mptcp_for_each_subflow(msk, subflow) {
22422237
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
22432238

@@ -2515,16 +2510,17 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)
25152510
static void __mptcp_retrans(struct sock *sk)
25162511
{
25172512
struct mptcp_sock *msk = mptcp_sk(sk);
2513+
struct mptcp_subflow_context *subflow;
25182514
struct mptcp_sendmsg_info info = {};
25192515
struct mptcp_data_frag *dfrag;
2520-
size_t copied = 0;
25212516
struct sock *ssk;
2522-
int ret;
2517+
int ret, err;
2518+
u16 len = 0;
25232519

25242520
mptcp_clean_una_wakeup(sk);
25252521

25262522
/* first check ssk: need to kick "stale" logic */
2527-
ssk = mptcp_subflow_get_retrans(msk);
2523+
err = mptcp_sched_get_retrans(msk);
25282524
dfrag = mptcp_rtx_head(sk);
25292525
if (!dfrag) {
25302526
if (mptcp_data_fin_enabled(msk)) {
@@ -2543,32 +2539,45 @@ static void __mptcp_retrans(struct sock *sk)
25432539
goto reset_timer;
25442540
}
25452541

2546-
if (!ssk)
2542+
if (err)
25472543
goto reset_timer;
25482544

2549-
lock_sock(ssk);
2545+
mptcp_for_each_subflow(msk, subflow) {
2546+
if (READ_ONCE(subflow->scheduled)) {
2547+
u16 copied = 0;
25502548

2551-
/* limit retransmission to the bytes already sent on some subflows */
2552-
info.sent = 0;
2553-
info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : dfrag->already_sent;
2554-
while (info.sent < info.limit) {
2555-
ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
2556-
if (ret <= 0)
2557-
break;
2549+
mptcp_subflow_set_scheduled(subflow, false);
25582550

2559-
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RETRANSSEGS);
2560-
copied += ret;
2561-
info.sent += ret;
2562-
}
2563-
if (copied) {
2564-
dfrag->already_sent = max(dfrag->already_sent, info.sent);
2565-
msk->bytes_retrans += copied;
2566-
tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
2567-
info.size_goal);
2568-
WRITE_ONCE(msk->allow_infinite_fallback, false);
2551+
ssk = mptcp_subflow_tcp_sock(subflow);
2552+
2553+
lock_sock(ssk);
2554+
2555+
/* limit retransmission to the bytes already sent on some subflows */
2556+
info.sent = 0;
2557+
info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len :
2558+
dfrag->already_sent;
2559+
while (info.sent < info.limit) {
2560+
ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
2561+
if (ret <= 0)
2562+
break;
2563+
2564+
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RETRANSSEGS);
2565+
copied += ret;
2566+
info.sent += ret;
2567+
}
2568+
if (copied) {
2569+
len = max(copied, len);
2570+
tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
2571+
info.size_goal);
2572+
WRITE_ONCE(msk->allow_infinite_fallback, false);
2573+
}
2574+
2575+
release_sock(ssk);
2576+
}
25692577
}
25702578

2571-
release_sock(ssk);
2579+
msk->bytes_retrans += len;
2580+
dfrag->already_sent = max(dfrag->already_sent, len);
25722581

25732582
reset_timer:
25742583
mptcp_check_and_set_pending(sk);

net/mptcp/sched.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
136136
struct mptcp_subflow_context *subflow;
137137
struct mptcp_sched_data data;
138138

139+
msk_owned_by_me(msk);
140+
141+
/* the following check is moved out of mptcp_subflow_get_retrans */
142+
if (__mptcp_check_fallback(msk))
143+
return -EINVAL;
144+
139145
mptcp_for_each_subflow(msk, subflow) {
140146
if (READ_ONCE(subflow->scheduled))
141147
return 0;

0 commit comments

Comments
 (0)