Eric Dumazet 567e4b7973 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>
2015-02-08 16:53:57 -08:00
..
2015-01-18 00:28:41 -05:00
2015-01-23 14:08:13 -08:00
2014-12-14 16:10:09 -08:00
2014-12-14 16:10:09 -08:00
2014-12-14 16:10:09 -08:00
2014-12-14 16:43:47 -08:00
2014-12-14 16:10:09 -08:00
2014-12-14 16:10:09 -08:00
2015-02-03 19:54:57 -08:00
2015-01-24 14:34:54 -08:00
2014-12-17 09:59:26 -08:00
2014-12-17 09:59:26 -08:00
2015-02-04 09:15:18 +01:00
2014-12-17 10:10:51 -08:00
2014-11-24 07:45:25 +01:00
2014-12-14 16:43:47 -08:00
2015-01-26 19:13:41 -08:00
2015-01-13 15:13:45 +02:00
2014-12-14 16:43:47 -08:00