| From 449e6912a2522af672e99992e1201a454910864e Mon Sep 17 00:00:00 2001 |
| From: Paolo Abeni <pabeni@redhat.com> |
| Date: Mon, 30 Dec 2024 19:12:30 +0100 |
| Subject: mptcp: fix recvbuffer adjust on sleeping rcvmsg |
| |
| From: Paolo Abeni <pabeni@redhat.com> |
| |
| commit 449e6912a2522af672e99992e1201a454910864e upstream. |
| |
| If the recvmsg() blocks after receiving some data - i.e. due to |
| SO_RCVLOWAT - the MPTCP code will attempt multiple times to |
| adjust the receive buffer size, wrongly accounting every time the |
| cumulative of received data - instead of accounting only for the |
| delta. |
| |
| Address the issue moving mptcp_rcv_space_adjust just after the |
| data reception and passing it only the just received bytes. |
| |
| This also removes an unneeded difference between the TCP and MPTCP |
| RX code path implementation. |
| |
| Fixes: 581302298524 ("mptcp: error out earlier on disconnect") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Paolo Abeni <pabeni@redhat.com> |
| Reviewed-by: Mat Martineau <martineau@kernel.org> |
| Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> |
| Link: https://patch.msgid.link/20241230-net-mptcp-rbuf-fixes-v1-1-8608af434ceb@kernel.org |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/mptcp/protocol.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/net/mptcp/protocol.c |
| +++ b/net/mptcp/protocol.c |
| @@ -1917,6 +1917,8 @@ do_error: |
| goto out; |
| } |
| |
| +static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied); |
| + |
| static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk, |
| struct msghdr *msg, |
| size_t len, int flags, |
| @@ -1968,6 +1970,7 @@ static int __mptcp_recvmsg_mskq(struct m |
| break; |
| } |
| |
| + mptcp_rcv_space_adjust(msk, copied); |
| return copied; |
| } |
| |
| @@ -2246,7 +2249,6 @@ static int mptcp_recvmsg(struct sock *sk |
| } |
| |
| pr_debug("block timeout %ld\n", timeo); |
| - mptcp_rcv_space_adjust(msk, copied); |
| err = sk_wait_data(sk, &timeo, NULL); |
| if (err < 0) { |
| err = copied ? : err; |
| @@ -2254,8 +2256,6 @@ static int mptcp_recvmsg(struct sock *sk |
| } |
| } |
| |
| - mptcp_rcv_space_adjust(msk, copied); |
| - |
| out_err: |
| if (cmsg_flags && copied >= 0) { |
| if (cmsg_flags & MPTCP_CMSG_TS) |