Re: [PATCH net 1/2] udp: relocate a connected socket in the 4-tuple hash table on re-connect
From: Kuniyuki Iwashima
Date: Mon Sep 21 2026 - 21:10:11 EST
On Thu, Sep 17, 2026 at 2:26 AM Shardul Bankar
<shardul.b@xxxxxxxxxxxxxxxxxx> wrote:
>
> A connected UDP socket that connects again to a different peer is not
> re-filed in the 4-tuple hash table:
>
> sk binds to 127.0.0.1:21001
> sk connects to 127.0.0.2:20001 // filed under hash(sk, peer1)
> sk connects to 127.0.0.3:20002 // still filed under hash(sk, peer1)
> packet from 127.0.0.3:20002 // hash(sk, peer2) misses, so the
> // lookup falls back to scoring the
> // hash2 chain for this address
> // and port
>
> udp_lib_hash4() returns early when the socket is already hashed, assuming
> ->rehash() relocates it. ->rehash() runs from __ip{4,6}_datagram_connect()
> only while the receive address is unset, which a second connect never is:
> the first connect assigns it, whether the socket was bound to a specific
> address or to the wildcard. commit 644f9108f3a5 ("udp: Make rehash4
> independent in udp_lib_rehash()") added that early return and named
> connect(AF_UNSPEC) as the way around it. That workaround does not help a
> socket with both SOCK_BINDADDR_LOCK and SOCK_BINDPORT_LOCK set, because
> __udp_disconnect() skips ->rehash() for the first and ->unhash() for the
> second.
>
> Delivery is correct either way.
>
> Relocate the socket when the hash it is filed under differs from the one
> requested, which is what commit 78c91ae2c6de ("ipv4/udp: Add 4-tuple hash
> for connected socket") did before the early return became unconditional. It
> is done here under hslot->lock, which that version did not take, to match
> udp_lib_rehash() and udp_lib_unhash(). hslot2 is unchanged, so hash4_cnt
> needs no adjustment, as in udp_lib_rehash(). A first connect is unaffected,
> and IPv6 shares the code.
>
> With 500 sockets on the port, a re-connected socket measured 522,553 pps
> without this change and 2,055,078 with it. The UDP side was noted as
> remaining work in [1].
>
> Link: https://lore.kernel.org/netdev/apnHqmYZQ4yzOP4N@v4bel/ [1]
This link looks random to me.
> Fixes: 644f9108f3a5 ("udp: Make rehash4 independent in udp_lib_rehash()")
> Assisted-by: LLM
> Signed-off-by: Shardul Bankar <shardul.b@xxxxxxxxxxxxxxxxxx>
The change itself looks good.
Reviewed-by: Kuniyuki Iwashima <kuniyu@xxxxxxxxxx>