This patch set does two things: - Add GRO functions (gro_receive and gro_complete) to UDP sockets. - Implement "fast receive encapsulation".
Add GRO functions (gro_receive and gro_complete) to UDP sockets. In udp_gro_receive and udp_gro_complete a socket lookup is done instead of looking up the port number in udp_offloads. If a socket is found and there is are gro functions for it then those are called. This feature allows binding GRO functions to more than just a port number. Eventually, we will be able to use this technique to allow application defined GRO for an application protocol by attaching BPF porgrams to UDP sockets for doing GRO. Fast receive encapsulation allows encap_rcv to be called for a socket without taking the reference to the socket. The callee can assume it was called under rcu_read_lock, but must assume that no reference to the socket is held (so the socket structures should not be written to and pointer not saved). In order to implement these function, no socket reference lookup functions were added in ipv4/udp.c and ipv6/udp.c. Also, inet_iif and references to skb_dst() were changed to check that dst is set in skbuf before derefencing. In the GRO path there is now a UDP socket lookup performed before dst is set, to the get the device in that case we simply use skb->dev. Tested: Ran various combinations of VXLAN and GUE TCP_STREAM and TCP_RR tests. DId not see any regressions. perf shows a that the atomic opertions in taking a reference to UDP sockets in lookup is eliminated for encapsulation. Also ran plain UDP_RR. DId not see any regression there. Tom Herbert (9): net: Check skb_dst for NULL in inet_iif udp: Add noreference lookup functions net: Add fast receive encapsulation udp: Add GRO functions to UDP socket udp: Add socket based GRO and fast receive encap to tunnel config vxlan: change vxlan to use UDP socket GRO fou: change to use UDP socket GRO and fast rcv encap geneve: change to use UDP socket GRO udp: Remove udp_offloads drivers/net/geneve.c | 29 ++---- drivers/net/vxlan.c | 31 ++---- include/linux/netdevice.h | 17 ---- include/linux/udp.h | 13 ++- include/net/protocol.h | 3 - include/net/route.h | 7 +- include/net/udp.h | 19 +++- include/net/udp_tunnel.h | 8 ++ include/net/vxlan.h | 1 - net/ipv4/fou.c | 49 ++++------ net/ipv4/udp.c | 237 +++++++++++++++++++++++++++++----------------- net/ipv4/udp_offload.c | 113 ++++------------------ net/ipv4/udp_tunnel.c | 3 + net/ipv6/Makefile | 5 +- net/ipv6/af_inet6.c | 8 ++ net/ipv6/ip6_offload.c | 2 - net/ipv6/ip6_offload.h | 3 +- net/ipv6/udp.c | 166 +++++++++++++++++--------------- net/ipv6/udp_offload.c | 11 ++- 19 files changed, 360 insertions(+), 365 deletions(-) -- 2.8.0.rc2