Skip to content

Commit

Permalink
selftests/net: allow GRO coalesce test on veth
Browse files Browse the repository at this point in the history
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.

v1 -> v2:
  - drop unused code in setup_veth_ns() - Willem

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Paolo Abeni authored and davem330 committed Aug 26, 2021
1 parent 8b325d2 commit 9af771d
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 37 deletions.
1 change: 1 addition & 0 deletions tools/testing/selftests/net/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
43 changes: 7 additions & 36 deletions tools/testing/selftests/net/gro.sh
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down
38 changes: 37 additions & 1 deletion tools/testing/selftests/net/setup_loopback.sh
Original file line number Diff line number Diff line change
@@ -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"

Expand All @@ -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
Expand Down Expand Up @@ -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}"
}
41 changes: 41 additions & 0 deletions tools/testing/selftests/net/setup_veth.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/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"

[[ -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

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
}

0 comments on commit 9af771d

Please sign in to comment.