• Eric Dumazet's avatar
    tcp: fix slow start after idle vs TSO/GSO · 6f021c62
    Eric Dumazet authored
    slow start after idle might reduce cwnd, but we perform this
    after first packet was cooked and sent.
    
    With TSO/GSO, it means that we might send a full TSO packet
    even if cwnd should have been reduced to IW10.
    
    Moving the SSAI check in skb_entail() makes sense, because
    we slightly reduce number of times this check is done,
    especially for large send() and TCP Small queue callbacks from
    softirq context.
    
    As Neal pointed out, we also need to perform the check
    if/when receive window opens.
    
    Tested:
    
    Following packetdrill test demonstrates the problem
    // Test of slow start after idle
    
    `sysctl -q net.ipv4.tcp_slow_start_after_idle=1`
    
    0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
    +0    setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
    +0    bind(3, ..., ...) = 0
    +0    listen(3, 1) = 0
    
    +0    < S 0:0(0) win 65535 <mss 1000,sackOK,nop,nop,nop,wscale 7>
    +0    > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 6>
    +.100 < . 1:1(0) ack 1 win 511
    +0    accept(3, ..., ...) = 4
    +0    setsockopt(4, SOL_SOCKET, SO_SNDBUF, [200000], 4) = 0
    
    +0    write(4, ..., 26000) = 26000
    +0    > . 1:5001(5000) ack 1
    +0    > . 5001:10001(5000) ack 1
    +0    %{ assert tcpi_snd_cwnd == 10 }%
    
    +.100 < . 1:1(0) ack 10001 win 511
    +0    %{ assert tcpi_snd_cwnd == 20, tcpi_snd_cwnd }%
    +0    > . 10001:20001(10000) ack 1
    +0    > P. 20001:26001(6000) ack 1
    
    +.100 < . 1:1(0) ack 26001 win 511
    +0    %{ assert tcpi_snd_cwnd == 36, tcpi_snd_cwnd }%
    
    +4 write(4, ..., 20000) = 20000
    // If slow start after idle works properly, we should send 5 MSS here (cwnd/2)
    +0    > . 26001:31001(5000) ack 1
    +0    %{ assert tcpi_snd_cwnd == 10, tcpi_snd_cwnd }%
    +0    > . 31001:36001(5000) ack 1
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6f021c62
tcp.h 53.1 KB