[PATCH net-next] net: avoid unneeded UDP L4 and fraglist GSO resegmentation

From: Alexander Lobakin
Date: Fri Oct 30 2020 - 14:33:19 EST


Commit 9fd1ff5d2ac7 ("udp: Support UDP fraglist GRO/GSO.") added a support
for fraglist UDP L4 and fraglist GSO not only for local traffic, but also
for forwarding. This works well on simple setups, but when any logical
netdev (e.g. VLAN) is present, kernel stack always performs software
resegmentation which actually kills the performance.
Despite the fact that no mainline drivers currently supports fraglist GSO,
this should and can be easily fixed by adding UDP L4 and fraglist GSO to
the list of GSO types that can be passed-through the logical interfaces
(NETIF_F_GSO_SOFTWARE). After this change, no resegmentation occurs (if
a particular driver supports and advertises this), and the performance
goes on par with e.g. 1:1 forwarding.
The only logical netdevs that seem to be unaffected to this are bridge
interfaces, as their code uses full NETIF_F_GSO_MASK.

Tested on MIPS32 R2 router board with a WIP NIC driver in VLAN NAT:
20 Mbps baseline, 1 Gbps / link speed with this patch.

Signed-off-by: Alexander Lobakin <alobakin@xxxxx>
---
include/linux/netdev_features.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index 0b17c4322b09..934de56644e7 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -207,8 +207,8 @@ static inline int find_next_netdev_feature(u64 feature, unsigned long start)
NETIF_F_FSO)

/* List of features with software fallbacks. */
-#define NETIF_F_GSO_SOFTWARE (NETIF_F_ALL_TSO | \
- NETIF_F_GSO_SCTP)
+#define NETIF_F_GSO_SOFTWARE (NETIF_F_ALL_TSO | NETIF_F_GSO_SCTP | \
+ NETIF_F_GSO_UDP_L4 | NETIF_F_GSO_FRAGLIST)

/*
* If one device supports one of these features, then enable them
--
2.29.2