udp: ipv4: Add udp early demux
authorShawn Bohrer <sbohrer@rgmadvisors.com>
Mon, 7 Oct 2013 16:01:39 +0000 (11:01 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Oct 2013 20:27:33 +0000 (16:27 -0400)
commit421b3885bf6d56391297844f43fb7154a6396e12
tree01b118c57d33da0e19be3ebaa5d4263025b86994
parent005ec9743394010cd37d86c3fd2e81978231cdbf
udp: ipv4: Add udp early demux

The removal of the routing cache introduced a performance regression for
some UDP workloads since a dst lookup must be done for each packet.
This change caches the dst per socket in a similar manner to what we do
for TCP by implementing early_demux.

For UDP multicast we can only cache the dst if there is only one
receiving socket on the host.  Since caching only works when there is
one receiving socket we do the multicast socket lookup using RCU.

For UDP unicast we only demux sockets with an exact match in order to
not break forwarding setups.  Additionally since the hash chains may be
long we only check the first socket to see if it is a match and not
waste extra time searching the whole chain when we might not find an
exact match.

Benchmark results from a netperf UDP_RR test:
Before 87961.22 transactions/s
After  89789.68 transactions/s

Benchmark results from a fio 1 byte UDP multicast pingpong test
(Multicast one way unicast response):
Before 12.97us RTT
After  12.63us RTT

Signed-off-by: Shawn Bohrer <sbohrer@rgmadvisors.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sock.h
include/net/udp.h
net/ipv4/af_inet.c
net/ipv4/udp.c