]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: schedule rtx timer only after pushing data
authorPaolo Abeni <pabeni@redhat.com>
Fri, 5 Dec 2025 18:55:16 +0000 (19:55 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 9 Dec 2025 07:54:03 +0000 (23:54 -0800)
The MPTCP protocol usually schedule the retransmission timer only
when there is some chances for such retransmissions to happen.

With a notable exception: __mptcp_push_pending() currently schedule
such timer unconditionally, potentially leading to unnecessary rtx
timer expiration.

The issue is present since the blamed commit below but become easily
reproducible after commit 27b0e701d387 ("mptcp: drop bogus optimization
in __mptcp_check_push()")

Fixes: 33d41c9cd74c ("mptcp: more accurate timeout")
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20251205-net-mptcp-misc-fixes-6-19-rc1-v1-3-9e4781a6c1b8@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/protocol.c

index e212c1374bd043d7497951b49950b289cb1639f3..d8a7f7029164559cf6583a98038d9660642ee3e1 100644 (file)
@@ -1623,7 +1623,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
        struct mptcp_sendmsg_info info = {
                                .flags = flags,
        };
-       bool do_check_data_fin = false;
+       bool copied = false;
        int push_count = 1;
 
        while (mptcp_send_head(sk) && (push_count > 0)) {
@@ -1665,7 +1665,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
                                                push_count--;
                                        continue;
                                }
-                               do_check_data_fin = true;
+                               copied = true;
                        }
                }
        }
@@ -1674,11 +1674,14 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
        if (ssk)
                mptcp_push_release(ssk, &info);
 
-       /* ensure the rtx timer is running */
-       if (!mptcp_rtx_timer_pending(sk))
-               mptcp_reset_rtx_timer(sk);
-       if (do_check_data_fin)
+       /* Avoid scheduling the rtx timer if no data has been pushed; the timer
+        * will be updated on positive acks by __mptcp_cleanup_una().
+        */
+       if (copied) {
+               if (!mptcp_rtx_timer_pending(sk))
+                       mptcp_reset_rtx_timer(sk);
                mptcp_check_send_data_fin(sk);
+       }
 }
 
 static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first)