Skip to content

RFC udp: full early demux for unconnected sockets

Paolo Abeni netdev 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 RFC Latest11 patches 2 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/11net: add support for noref skb->skinclude/linux/skbuff.h net/core/sock.c+38 -00 replies
2/11net: allow early demux to fetch noref socketnet/ipv4/ip_input.c net/ipv4/netfilter/nf_dup_ipv4.c net/ipv6/ip6_input.c +2 more+21 -00 replies
3/11udp: do not touch socket refcount in early demuxnet/ipv4/udp.c net/ipv6/udp.c+16 -120 replies
4/11net: add simple socket-like dst cache helpersinclude/net/dst.h net/core/dst.c+32 -00 replies
5/11udp: perform full socket lookup in early demuxinclude/linux/udp.h net/ipv4/udp.c net/ipv6/udp.c+38 -830 replies
6/11ip/route: factor out helper for local route creationinclude/net/route.h net/ipv4/route.c+24 -80 replies
7/11ipv6/addrconf: add an helper for inet6 address lookupnet/ipv6/addrconf.c+31 -340 replies
8/11net: implement local route cache inside ifaddrinclude/linux/inetdevice.h include/net/addrconf.h include/net/if_inet6.h +2 more+83 -10 replies
9/11route: add ipv4/6 helpers to do partial route lookup vs local dstinclude/net/ip6_route.h include/net/route.h net/ipv4/route.c +1 more+59 -00 replies
10/11IP: early demux can return an error codeinclude/net/protocol.h include/net/tcp.h include/net/udp.h +3 more+30 -230 replies
11/11udp: dst lookup in early demux for unconnected socketsnet/ipv4/udp.c net/ipv6/udp.c+16 -30 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [RFC PATCH 00/11] udp: full early demux for unconnected sockets

This series refactor the UDP early demux code so that:

* full socket lookup is performed for unicast packets
* a sk is grabbed even for unconnected socket match
* a dst cache is used even in such scenario

To perform this tasks a couple of facilities are added:

* noref socket references, scoped inside the current RCU section, to be explicitly cleared before leaving such section
* a dst cache inside the inet and inet6 local addresses tables, caching the related local dst entry

The measured performance gain under small packet UDP flood is as follow:

ingress NIC vanilla patched delta
rx queues (kpps) (kpps) (%)
[ipv4]
1 2177 2414 10
2 2527 2892 14
3 3050 3733 22
4 3918 4643 18
5 5074 5699 12
6 5654 6869 21

[ipv6]
1 2002 2821 40
2 2087 3148 50
3 2583 4008 55
4 3072 4963 61
5 3719 5992 61
6 4314 6910 60

The number of user space process in use is equal to the number of NIC rx queue; when multiple user space processes the SO_REUSEPORT options is used, as described below:

ethtool -L em2 combined $n
MASK=1
for I in seq 0 $((n - 1)); do

        udp_sink  --reuse-port --recvfrom --count 1000000000 --port 9 $1 &
        taskset -p $((MASK << ($I + $n) )) $!

done

Paolo Abeni (11):
net: add support for noref skb->sk
net: allow early demux to fetch noref socket
udp: do not touch socket refcount in early demux
net: add simple socket-like dst cache helpers
udp: perform full socket lookup in early demux ip/route: factor out helper for local route creation ipv6/addrconf: add an helper for inet6 address lookup
net: implement local route cache inside ifaddr
route: add ipv4/6 helpers to do partial route lookup vs local dst
IP: early demux can return an error code
udp: dst lookup in early demux for unconnected sockets

 include/linux/inetdevice.h       |   4 ++
 include/linux/skbuff.h           |  31 +++++++++++
 include/linux/udp.h              |   2 +
 include/net/addrconf.h           |   3 ++
 include/net/dst.h                |  20 +++++++
 include/net/if_inet6.h           |   4 ++
 include/net/ip6_route.h          |   1 +
 include/net/protocol.h           |   4 +-
 include/net/route.h              |   4 ++
 include/net/tcp.h                |   2 +-
 include/net/udp.h                |   2 +-
 net/core/dst.c                   |  12 +++++
 net/core/sock.c                  |   7 +++
 net/ipv4/devinet.c               |  29 ++++++++++-
 net/ipv4/ip_input.c              |  33 ++++++++----
 net/ipv4/netfilter/nf_dup_ipv4.c |   3 ++
 net/ipv4/route.c                 |  73 +++++++++++++++++++++++---
 net/ipv4/tcp_ipv4.c              |   9 ++--
 net/ipv4/udp.c                   |  95 +++++++++++++++-------------------
 net/ipv6/addrconf.c              | 109 +++++++++++++++++++++++++++------------
 net/ipv6/ip6_input.c             |   4 ++
 net/ipv6/netfilter/nf_dup_ipv6.c |   3 ++
 net/ipv6/route.c                 |  13 +++++
 net/ipv6/udp.c                   |  72 ++++++++++----------------
 net/netfilter/nf_queue.c         |   3 ++
 25 files changed, 383 insertions(+), 159 deletions(-)
Signature · 1 line
2.13.5