]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests: drv-net: gro: increase the rcvbuf size
authorJakub Kicinski <kuba@kernel.org>
Wed, 7 Jan 2026 23:25:57 +0000 (15:25 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 10 Jan 2026 01:34:30 +0000 (17:34 -0800)
The gro.py test (testing software GRO) is slightly flaky when
running against fbnic. We see one flake per roughly 20 runs in NIPA,
mostly in ipip.large, and always including some EAGAIN:

  # Shouldn't coalesce if exceed IP max pkt size: Test succeeded
  # Expected {65475 899 }, Total 2 packets
  # Received {65475 899 }, Total 2 packets.
  # Expected {64576 900 900 }, Total 3 packets
  # Received {64576 /home/virtme/testing/wt-24/tools/testing/selftests/drivers/net/gro: could not receive: Resource temporarily unavailable

The test sends 2 large frames (64k + change). Looks like the default
packet socket rcvbuf (~200kB) may not be large enough to hold them.
Bump the rcvbuf to 1MB.

Add a debug print showing socket statistics to make debugging this
issue easier in the future. Without the rcvbuf increase we see:

  # Shouldn't coalesce if exceed IP max pkt size: Test succeeded
  # Expected {65475 899 }, Total 2 packets
  # Received {65475 899 }, Total 2 packets.
  # Expected {64576 900 900 }, Total 3 packets
  # Received {64576 Socket stats: packets=7, drops=3
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # /home/virtme/testing/wt-24/tools/testing/selftests/drivers/net/gro: could not receive: Resource temporarily unavailable

Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20260107232557.2147760-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/drivers/net/gro.c

index e894037d2e3ea9469d65dfc67caae8d57ceae959..751a8103f408ec3452b3930257d9f329e76873e3 100644 (file)
@@ -926,6 +926,28 @@ static void set_timeout(int fd)
                error(1, errno, "cannot set timeout, setsockopt failed");
 }
 
+static void set_rcvbuf(int fd)
+{
+       int bufsize = 1 * 1024 * 1024; /* 1 MB */
+
+       if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)))
+               error(1, errno, "cannot set rcvbuf size, setsockopt failed");
+}
+
+static void recv_error(int fd, int rcv_errno)
+{
+       struct tpacket_stats stats;
+       socklen_t len;
+
+       len = sizeof(stats);
+       if (getsockopt(fd, SOL_PACKET, PACKET_STATISTICS, &stats, &len))
+               error(1, errno, "can't get stats");
+
+       fprintf(stderr, "Socket stats: packets=%u, drops=%u\n",
+               stats.tp_packets, stats.tp_drops);
+       error(1, rcv_errno, "could not receive");
+}
+
 static void check_recv_pkts(int fd, int *correct_payload,
                            int correct_num_pkts)
 {
@@ -950,7 +972,7 @@ static void check_recv_pkts(int fd, int *correct_payload,
                ip_ext_len = 0;
                pkt_size = recv(fd, buffer, IP_MAXPACKET + ETH_HLEN + 1, 0);
                if (pkt_size < 0)
-                       error(1, errno, "could not receive");
+                       recv_error(fd, errno);
 
                if (iph->version == 4)
                        ip_ext_len = (iph->ihl - 5) * 4;
@@ -1126,6 +1148,7 @@ static void gro_receiver(void)
                error(1, 0, "socket creation");
        setup_sock_filter(rxfd);
        set_timeout(rxfd);
+       set_rcvbuf(rxfd);
        bind_packetsocket(rxfd);
 
        ksft_ready();