selftests/net: synchronize udpgro tests' tx and rx connection
authorLucas Karpinski <lkarpins@redhat.com>
Tue, 14 Nov 2023 15:11:31 +0000 (10:11 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Nov 2023 22:31:56 +0000 (22:31 +0000)
The sockets used by udpgso_bench_tx aren't always ready when
udpgso_bench_tx transmits packets. This issue is more prevalent in -rt
kernels, but can occur in both. Replace the hacky sleep calls with a
function that checks whether the ports in the namespace are ready for
use.

Suggested-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Lucas Karpinski <lkarpins@redhat.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/net_helper.sh [new file with mode: 0755]
tools/testing/selftests/net/udpgro.sh
tools/testing/selftests/net/udpgro_bench.sh
tools/testing/selftests/net/udpgro_frglist.sh

diff --git a/tools/testing/selftests/net/net_helper.sh b/tools/testing/selftests/net/net_helper.sh
new file mode 100755 (executable)
index 0000000..4fe0bef
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# Helper functions
+
+wait_local_port_listen()
+{
+       local listener_ns="${1}"
+       local port="${2}"
+       local protocol="${3}"
+       local port_hex
+       local i
+
+       port_hex="$(printf "%04X" "${port}")"
+       for i in $(seq 10); do
+               if ip netns exec "${listener_ns}" cat /proc/net/"${protocol}"* | \
+                  grep -q "${port_hex}"; then
+                       break
+               fi
+               sleep 0.1
+       done
+}
index 0c743752669af704b8aaf4d2f02faccefae5d10f..af5dc57c8ce935907fd93279077c0d326205415e 100755 (executable)
@@ -3,6 +3,8 @@
 #
 # Run a series of udpgro functional tests.
 
+source net_helper.sh
+
 readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)"
 
 BPF_FILE="../bpf/xdp_dummy.bpf.o"
@@ -51,8 +53,7 @@ run_one() {
                echo "ok" || \
                echo "failed" &
 
-       # Hack: let bg programs complete the startup
-       sleep 0.2
+       wait_local_port_listen ${PEER_NS} 8000 udp
        ./udpgso_bench_tx ${tx_args}
        ret=$?
        wait $(jobs -p)
@@ -97,7 +98,7 @@ run_one_nat() {
                echo "ok" || \
                echo "failed"&
 
-       sleep 0.1
+       wait_local_port_listen "${PEER_NS}" 8000 udp
        ./udpgso_bench_tx ${tx_args}
        ret=$?
        kill -INT $pid
@@ -118,11 +119,9 @@ run_one_2sock() {
                echo "ok" || \
                echo "failed" &
 
-       # Hack: let bg programs complete the startup
-       sleep 0.2
+       wait_local_port_listen "${PEER_NS}" 12345 udp
        ./udpgso_bench_tx ${tx_args} -p 12345
-       sleep 0.1
-       # first UDP GSO socket should be closed at this point
+       wait_local_port_listen "${PEER_NS}" 8000 udp
        ./udpgso_bench_tx ${tx_args}
        ret=$?
        wait $(jobs -p)
index 894972877e8b0a445c29fc57ff5469af413241f3..cb664679b4342992a16694a182c7d0b3a7e9d80b 100755 (executable)
@@ -3,6 +3,8 @@
 #
 # Run a series of udpgro benchmarks
 
+source net_helper.sh
+
 readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)"
 
 BPF_FILE="../bpf/xdp_dummy.bpf.o"
@@ -40,8 +42,7 @@ run_one() {
        ip netns exec "${PEER_NS}" ./udpgso_bench_rx ${rx_args} -r &
        ip netns exec "${PEER_NS}" ./udpgso_bench_rx -t ${rx_args} -r &
 
-       # Hack: let bg programs complete the startup
-       sleep 0.2
+       wait_local_port_listen "${PEER_NS}" 8000 udp
        ./udpgso_bench_tx ${tx_args}
 }
 
index 0a6359bed0b926b24edc338dd6d56146df23ef68..dd47fa96f6b3e5ea1cf1f750a4fd55d7a0c4592b 100755 (executable)
@@ -3,6 +3,8 @@
 #
 # Run a series of udpgro benchmarks
 
+source net_helper.sh
+
 readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)"
 
 BPF_FILE="../bpf/xdp_dummy.bpf.o"
@@ -45,8 +47,7 @@ run_one() {
         echo ${rx_args}
        ip netns exec "${PEER_NS}" ./udpgso_bench_rx ${rx_args} -r &
 
-       # Hack: let bg programs complete the startup
-       sleep 0.2
+       wait_local_port_listen "${PEER_NS}" 8000 udp
        ./udpgso_bench_tx ${tx_args}
 }