tcp: always seek for minimal rtt in tcp_rcv_rtt_update()
[ Upstream commit b879dcb1aeeca278eacaac0b1e2425b1c7599f9f ] tcp_rcv_rtt_update() goal is to maintain an estimation of the RTT in tp->rcv_rtt_est.rtt_us, used by tcp_rcv_space_adjust() When TCP TS are enabled, tcp_rcv_rtt_update() is using EWMA to smooth the samples. Change this to immediately latch the incoming value if it is lower than tp->rcv_rtt_est.rtt_us, so that tcp_rcv_space_adjust() does not overshoot tp->rcvq_space.space and sk->sk_rcvbuf. Signed-off-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/20250513193919.1089692-8-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
969d61aa16
commit
156b6bac76
@@ -671,10 +671,12 @@ EXPORT_SYMBOL(tcp_initialize_rcv_mss);
|
|||||||
*/
|
*/
|
||||||
static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep)
|
static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep)
|
||||||
{
|
{
|
||||||
u32 new_sample = tp->rcv_rtt_est.rtt_us;
|
u32 new_sample, old_sample = tp->rcv_rtt_est.rtt_us;
|
||||||
long m = sample;
|
long m = sample << 3;
|
||||||
|
|
||||||
if (new_sample != 0) {
|
if (old_sample == 0 || m < old_sample) {
|
||||||
|
new_sample = m;
|
||||||
|
} else {
|
||||||
/* If we sample in larger samples in the non-timestamp
|
/* If we sample in larger samples in the non-timestamp
|
||||||
* case, we could grossly overestimate the RTT especially
|
* case, we could grossly overestimate the RTT especially
|
||||||
* with chatty applications or bulk transfer apps which
|
* with chatty applications or bulk transfer apps which
|
||||||
@@ -685,17 +687,9 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep)
|
|||||||
* else with timestamps disabled convergence takes too
|
* else with timestamps disabled convergence takes too
|
||||||
* long.
|
* long.
|
||||||
*/
|
*/
|
||||||
if (!win_dep) {
|
if (win_dep)
|
||||||
m -= (new_sample >> 3);
|
return;
|
||||||
new_sample += m;
|
new_sample = old_sample - (old_sample >> 3) + sample;
|
||||||
} else {
|
|
||||||
m <<= 3;
|
|
||||||
if (m < new_sample)
|
|
||||||
new_sample = m;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* No previous measure. */
|
|
||||||
new_sample = m << 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tp->rcv_rtt_est.rtt_us = new_sample;
|
tp->rcv_rtt_est.rtt_us = new_sample;
|
||||||
|
Reference in New Issue
Block a user