selftests: mlxsw: Add a RIF counter scale test
authorPetr Machata <petrm@nvidia.com>
Thu, 16 Jun 2022 10:42:44 +0000 (13:42 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 17 Jun 2022 09:31:33 +0000 (10:31 +0100)
This tests creates as many RIFs as possible, ideally more than there can be
RIF counters (though that is currently only possible on Spectrum-1). It
then tries to enable L3 HW stats on each of the RIFs. It also contains the
traffic test, which tries to run traffic through a log2 of those counters
and checks that the traffic is shown in the counter values.

Like with tc_flower traffic test, take a log2 subset of rules. The logic
behind picking log2 rules is that then every bit of the instantiated item's
number is exercised. This should catch issues whether they happen at the
high end, low end, or somewhere in between.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Amit Cohen <amcohen@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/drivers/net/mlxsw/rif_counter_scale.sh [new file with mode: 0644]
tools/testing/selftests/drivers/net/mlxsw/spectrum-2/resource_scale.sh
tools/testing/selftests/drivers/net/mlxsw/spectrum-2/rif_counter_scale.sh [new symlink]
tools/testing/selftests/drivers/net/mlxsw/spectrum/resource_scale.sh
tools/testing/selftests/drivers/net/mlxsw/spectrum/rif_counter_scale.sh [new file with mode: 0644]

diff --git a/tools/testing/selftests/drivers/net/mlxsw/rif_counter_scale.sh b/tools/testing/selftests/drivers/net/mlxsw/rif_counter_scale.sh
new file mode 100644 (file)
index 0000000..a43a992
--- /dev/null
@@ -0,0 +1,107 @@
+# SPDX-License-Identifier: GPL-2.0
+
+RIF_COUNTER_NUM_NETIFS=2
+
+rif_counter_addr4()
+{
+       local i=$1; shift
+       local p=$1; shift
+
+       printf 192.0.%d.%d $((i / 64)) $(((4 * i % 256) + p))
+}
+
+rif_counter_addr4pfx()
+{
+       rif_counter_addr4 $@
+       printf /30
+}
+
+rif_counter_h1_create()
+{
+       simple_if_init $h1
+}
+
+rif_counter_h1_destroy()
+{
+       simple_if_fini $h1
+}
+
+rif_counter_h2_create()
+{
+       simple_if_init $h2
+}
+
+rif_counter_h2_destroy()
+{
+       simple_if_fini $h2
+}
+
+rif_counter_setup_prepare()
+{
+       h1=${NETIFS[p1]}
+       h2=${NETIFS[p2]}
+
+       vrf_prepare
+
+       rif_counter_h1_create
+       rif_counter_h2_create
+}
+
+rif_counter_cleanup()
+{
+       local count=$1; shift
+
+       pre_cleanup
+
+       for ((i = 1; i <= count; i++)); do
+               vlan_destroy $h2 $i
+       done
+
+       rif_counter_h2_destroy
+       rif_counter_h1_destroy
+
+       vrf_cleanup
+
+       if [[ -v RIF_COUNTER_BATCH_FILE ]]; then
+               rm -f $RIF_COUNTER_BATCH_FILE
+       fi
+}
+
+
+rif_counter_test()
+{
+       local count=$1; shift
+       local should_fail=$1; shift
+
+       RIF_COUNTER_BATCH_FILE="$(mktemp)"
+
+       for ((i = 1; i <= count; i++)); do
+               vlan_create $h2 $i v$h2 $(rif_counter_addr4pfx $i 2)
+       done
+       for ((i = 1; i <= count; i++)); do
+               cat >> $RIF_COUNTER_BATCH_FILE <<-EOF
+                       stats set dev $h2.$i l3_stats on
+               EOF
+       done
+
+       ip -b $RIF_COUNTER_BATCH_FILE
+       check_err_fail $should_fail $? "RIF counter enablement"
+}
+
+rif_counter_traffic_test()
+{
+       local count=$1; shift
+       local i;
+
+       for ((i = count; i > 0; i /= 2)); do
+               $MZ $h1 -Q $i -c 1 -d 20msec -p 100 -a own -b $(mac_get $h2) \
+                   -A $(rif_counter_addr4 $i 1) \
+                   -B $(rif_counter_addr4 $i 2) \
+                   -q -t udp sp=54321,dp=12345
+       done
+       for ((i = count; i > 0; i /= 2)); do
+               busywait "$TC_HIT_TIMEOUT" until_counter_is "== 1" \
+                        hw_stats_get l3_stats $h2.$i rx packets > /dev/null
+               check_err $? "Traffic not seen at RIF $h2.$i"
+       done
+}
index 1a7a472..688338b 100755 (executable)
@@ -25,7 +25,16 @@ cleanup()
 
 trap cleanup EXIT
 
-ALL_TESTS="router tc_flower mirror_gre tc_police port rif_mac_profile"
+ALL_TESTS="
+       router
+       tc_flower
+       mirror_gre
+       tc_police
+       port
+       rif_mac_profile
+       rif_counter
+"
+
 for current_test in ${TESTS:-$ALL_TESTS}; do
        RET_FIN=0
        source ${current_test}_scale.sh
diff --git a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/rif_counter_scale.sh b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/rif_counter_scale.sh
new file mode 120000 (symlink)
index 0000000..1f5752e
--- /dev/null
@@ -0,0 +1 @@
+../spectrum/rif_counter_scale.sh
\ No newline at end of file
index 70c9da8..95d9f71 100755 (executable)
@@ -22,7 +22,16 @@ cleanup()
 devlink_sp_read_kvd_defaults
 trap cleanup EXIT
 
-ALL_TESTS="router tc_flower mirror_gre tc_police port rif_mac_profile"
+ALL_TESTS="
+       router
+       tc_flower
+       mirror_gre
+       tc_police
+       port
+       rif_mac_profile
+       rif_counter
+"
+
 for current_test in ${TESTS:-$ALL_TESTS}; do
        RET_FIN=0
        source ${current_test}_scale.sh
diff --git a/tools/testing/selftests/drivers/net/mlxsw/spectrum/rif_counter_scale.sh b/tools/testing/selftests/drivers/net/mlxsw/spectrum/rif_counter_scale.sh
new file mode 100644 (file)
index 0000000..d445362
--- /dev/null
@@ -0,0 +1,34 @@
+# SPDX-License-Identifier: GPL-2.0
+source ../rif_counter_scale.sh
+
+rif_counter_get_target()
+{
+       local should_fail=$1; shift
+       local max_cnts
+       local max_rifs
+       local target
+
+       max_rifs=$(devlink_resource_size_get rifs)
+       max_cnts=$(devlink_resource_size_get counters rif)
+
+       # Remove already allocated RIFs.
+       ((max_rifs -= $(devlink_resource_occ_get rifs)))
+
+       # 10 KVD slots per counter, ingress+egress counters per RIF
+       ((max_cnts /= 20))
+
+       # Pointless to run the overflow test if we don't have enough RIFs to
+       # host all the counters.
+       if ((max_cnts > max_rifs && should_fail)); then
+               echo 0
+               return
+       fi
+
+       target=$((max_rifs < max_cnts ? max_rifs : max_cnts))
+
+       if ((! should_fail)); then
+               echo $target
+       else
+               echo $((target + 1))
+       fi
+}