• Kuniyuki Iwashima's avatar
    tcp: Disable header prediction for MD5 flow. · d0f2b7a9
    Kuniyuki Iwashima authored
    TCP socket saves the minimum required header length in tcp_header_len
    of struct tcp_sock, and later the value is used in __tcp_fast_path_on()
    to generate a part of TCP header in tcp_sock(sk)->pred_flags.
    
    In tcp_rcv_established(), if the incoming packet has the same pattern
    with pred_flags, we enter the fast path and skip full option parsing.
    
    The MD5 option is parsed in tcp_v[46]_rcv(), so we need not parse it
    again later in tcp_rcv_established() unless other options exist.  We
    add TCPOLEN_MD5SIG_ALIGNED to tcp_header_len in two paths to avoid the
    slow path.
    
    For passive open connections with MD5, we add TCPOLEN_MD5SIG_ALIGNED
    to tcp_header_len in tcp_create_openreq_child() after 3WHS.
    
    On the other hand, we do it in tcp_connect_init() for active open
    connections.  However, the value is overwritten while processing
    SYN+ACK or crossed SYN in tcp_rcv_synsent_state_process().
    
    These two cases will have the wrong value in pred_flags and never go
    into the fast path.
    
    We could update tcp_header_len in tcp_rcv_synsent_state_process(), but
    a test with slightly modified netperf which uses MD5 for each flow shows
    that the slow path is actually a bit faster than the fast path.
    
      On c5.4xlarge EC2 instance (16 vCPU, 32 GiB mem)
    
      $ for i in {1..10}; do
      ./super_netperf $(nproc) -H localhost -l 10 -- -m 256 -M 256;
      done
    
      Avg of 10
      * 36e68ead  : 10.376 Gbps
      * all fast path : 10.374 Gbps (patch v2, See Link)
      * all slow path : 10.394 Gbps
    
    The header prediction is not worth adding complexity for MD5, so let's
    disable it for MD5.
    
    Link: https://lore.kernel.org/netdev/20230803042214.38309-1-kuniyu@amazon.com/Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20230803224552.69398-2-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d0f2b7a9
tcp_output.c 123 KB