diff mbox series

[v4,net-next,8/8] selftests: forwarding: ethtool_rmon: Add histogram counter test

Message ID 20231214135029.383595-9-tobias@waldekranz.com (mailing list archive)
State Accepted
Commit 00e7f29d9b895cbee58b7071900dd52ed6dcec1e
Delegated to: Netdev Maintainers
Headers show
Series net: dsa: mv88e6xxx: Add "eth-mac" and "rmon" counter group support | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers warning 9 maintainers not CCed: razor@blackwall.org jnixdorf-oss@avm.de liuhangbin@gmail.com pabeni@redhat.com danieller@nvidia.com linux-kselftest@vger.kernel.org shuah@kernel.org petrm@nvidia.com edumazet@google.com
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success net selftest script(s) already in Makefile
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch warning WARNING: added, moved or deleted file(s), does MAINTAINERS need updating? WARNING: line length of 82 exceeds 80 columns WARNING: line length of 88 exceeds 80 columns WARNING: line length of 90 exceeds 80 columns WARNING: line length of 95 exceeds 80 columns
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Tobias Waldekranz Dec. 14, 2023, 1:50 p.m. UTC
Validate the operation of rx and tx histogram counters, if supported
by the interface, by sending batches of packets targeted for each
bucket.

Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
---
 .../testing/selftests/net/forwarding/Makefile |   1 +
 .../selftests/net/forwarding/ethtool_rmon.sh  | 143 ++++++++++++++++++
 tools/testing/selftests/net/forwarding/lib.sh |   9 ++
 3 files changed, 153 insertions(+)
 create mode 100755 tools/testing/selftests/net/forwarding/ethtool_rmon.sh

Comments

Vladimir Oltean Dec. 14, 2023, 2:12 p.m. UTC | #1
On Thu, Dec 14, 2023 at 02:50:29PM +0100, Tobias Waldekranz wrote:
> Validate the operation of rx and tx histogram counters, if supported
> by the interface, by sending batches of packets targeted for each
> bucket.
> 
> Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
> ---

Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>

# enetc + ocelot
./ethtool_rmon.sh eno0 swp0
TEST: rx-pkts64to64 on eno0                                         [ OK ]
TEST: rx-pkts65to127 on eno0                                        [ OK ]
TEST: rx-pkts128to255 on eno0                                       [ OK ]
TEST: rx-pkts256to511 on eno0                                       [ OK ]
TEST: rx-pkts512to1023 on eno0                                      [ OK ]
TEST: rx-pkts1024to1522 on eno0                                     [ OK ]
TEST: rx-pkts1523to9600 on eno0                                     [ OK ]
TEST: rx-pkts64to64 on swp0                                         [ OK ]
TEST: rx-pkts65to127 on swp0                                        [ OK ]
TEST: rx-pkts128to255 on swp0                                       [ OK ]
TEST: rx-pkts256to511 on swp0                                       [ OK ]
TEST: rx-pkts512to1023 on swp0                                      [ OK ]
TEST: rx-pkts1024to1526 on swp0                                     [ OK ]
TEST: rx-pkts1527to65535 on swp0                                    [ OK ]
TEST: tx-pkts64to64 on eno0                                         [ OK ]
TEST: tx-pkts65to127 on eno0                                        [ OK ]
TEST: tx-pkts128to255 on eno0                                       [ OK ]
TEST: tx-pkts256to511 on eno0                                       [ OK ]
TEST: tx-pkts512to1023 on eno0                                      [ OK ]
TEST: tx-pkts1024to1522 on eno0                                     [ OK ]
TEST: tx-pkts1523to9600 on eno0                                     [ OK ]
TEST: tx-pkts64to64 on swp0                                         [ OK ]
TEST: tx-pkts65to127 on swp0                                        [ OK ]
TEST: tx-pkts128to255 on swp0                                       [ OK ]
TEST: tx-pkts256to511 on swp0                                       [ OK ]
TEST: tx-pkts512to1023 on swp0                                      [ OK ]
TEST: tx-pkts1024to1526 on swp0                                     [ OK ]
TEST: tx-pkts1527to65535 on swp0                                    [ OK ]

