Commit 2ea6190f authored by Paolo Abeni's avatar Paolo Abeni Committed by Jakub Kicinski
Browse files

mptcp: schedule rtx timer only after pushing data



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 27b0e701 ("mptcp: drop bogus optimization
in __mptcp_check_push()")

Fixes: 33d41c9c ("mptcp: more accurate timeout")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Reviewed-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: default avatarMatthieu 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: default avatarJakub Kicinski <kuba@kernel.org>
parent 29f4801e
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -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,12 +1674,15 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
	if (ssk)
		mptcp_push_release(ssk, &info);

	/* ensure the rtx timer is running */
	/* 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);
	if (do_check_data_fin)
		mptcp_check_send_data_fin(sk);
	}
}

static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first)
{