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

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
Loading
Loading
Loading
Loading
+107 −0
Original line number Diff line number Diff line
# 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
}
+10 −1
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
../spectrum/rif_counter_scale.sh
 No newline at end of file
+10 −1
Original line number Diff line number Diff line
@@ -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
+34 −0
Original line number Diff line number Diff line
# 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
}