# mv88e6xxx
./ethtool_rmon.sh lan1 lan2
TEST: rx-pkts64to64 on lan1                                         [ OK ]
TEST: rx-pkts65to127 on lan1                                        [ OK ]
TEST: rx-pkts128to255 on lan1                                       [ OK ]
TEST: rx-pkts256to511 on lan1                                       [ OK ]
TEST: rx-pkts512to1023 on lan1                                      [ OK ]
TEST: rx-pkts1024to65535 on lan1                                    [ OK ]
TEST: rx-pkts64to64 on lan2                                         [ OK ]
TEST: rx-pkts65to127 on lan2                                        [ OK ]
TEST: rx-pkts128to255 on lan2                                       [ OK ]
TEST: rx-pkts256to511 on lan2                                       [ OK ]
TEST: rx-pkts512to1023 on lan2                                      [ OK ]
TEST: rx-pkts1024to65535 on lan2                                    [ OK ]
TEST: lan1 does not support tx histogram counters                   [SKIP]
TEST: lan2 does not support tx histogram counters                   [SKIP]

This is just lovely, thanks for the work, Tobias.

Just one nitpick below.

> +rmon_histogram()
> +{
> +	local iface=$1; shift
> +	local neigh=$1; shift
> +	local set=$1; shift
> +	local nbuckets=0
> +	local step=
> +
> +	RET=0
> +
> +	while read -r -a bucket; do
> +		step="$set-pkts${bucket[0]}to${bucket[1]} on $iface"
> +
> +		for if in $iface $neigh; do

My syntax highlighting in vim gets confused by the fact that you name a
variable "if". I guess something like "netif" would do the trick. But
bash doesn't seem to be confused. I can send a patch renaming this after
it gets merged. There's no reason to resend - it's not a functional
change.

> +			if ! ensure_mtu $if ${bucket[0]}; then
> +				log_test_skip "$if does not support the required MTU for $step"
> +				return
> +			fi
> +		done
> +
> +		if ! bucket_test $iface $neigh $set $nbuckets ${bucket[0]}; then
> +			check_err 1 "$step failed"
> +			return 1
> +		fi
> +		log_test "$step"
> +		nbuckets=$((nbuckets + 1))
> +	done < <(ethtool --json -S $iface --groups rmon | \
> +		jq -r ".[0].rmon[\"${set}-pktsNtoM\"][]|[.low, .high]|@tsv" 2>/dev/null)
diff mbox series

Patch

diff --git a/tools/testing/selftests/net/forwarding/Makefile b/tools/testing/selftests/net/forwarding/Makefile
index df593b7b3e6b..452693514be4 100644
--- a/tools/testing/selftests/net/forwarding/Makefile
+++ b/tools/testing/selftests/net/forwarding/Makefile
@@ -17,6 +17,7 @@  TEST_PROGS = bridge_fdb_learning_limit.sh \
 	dual_vxlan_bridge.sh \
 	ethtool_extended_state.sh \
 	ethtool_mm.sh \
+	ethtool_rmon.sh \
 	ethtool.sh \
 	gre_custom_multipath_hash.sh \
 	gre_inner_v4_multipath.sh \
diff --git a/tools/testing/selftests/net/forwarding/ethtool_rmon.sh b/tools/testing/selftests/net/forwarding/ethtool_rmon.sh
new file mode 100755
index 000000000000..41a34a61f763
--- /dev/null
+++ b/tools/testing/selftests/net/forwarding/ethtool_rmon.sh
@@ -0,0 +1,143 @@ 
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+ALL_TESTS="
+	rmon_rx_histogram
+	rmon_tx_histogram
+"
+
+NUM_NETIFS=2
+source lib.sh
+
+ETH_FCS_LEN=4
+ETH_HLEN=$((6+6+2))
+
+declare -A netif_mtu
+
+ensure_mtu()
+{
+	local iface=$1; shift
+	local len=$1; shift
+	local current=$(ip -j link show dev $iface | jq -r '.[0].mtu')
+	local required=$((len - ETH_HLEN - ETH_FCS_LEN))
+
+	if [ $current -lt $required ]; then
+		ip link set dev $iface mtu $required || return 1
+	fi
+}
+
+bucket_test()
+{
+	local iface=$1; shift
+	local neigh=$1; shift
+	local set=$1; shift
+	local bucket=$1; shift
+	local len=$1; shift
+	local num_rx=10000
+	local num_tx=20000
+	local expected=
+	local before=
+	local after=
+	local delta=
+
+	# Mausezahn does not include FCS bytes in its length - but the
+	# histogram counters do
+	len=$((len - ETH_FCS_LEN))
+
+	before=$(ethtool --json -S $iface --groups rmon | \
+		jq -r ".[0].rmon[\"${set}-pktsNtoM\"][$bucket].val")
+
+	# Send 10k one way and 20k in the other, to detect counters
+	# mapped to the wrong direction
+	$MZ $neigh -q -c $num_rx -p $len -a own -b bcast -d 10us
+	$MZ $iface -q -c $num_tx -p $len -a own -b bcast -d 10us
+
+	after=$(ethtool --json -S $iface --groups rmon | \
+		jq -r ".[0].rmon[\"${set}-pktsNtoM\"][$bucket].val")
+
+	delta=$((after - before))
+
+	expected=$([ $set = rx ] && echo $num_rx || echo $num_tx)
+
+	# Allow some extra tolerance for other packets sent by the stack
+	[ $delta -ge $expected ] && [ $delta -le $((expected + 100)) ]
+}
+
+rmon_histogram()
+{
+	local iface=$1; shift
+	local neigh=$1; shift
+	local set=$1; shift
+	local nbuckets=0
+	local step=
+
+	RET=0
+
+	while read -r -a bucket; do
+		step="$set-pkts${bucket[0]}to${bucket[1]} on $iface"
+
+		for if in $iface $neigh; do
+			if ! ensure_mtu $if ${bucket[0]}; then
+				log_test_skip "$if does not support the required MTU for $step"
+				return
+			fi
+		done
+
+		if ! bucket_test $iface $neigh $set $nbuckets ${bucket[0]}; then
+			check_err 1 "$step failed"
+			return 1
+		fi
+		log_test "$step"
+		nbuckets=$((nbuckets + 1))
+	done < <(ethtool --json -S $iface --groups rmon | \
+		jq -r ".[0].rmon[\"${set}-pktsNtoM\"][]|[.low, .high]|@tsv" 2>/dev/null)
+
+	if [ $nbuckets -eq 0 ]; then
+		log_test_skip "$iface does not support $set histogram counters"
+		return
+	fi
+}
+
+rmon_rx_histogram()
+{
+	rmon_histogram $h1 $h2 rx
+	rmon_histogram $h2 $h1 rx
+}
+
+rmon_tx_histogram()
+{
+	rmon_histogram $h1 $h2 tx
+	rmon_histogram $h2 $h1 tx
+}
+
+setup_prepare()
+{
+	h1=${NETIFS[p1]}
+	h2=${NETIFS[p2]}
+
+	for iface in $h1 $h2; do
+		netif_mtu[$iface]=$(ip -j link show dev $iface | jq -r '.[0].mtu')
+		ip link set dev $iface up
+	done
+}
+
+cleanup()
+{
+	pre_cleanup
+
+	for iface in $h2 $h1; do
+		ip link set dev $iface \
+			mtu ${netif_mtu[$iface]} \
+			down
+	done
+}
+
+check_ethtool_counter_group_support
+trap cleanup EXIT
+
+setup_prepare
+setup_wait
+
+tests_run
+
+exit $EXIT_STATUS
diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh
index 8f6ca458af9a..e3740163c384 100755
--- a/tools/testing/selftests/net/forwarding/lib.sh
+++ b/tools/testing/selftests/net/forwarding/lib.sh
@@ -146,6 +146,15 @@  check_ethtool_mm_support()
 	fi
 }
 
+check_ethtool_counter_group_support()
+{
+	ethtool --help 2>&1| grep -- '--all-groups' &> /dev/null
+	if [[ $? -ne 0 ]]; then
+		echo "SKIP: ethtool too old; it is missing standard counter group support"
+		exit $ksft_skip
+	fi
+}
+
 check_locked_port_support()
 {
 	if ! bridge -d link show | grep -q " locked"; then