• Eric Dumazet's avatar
    tcp_bbr: better deal with suboptimal GSO · 350c9f48
    Eric Dumazet authored
    BBR uses tcp_tso_autosize() in an attempt to probe what would be the
    burst sizes and to adjust cwnd in bbr_target_cwnd() with following
    gold formula :
    
    /* Allow enough full-sized skbs in flight to utilize end systems. */
    cwnd += 3 * bbr->tso_segs_goal;
    
    But GSO can be lacking or be constrained to very small
    units (ip link set dev ... gso_max_segs 2)
    
    What we really want is to have enough packets in flight so that both
    GSO and GRO are efficient.
    
    So in the case GSO is off or downgraded, we still want to have the same
    number of packets in flight as if GSO/TSO was fully operational, so
    that GRO can hopefully be working efficiently.
    
    To fix this issue, we make tcp_tso_autosize() unaware of
    sk->sk_gso_max_segs
    
    Only tcp_tso_segs() has to enforce the gso_max_segs limit.
    
    Tested:
    
    ethtool -K eth0 tso off gso off
    tc qd replace dev eth0 root pfifo_fast
    
    Before patch:
    for f in {1..5}; do ./super_netperf 1 -H lpaa24 -- -K bbr; done
        691  (ss -temoi shows cwnd is stuck around 6 )
        667
        651
        631
        517
    
    After patch :
    # for f in {1..5}; do ./super_netperf 1 -H lpaa24 -- -K bbr; done
       1733 (ss -temoi shows cwnd is around 386 )
       1778
       1746
       1781
       1718
    
    Fixes: 0f8782ea ("tcp_bbr: add BBR congestion control")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Reported-by: default avatarOleksandr Natalenko <oleksandr@natalenko.name>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    350c9f48
tcp_output.c 109 KB