net: rfs: add hash collision detection
Receive Flow Steering is a nice solution but suffers from hash collisions when a mix of connected and unconnected traffic is received on the host, when flow hash table is populated. Also, clearing flow in inet_release() makes RFS not very good for short lived flows, as many packets can follow close(). (FIN , ACK packets, ...) This patch extends the information stored into global hash table to not only include cpu number, but upper part of the hash value. I use a 32bit value, and dynamically split it in two parts. For host with less than 64 possible cpus, this gives 6 bits for the cpu number, and 26 (32-6) bits for the upper part of the hash. Since hash bucket selection use low order bits of the hash, we have a full hash match, if /proc/sys/net/core/rps_sock_flow_entries is big enough. If the hash found in flow table does not match, we fallback to RPS (if it is enabled for the rxqueue). This means that a packet for an non connected flow can avoid the IPI through a unrelated/victim CPU. This also means we no longer have to clear the table at socket close time, and this helps short lived flows performance. Signed-off-by:Eric Dumazet <edumazet@google.com> Acked-by:
Tom Herbert <therbert@google.com> Signed-off-by:
David S. Miller <davem@davemloft.net>
Showing
- drivers/net/tun.c 1 addition, 4 deletionsdrivers/net/tun.c
- include/linux/netdevice.h 17 additions, 17 deletionsinclude/linux/netdevice.h
- include/net/sock.h 1 addition, 23 deletionsinclude/net/sock.h
- net/core/dev.c 27 additions, 21 deletionsnet/core/dev.c
- net/core/sysctl_net_core.c 1 addition, 1 deletionnet/core/sysctl_net_core.c
- net/ipv4/af_inet.c 0 additions, 2 deletionsnet/ipv4/af_inet.c
Loading
Please register or sign in to comment