From 1240de9e51201eaf7057f63b9ce5db15380cbbbe Mon Sep 17 00:00:00 2001 From: Haishuang Yan Date: Sun, 11 Oct 2026 18:20:22 +0800 Subject: [PATCH] bareudp: Enable BIG TCP packets Commit f3d0f753f066 ("vxlan: Enable BIG TCP packets") and commit 03ebe91b0f61 ("geneve: Enable BIG TCP packets") allowed BIG TCP on vxlan and geneve, after the preceding patches of that series made the common UDP tunnel transmit path handle GSO packets larger than 64KB. bareudp transmits through the same helpers, udp_tunnel_handle_offloads() followed by udp_tunnel_xmit_skb() or udp_tunnel6_xmit_skb(), and does not fill in any length field itself. Bump tso_max_size up to GSO_MAX_SIZE so that the admin can use BIG TCP with bareudp too. The default gso_max_size and gso_ipv4_max_size stay at 64KB, so nothing changes unless they are raised explicitly. iperf3 TCP over bareudp (ethertype ipv4, IPv4 outer) between two netns connected by veth, MTU 1600 on veth, 3 runs of 20 seconds each. This was measured in a QEMU TCG guest, so only the relative numbers are meaningful: gso_max_size/gso_ipv4_max_size 65536: 4380.6, 4404.2, 4354.5 Mbit/s, average 4379.8 Mbit/s gso_max_size/gso_ipv4_max_size 196608: 5509.4, 5454.7, 5497.4 Mbit/s, average 5487.2 Mbit/s (+25%) With 196608, about 90k to 100k packets larger than 64KB were transmitted on the bareudp device per run, none with 65536. Without this patch, setting gso_max_size to 196608 is rejected. Acked-by: Alice Mikityanska Signed-off-by: Haishuang Yan Reviewed-by: Simon Horman Link: https://patch.msgid.link/20261011102023.1603595-2-yanhaishuang@cmss.chinamobile.com Signed-off-by: Jakub Kicinski --- drivers/net/bareudp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c index b9fe54151e1a..48bcb619ef41 100644 --- a/drivers/net/bareudp.c +++ b/drivers/net/bareudp.c @@ -590,6 +590,7 @@ static void bareudp_setup(struct net_device *dev) dev->max_mtu = IP_MAX_MTU - BAREUDP_BASE_HLEN; dev->type = ARPHRD_NONE; netif_keep_dst(dev); + netif_set_tso_max_size(dev, GSO_MAX_SIZE); dev->priv_flags |= IFF_NO_QUEUE; dev->lltx = true; dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;