Patch "tcp: adjust rcvq_space after updating scaling ratio" has been added to the 6.12-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    tcp: adjust rcvq_space after updating scaling ratio

to the 6.12-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     tcp-adjust-rcvq_space-after-updating-scaling-ratio.patch
and it can be found in the queue-6.12 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 3c0760d24dbaac751009183e1e63a1da8284df84
Author: Jakub Kicinski <kuba@xxxxxxxxxx>
Date:   Mon Feb 17 15:29:05 2025 -0800

    tcp: adjust rcvq_space after updating scaling ratio
    
    [ Upstream commit f5da7c45188eea71394bf445655cae2df88a7788 ]
    
    Since commit under Fixes we set the window clamp in accordance
    to newly measured rcvbuf scaling_ratio. If the scaling_ratio
    decreased significantly we may put ourselves in a situation
    where windows become smaller than rcvq_space, preventing
    tcp_rcv_space_adjust() from increasing rcvbuf.
    
    The significant decrease of scaling_ratio is far more likely
    since commit 697a6c8cec03 ("tcp: increase the default TCP scaling ratio"),
    which increased the "default" scaling ratio from ~30% to 50%.
    
    Hitting the bad condition depends a lot on TCP tuning, and
    drivers at play. One of Meta's workloads hits it reliably
    under following conditions:
     - default rcvbuf of 125k
     - sender MTU 1500, receiver MTU 5000
     - driver settles on scaling_ratio of 78 for the config above.
    Initial rcvq_space gets calculated as TCP_INIT_CWND * tp->advmss
    (10 * 5k = 50k). Once we find out the true scaling ratio and
    MSS we clamp the windows to 38k. Triggering the condition also
    depends on the message sequence of this workload. I can't repro
    the problem with simple iperf or TCP_RR-style tests.
    
    Fixes: a2cbb1603943 ("tcp: Update window clamping condition")
    Reviewed-by: Eric Dumazet <edumazet@xxxxxxxxxx>
    Reviewed-by: Neal Cardwell <ncardwell@xxxxxxxxxx>
    Link: https://patch.msgid.link/20250217232905.3162187-1-kuba@xxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 2d43b29da15e2..bb17add6e4a78 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -243,9 +243,15 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb)
 			do_div(val, skb->truesize);
 			tcp_sk(sk)->scaling_ratio = val ? val : 1;
 
-			if (old_ratio != tcp_sk(sk)->scaling_ratio)
-				WRITE_ONCE(tcp_sk(sk)->window_clamp,
-					   tcp_win_from_space(sk, sk->sk_rcvbuf));
+			if (old_ratio != tcp_sk(sk)->scaling_ratio) {
+				struct tcp_sock *tp = tcp_sk(sk);
+
+				val = tcp_win_from_space(sk, sk->sk_rcvbuf);
+				tcp_set_window_clamp(sk, val);
+
+				if (tp->window_clamp < tp->rcvq_space.space)
+					tp->rcvq_space.space = tp->window_clamp;
+			}
 		}
 		icsk->icsk_ack.rcv_mss = min_t(unsigned int, len,
 					       tcp_sk(sk)->advmss);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux