• Eric Dumazet's avatar
    tcp: limit GSO packets to half cwnd · d649a7a8
    Eric Dumazet authored
    In DC world, GSO packets initially cooked by tcp_sendmsg() are usually
    big, as sk_pacing_rate is high.
    
    When network is congested, cwnd can be smaller than the GSO packets
    found in socket write queue. tcp_write_xmit() splits GSO packets
    using the available cwnd, and we end up sending a single GSO packet,
    consuming all available cwnd.
    
    With GRO aggregation on the receiver, we might handle a single GRO
    packet, sending back a single ACK.
    
    1) This single ACK might be lost
       TLP or RTO are forced to attempt a retransmit.
    2) This ACK releases a full cwnd, sender sends another big GSO packet,
       in a ping pong mode.
    
    This behavior does not fill the pipes in the best way, because of
    scheduling artifacts.
    
    Make sure we always have at least two GSO packets in flight.
    
    This allows us to safely increase GRO efficiency without risking
    spurious retransmits.
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    d649a7a8
tcp_output.c 96.9 KB