Skip to content

Commit

Permalink
mptcp: use get_retrans wrapper
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
geliangtang authored and kuba-moo committed Aug 23, 2023
1 parent 0fa1b37 commit ee2708a
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 28 deletions.
65 changes: 37 additions & 28 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2233,11 +2233,6 @@ struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk)
struct mptcp_subflow_context *subflow;
int min_stale_count = INT_MAX;

msk_owned_by_me(msk);

if (__mptcp_check_fallback(msk))
return NULL;

mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);

Expand Down Expand Up @@ -2515,16 +2510,17 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)
static void __mptcp_retrans(struct sock *sk)
{
struct mptcp_sock *msk = mptcp_sk(sk);
struct mptcp_subflow_context *subflow;
struct mptcp_sendmsg_info info = {};
struct mptcp_data_frag *dfrag;
size_t copied = 0;
struct sock *ssk;
int ret;
int ret, err;
u16 len = 0;

mptcp_clean_una_wakeup(sk);

/* first check ssk: need to kick "stale" logic */
ssk = mptcp_subflow_get_retrans(msk);
err = mptcp_sched_get_retrans(msk);
dfrag = mptcp_rtx_head(sk);
if (!dfrag) {
if (mptcp_data_fin_enabled(msk)) {
Expand All @@ -2543,32 +2539,45 @@ static void __mptcp_retrans(struct sock *sk)
goto reset_timer;
}

if (!ssk)
if (err)
goto reset_timer;

lock_sock(ssk);
mptcp_for_each_subflow(msk, subflow) {
if (READ_ONCE(subflow->scheduled)) {
u16 copied = 0;

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

MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RETRANSSEGS);
copied += ret;
info.sent += ret;
}
if (copied) {
dfrag->already_sent = max(dfrag->already_sent, info.sent);
msk->bytes_retrans += copied;
tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
info.size_goal);
WRITE_ONCE(msk->allow_infinite_fallback, false);
ssk = mptcp_subflow_tcp_sock(subflow);

lock_sock(ssk);

/* limit retransmission to the bytes already sent on some subflows */
info.sent = 0;
info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len :
dfrag->already_sent;
while (info.sent < info.limit) {
ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info);
if (ret <= 0)
break;

MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RETRANSSEGS);
copied += ret;
info.sent += ret;
}
if (copied) {
len = max(copied, len);
tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle,
info.size_goal);
WRITE_ONCE(msk->allow_infinite_fallback, false);
}

release_sock(ssk);
}
}

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

reset_timer:
mptcp_check_and_set_pending(sk);
Expand Down
6 changes: 6 additions & 0 deletions net/mptcp/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,12 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
struct mptcp_subflow_context *subflow;
struct mptcp_sched_data data;

msk_owned_by_me(msk);

/* the following check is moved out of mptcp_subflow_get_retrans */
if (__mptcp_check_fallback(msk))
return -EINVAL;

mptcp_for_each_subflow(msk, subflow) {
if (READ_ONCE(subflow->scheduled))
return 0;
Expand Down

0 comments on commit ee2708a

Please sign in to comment.