• Joanne Koong's avatar
    net: Add a second bind table hashed by port and address · d5a42de8
    Joanne Koong authored
    We currently have one tcp bind table (bhash) which hashes by port
    number only. In the socket bind path, we check for bind conflicts by
    traversing the specified port's inet_bind2_bucket while holding the
    bucket's spinlock (see inet_csk_get_port() and inet_csk_bind_conflict()).
    
    In instances where there are tons of sockets hashed to the same port
    at different addresses, checking for a bind conflict is time-intensive
    and can cause softirq cpu lockups, as well as stops new tcp connections
    since __inet_inherit_port() also contests for the spinlock.
    
    This patch proposes adding a second bind table, bhash2, that hashes by
    port and ip address. Searching the bhash2 table leads to significantly
    faster conflict resolution and less time holding the spinlock.
    Signed-off-by: default avatarJoanne Koong <joannelkoong@gmail.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarKuniyuki Iwashima <kuniyu@amazon.co.jp>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d5a42de8
tcp.c 123 KB