Message ID | 2d9ca8df08aed8dcb8c56554225f8f71db621bbe.1629886126.git.pabeni@redhat.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] selftests/net: allow GRO coalesce test on veth | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | warning | 1 maintainers not CCed: linux-kselftest@vger.kernel.org |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | warning | WARNING: added, moved or deleted file(s), does MAINTAINERS need updating? WARNING: line length of 81 exceeds 80 columns |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
On Wed, Aug 25, 2021 at 6:25 AM Paolo Abeni <pabeni@redhat.com> wrote: > > This change extends the existing GRO coalesce test to > allow running on top of a veth pair, so that no H/W dep > is required to run them. > > By default gro.sh will use the veth backend, and will try > to use exiting H/W in loopback mode if a specific device > name is provided with the '-i' command line option. > > No functional change is intended for the loopback-based > tests, just move all the relevant initialization/cleanup > code into the related script. > > Introduces a new initialization helper script for the > veth backend, and plugs the correct helper script according > to the provided command line. > > Additionally, enable veth-based tests by default. Very nice. Thanks for extending the test to be run as part of continuous testing over veth, Paolo. > +setup_veth_ns() { > + local -r link_dev="$1" > + local -r ns_name="$2" > + local -r ns_dev="$3" > + local -r ns_mac="$4" > + local -r addr="$5" > + > + [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}" > + echo 100000 > "/sys/class/net/${ns_dev}/gro_flush_timeout" > + ip link set dev "${ns_dev}" netns "${ns_name}" mtu 65535 > + ip -netns "${ns_name}" link set dev "${ns_dev}" up > + if [[ -n "${addr}" ]]; then > + ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}" > + fi unused? setup_veth_ns is always called with four arguments. > + > + ip netns exec "${ns_name}" ethtool -K "${ns_dev}" gro on tso off > +} > + > +setup_ns() { > + # Set up server_ns namespace and client_ns namespace > + ip link add name server type veth peer name client > + > + setup_veth_ns "${dev}" server_ns server "${SERVER_MAC}" > + setup_veth_ns "${dev}" client_ns client "${CLIENT_MAC}" > +}
On Wed, 2021-08-25 at 12:17 -0400, Willem de Bruijn wrote: > On Wed, Aug 25, 2021 at 6:25 AM Paolo Abeni <pabeni@redhat.com> wrote: > > This change extends the existing GRO coalesce test to > > allow running on top of a veth pair, so that no H/W dep > > is required to run them. > > > > By default gro.sh will use the veth backend, and will try > > to use exiting H/W in loopback mode if a specific device > > name is provided with the '-i' command line option. > > > > No functional change is intended for the loopback-based > > tests, just move all the relevant initialization/cleanup > > code into the related script. > > > > Introduces a new initialization helper script for the > > veth backend, and plugs the correct helper script according > > to the provided command line. > > > > Additionally, enable veth-based tests by default. > > Very nice. Thanks for extending the test to be run as part of > continuous testing over veth, Paolo. > > > +setup_veth_ns() { > > + local -r link_dev="$1" > > + local -r ns_name="$2" > > + local -r ns_dev="$3" > > + local -r ns_mac="$4" > > + local -r addr="$5" > > + > > + [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}" > > + echo 100000 > "/sys/class/net/${ns_dev}/gro_flush_timeout" > > + ip link set dev "${ns_dev}" netns "${ns_name}" mtu 65535 > > + ip -netns "${ns_name}" link set dev "${ns_dev}" up > > + if [[ -n "${addr}" ]]; then > > + ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}" > > + fi > > unused? setup_veth_ns is always called with four arguments. yep. Too much C&P from esiting code :( I'll send a v2 after some more testing. Thanks! Paolo
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index 4f9f73e7a299..378c0aac5a1a 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -26,6 +26,7 @@ TEST_PROGS += unicast_extensions.sh TEST_PROGS += udpgro_fwd.sh TEST_PROGS += veth.sh TEST_PROGS += ioam6.sh +TEST_PROGS += gro.sh TEST_PROGS_EXTENDED := in_netns.sh TEST_GEN_FILES = socket nettest TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any diff --git a/tools/testing/selftests/net/gro.sh b/tools/testing/selftests/net/gro.sh index 794d2bf36dd7..342ad27f631b 100755 --- a/tools/testing/selftests/net/gro.sh +++ b/tools/testing/selftests/net/gro.sh @@ -1,45 +1,14 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 -source setup_loopback.sh readonly SERVER_MAC="aa:00:00:00:00:02" readonly CLIENT_MAC="aa:00:00:00:00:01" readonly TESTS=("data" "ack" "flags" "tcp" "ip" "large") readonly PROTOS=("ipv4" "ipv6") -dev="eth0" +dev="" test="all" proto="ipv4" -setup_interrupt() { - # Use timer on host to trigger the network stack - # Also disable device interrupt to not depend on NIC interrupt - # Reduce test flakiness caused by unexpected interrupts - echo 100000 >"${FLUSH_PATH}" - echo 50 >"${IRQ_PATH}" -} - -setup_ns() { - # Set up server_ns namespace and client_ns namespace - setup_macvlan_ns "${dev}" server_ns server "${SERVER_MAC}" - setup_macvlan_ns "${dev}" client_ns client "${CLIENT_MAC}" -} - -cleanup_ns() { - cleanup_macvlan_ns server_ns server client_ns client -} - -setup() { - setup_loopback_environment "${dev}" - setup_interrupt -} - -cleanup() { - cleanup_loopback "${dev}" - - echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}" - echo "${HARD_IRQS}" >"${IRQ_PATH}" -} - run_test() { local server_pid=0 local exit_code=0 @@ -115,10 +84,12 @@ while getopts "i:t:p:" opt; do esac done -readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout" -readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs" -readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})" -readonly HARD_IRQS="$(< ${IRQ_PATH})" +if [ -n "$dev" ]; then + source setup_loopback.sh +else + source setup_veth.sh +fi + setup trap cleanup EXIT if [[ "${test}" == "all" ]]; then diff --git a/tools/testing/selftests/net/setup_loopback.sh b/tools/testing/selftests/net/setup_loopback.sh index 0a8ad97b07ea..e57bbfbc5208 100755 --- a/tools/testing/selftests/net/setup_loopback.sh +++ b/tools/testing/selftests/net/setup_loopback.sh @@ -1,5 +1,11 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 + +readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout" +readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs" +readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})" +readonly HARD_IRQS="$(< ${IRQ_PATH})" + netdev_check_for_carrier() { local -r dev="$1" @@ -18,7 +24,7 @@ netdev_check_for_carrier() { # Assumes that there is no existing ipvlan device on the physical device setup_loopback_environment() { - local dev="$1" + local dev="$1" # Fail hard if cannot turn on loopback mode for current NIC ethtool -K "${dev}" loopback on || exit 1 @@ -80,3 +86,33 @@ cleanup_loopback(){ exit 1 fi } + +setup_interrupt() { + # Use timer on host to trigger the network stack + # Also disable device interrupt to not depend on NIC interrupt + # Reduce test flakiness caused by unexpected interrupts + echo 100000 >"${FLUSH_PATH}" + echo 50 >"${IRQ_PATH}" +} + +setup_ns() { + # Set up server_ns namespace and client_ns namespace + setup_macvlan_ns "${dev}" server_ns server "${SERVER_MAC}" + setup_macvlan_ns "${dev}" client_ns client "${CLIENT_MAC}" +} + +cleanup_ns() { + cleanup_macvlan_ns server_ns server client_ns client +} + +setup() { + setup_loopback_environment "${dev}" + setup_interrupt +} + +cleanup() { + cleanup_loopback "${dev}" + + echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}" + echo "${HARD_IRQS}" >"${IRQ_PATH}" +} diff --git a/tools/testing/selftests/net/setup_veth.sh b/tools/testing/selftests/net/setup_veth.sh new file mode 100644 index 000000000000..06cf102769ee --- /dev/null +++ b/tools/testing/selftests/net/setup_veth.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +setup_veth_ns() { + local -r link_dev="$1" + local -r ns_name="$2" + local -r ns_dev="$3" + local -r ns_mac="$4" + local -r addr="$5" + + [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}" + echo 100000 > "/sys/class/net/${ns_dev}/gro_flush_timeout" + ip link set dev "${ns_dev}" netns "${ns_name}" mtu 65535 + ip -netns "${ns_name}" link set dev "${ns_dev}" up + if [[ -n "${addr}" ]]; then + ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}" + fi + + ip netns exec "${ns_name}" ethtool -K "${ns_dev}" gro on tso off +} + +setup_ns() { + # Set up server_ns namespace and client_ns namespace + ip link add name server type veth peer name client + + setup_veth_ns "${dev}" server_ns server "${SERVER_MAC}" + setup_veth_ns "${dev}" client_ns client "${CLIENT_MAC}" +} + +cleanup_ns() { + local ns_name + + for ns_name in client_ns server_ns; do + [[ -e /var/run/netns/"${ns_name}" ]] && ip netns del "${ns_name}" + done +} + +setup() { + # no global init setup step needed + : +} + +cleanup() { + cleanup_ns +}
This change extends the existing GRO coalesce test to allow running on top of a veth pair, so that no H/W dep is required to run them. By default gro.sh will use the veth backend, and will try to use exiting H/W in loopback mode if a specific device name is provided with the '-i' command line option. No functional change is intended for the loopback-based tests, just move all the relevant initialization/cleanup code into the related script. Introduces a new initialization helper script for the veth backend, and plugs the correct helper script according to the provided command line. Additionally, enable veth-based tests by default. Signed-off-by: Paolo Abeni <pabeni@redhat.com> --- tools/testing/selftests/net/Makefile | 1 + tools/testing/selftests/net/gro.sh | 43 +++--------------- tools/testing/selftests/net/setup_loopback.sh | 38 +++++++++++++++- tools/testing/selftests/net/setup_veth.sh | 45 +++++++++++++++++++ 4 files changed, 90 insertions(+), 37 deletions(-) create mode 100644 tools/testing/selftests/net/setup_veth.sh