• Stewart Smith's avatar
    tcp: Reduce chance of collisions in inet6_hashfn(). · d11b0df7
    Stewart Smith authored
    For both IPv4 and IPv6 incoming TCP connections are tracked in a hash
    table with a hash over the source & destination addresses and ports.
    However, the IPv6 hash is insufficient and can lead to a high rate of
    collisions.
    
    The IPv6 hash used an XOR to fit everything into the 96 bits for the
    fast jenkins hash, meaning it is possible for an external entity to
    ensure the hash collides, thus falling back to a linear search in the
    bucket, which is slow.
    
    We take the approach of hash the full length of IPv6 address in
    __ipv6_addr_jhash() so that all users can benefit from a more secure
    version.
    
    While this may look like it adds overhead, the reality of modern CPUs
    means that this is unmeasurable in real world scenarios.
    
    In simulating with llvm-mca, the increase in cycles for the hashing
    code was ~16 cycles on Skylake (from a base of ~155), and an extra ~9
    on Nehalem (base of ~173).
    
    In commit dd6d2910 ("netfilter: conntrack: switch to siphash")
    netfilter switched from a jenkins hash to a siphash, but even the faster
    hsiphash is a more significant overhead (~20-30%) in some preliminary
    testing.  So, in this patch, we keep to the more conservative approach to
    ensure we don't add much overhead per SYN.
    
    In testing, this results in a consistently even spread across the
    connection buckets.  In both testing and real-world scenarios, we have
    not found any measurable performance impact.
    
    Fixes: 08dcdbf6 ("ipv6: use a stronger hash for tcp")
    Signed-off-by: default avatarStewart Smith <trawets@amazon.com>
    Signed-off-by: default avatarSamuel Mendoza-Jonas <samjonas@amazon.com>
    Suggested-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20230721222410.17914-1-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d11b0df7
ipv6.h 37.8 KB