mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 22:22:08 +02:00
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: 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>
This commit is contained in:
parent
dd5d20e17c
commit
be00853bfd
107
tools/testing/selftests/drivers/net/mlxsw/rif_counter_scale.sh
Normal file
107
tools/testing/selftests/drivers/net/mlxsw/rif_counter_scale.sh
Normal file
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
../spectrum/rif_counter_scale.sh
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user