Commit be00853b authored by Petr Machata's avatar Petr Machata Committed by David S. Miller

selftests: mlxsw: Add a RIF counter scale test

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: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarAmit Cohen <amcohen@nvidia.com>
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dd5d20e1
# 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
}
...@@ -25,7 +25,16 @@ cleanup() ...@@ -25,7 +25,16 @@ cleanup()
trap cleanup EXIT 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 for current_test in ${TESTS:-$ALL_TESTS}; do
RET_FIN=0 RET_FIN=0
source ${current_test}_scale.sh source ${current_test}_scale.sh
......
../spectrum/rif_counter_scale.sh
\ No newline at end of file
...@@ -22,7 +22,16 @@ cleanup() ...@@ -22,7 +22,16 @@ cleanup()
devlink_sp_read_kvd_defaults devlink_sp_read_kvd_defaults
trap cleanup EXIT 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 for current_test in ${TESTS:-$ALL_TESTS}; do
RET_FIN=0 RET_FIN=0
source ${current_test}_scale.sh source ${current_test}_scale.sh
......
# 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
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment