Skip to content

Commit 3473020

Browse files
committed
Merge branch 'mptcp-rx-path-fixes'
Matthieu Baerts says: ==================== mptcp: rx path fixes Here are 3 different fixes, all related to the MPTCP receive buffer: - Patch 1: fix receive buffer space when recvmsg() blocks after receiving some data. For a fix introduced in v6.12, backported to v6.1. - Patch 2: mptcp_cleanup_rbuf() can be called when no data has been copied. For 5.11. - Patch 3: prevent excessive coalescing on receive, which can affect the throughput badly. It looks better to wait a bit before backporting this one to stable versions, to get more results. For 5.10. ==================== Link: https://patch.msgid.link/20241230-net-mptcp-rbuf-fixes-v1-0-8608af434ceb@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 260466b + 56b824e commit 3473020

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

net/mptcp/protocol.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
136136
int delta;
137137

138138
if (MPTCP_SKB_CB(from)->offset ||
139+
((to->len + from->len) > (sk->sk_rcvbuf >> 3)) ||
139140
!skb_try_coalesce(to, from, &fragstolen, &delta))
140141
return false;
141142

@@ -528,13 +529,13 @@ static void mptcp_send_ack(struct mptcp_sock *msk)
528529
mptcp_subflow_send_ack(mptcp_subflow_tcp_sock(subflow));
529530
}
530531

531-
static void mptcp_subflow_cleanup_rbuf(struct sock *ssk)
532+
static void mptcp_subflow_cleanup_rbuf(struct sock *ssk, int copied)
532533
{
533534
bool slow;
534535

535536
slow = lock_sock_fast(ssk);
536537
if (tcp_can_send_ack(ssk))
537-
tcp_cleanup_rbuf(ssk, 1);
538+
tcp_cleanup_rbuf(ssk, copied);
538539
unlock_sock_fast(ssk, slow);
539540
}
540541

@@ -551,22 +552,22 @@ static bool mptcp_subflow_could_cleanup(const struct sock *ssk, bool rx_empty)
551552
(ICSK_ACK_PUSHED2 | ICSK_ACK_PUSHED)));
552553
}
553554

554-
static void mptcp_cleanup_rbuf(struct mptcp_sock *msk)
555+
static void mptcp_cleanup_rbuf(struct mptcp_sock *msk, int copied)
555556
{
556557
int old_space = READ_ONCE(msk->old_wspace);
557558
struct mptcp_subflow_context *subflow;
558559
struct sock *sk = (struct sock *)msk;
559560
int space = __mptcp_space(sk);
560561
bool cleanup, rx_empty;
561562

562-
cleanup = (space > 0) && (space >= (old_space << 1));
563-
rx_empty = !__mptcp_rmem(sk);
563+
cleanup = (space > 0) && (space >= (old_space << 1)) && copied;
564+
rx_empty = !__mptcp_rmem(sk) && copied;
564565

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

568569
if (cleanup || mptcp_subflow_could_cleanup(ssk, rx_empty))
569-
mptcp_subflow_cleanup_rbuf(ssk);
570+
mptcp_subflow_cleanup_rbuf(ssk, copied);
570571
}
571572
}
572573

@@ -1939,6 +1940,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
19391940
goto out;
19401941
}
19411942

1943+
static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied);
1944+
19421945
static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,
19431946
struct msghdr *msg,
19441947
size_t len, int flags,
@@ -1992,6 +1995,7 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,
19921995
break;
19931996
}
19941997

1998+
mptcp_rcv_space_adjust(msk, copied);
19951999
return copied;
19962000
}
19972001

@@ -2217,9 +2221,6 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
22172221

22182222
copied += bytes_read;
22192223

2220-
/* be sure to advertise window change */
2221-
mptcp_cleanup_rbuf(msk);
2222-
22232224
if (skb_queue_empty(&msk->receive_queue) && __mptcp_move_skbs(msk))
22242225
continue;
22252226

@@ -2268,15 +2269,15 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
22682269
}
22692270

22702271
pr_debug("block timeout %ld\n", timeo);
2271-
mptcp_rcv_space_adjust(msk, copied);
2272+
mptcp_cleanup_rbuf(msk, copied);
22722273
err = sk_wait_data(sk, &timeo, NULL);
22732274
if (err < 0) {
22742275
err = copied ? : err;
22752276
goto out_err;
22762277
}
22772278
}
22782279

2279-
mptcp_rcv_space_adjust(msk, copied);
2280+
mptcp_cleanup_rbuf(msk, copied);
22802281

22812282
out_err:
22822283
if (cmsg_flags && copied >= 0) {

0 commit comments

Comments
 (0)