• E
    tcp: add tcp_add_backlog() · c9c33212
    Eric Dumazet 提交于
    When TCP operates in lossy environments (between 1 and 10 % packet
    losses), many SACK blocks can be exchanged, and I noticed we could
    drop them on busy senders, if these SACK blocks have to be queued
    into the socket backlog.
    
    While the main cause is the poor performance of RACK/SACK processing,
    we can try to avoid these drops of valuable information that can lead to
    spurious timeouts and retransmits.
    
    Cause of the drops is the skb->truesize overestimation caused by :
    
    - drivers allocating ~2048 (or more) bytes as a fragment to hold an
      Ethernet frame.
    
    - various pskb_may_pull() calls bringing the headers into skb->head
      might have pulled all the frame content, but skb->truesize could
      not be lowered, as the stack has no idea of each fragment truesize.
    
    The backlog drops are also more visible on bidirectional flows, since
    their sk_rmem_alloc can be quite big.
    
    Let's add some room for the backlog, as only the socket owner
    can selectively take action to lower memory needs, like collapsing
    receive queues or partial ofo pruning.
    Signed-off-by: NEric Dumazet <edumazet@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Acked-by: NNeal Cardwell <ncardwell@google.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    c9c33212
tcp_ipv4.c 62.7 KB