Commit 78efdb5c authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'net-selftests'



Petr Machata says:

====================
selftests: Use busywait() in a couple places

Two helper function for active waiting for an event were recently
introduced: busywait() as the active-waiting tool, and until_counter_is()
as a configurable predicate that can be plugged into busywait(). Use these
in tc_common and mlxsw's qos_defprio instead of hand-coding equivalents.

Patches #1 and #2 extend lib.sh facilities to make the transition possible.
Patch #3 converts tc_common, and patch #4 qos_defprio.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a29b56c4 7b522ba2
Loading
Loading
Loading
Loading
+4 −14
Original line number Diff line number Diff line
@@ -114,23 +114,12 @@ ping_ipv4()
	ping_test $h1 192.0.2.2
}

wait_for_packets()
{
	local t0=$1; shift
	local prio_observe=$1; shift

	local t1=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)
	local delta=$((t1 - t0))
	echo $delta
	((delta >= 10))
}

__test_defprio()
{
	local prio_install=$1; shift
	local prio_observe=$1; shift
	local delta
	local key
	local t1
	local i

	RET=0
@@ -139,9 +128,10 @@ __test_defprio()

	local t0=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)
	mausezahn -q $h1 -d 100m -c 10 -t arp reply
	delta=$(busywait "$HIT_TIMEOUT" wait_for_packets $t0 $prio_observe)
	t1=$(busywait "$HIT_TIMEOUT" until_counter_is ">= $((t0 + 10))" \
		ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)

	check_err $? "Default priority $prio_install/$prio_observe: Expected to capture 10 packets, got $delta."
	check_err $? "Default priority $prio_install/$prio_observe: Expected to capture 10 packets, got $((t1 - t0))."
	log_test "Default priority $prio_install/$prio_observe"

	defprio_uninstall $swp1 $prio_install
+3 −3
Original line number Diff line number Diff line
@@ -351,7 +351,7 @@ build_backlog()
	local i=0

	while :; do
		local cur=$(busywait 1100 until_counter_is $((cur + 1)) \
		local cur=$(busywait 1100 until_counter_is "> $cur" \
					    get_qdisc_backlog $vlan)
		local diff=$((size - cur))
		local pkts=$(((diff + 7999) / 8000))
@@ -481,14 +481,14 @@ do_mc_backlog_test()
	start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) bc
	start_tcp_traffic $h2.$vlan $(ipaddr 2 $vlan) $(ipaddr 3 $vlan) bc

	qbl=$(busywait 5000 until_counter_is 500000 \
	qbl=$(busywait 5000 until_counter_is ">= 500000" \
		       get_qdisc_backlog $vlan)
	check_err $? "Could not build MC backlog"

	# Verify that we actually see the backlog on BUM TC. Do a busywait as
	# well, performance blips might cause false fail.
	local ebl
	ebl=$(busywait 5000 until_counter_is 500000 \
	ebl=$(busywait 5000 until_counter_is ">= 500000" \
		       get_mc_transmit_queue $vlan)
	check_err $? "MC backlog reported by qdisc not visible in ethtool"

+14 −3
Original line number Diff line number Diff line
@@ -277,11 +277,11 @@ wait_for_offload()

until_counter_is()
{
	local value=$1; shift
	local expr=$1; shift
	local current=$("$@")

	echo $((current))
	((current >= value))
	((current $expr))
}

busywait_for_counter()
@@ -290,7 +290,7 @@ busywait_for_counter()
	local delta=$1; shift

	local base=$("$@")
	busywait "$timeout" until_counter_is $((base + delta)) "$@"
	busywait "$timeout" until_counter_is ">= $((base + delta))" "$@"
}

setup_wait_dev()
@@ -626,6 +626,17 @@ tc_rule_stats_get()
	    | jq ".[1].options.actions[].stats$selector"
}

tc_rule_handle_stats_get()
{
	local id=$1; shift
	local handle=$1; shift
	local selector=${1:-.packets}; shift

	tc -j -s filter show $id \
	    | jq ".[] | select(.options.handle == $handle) | \
		  .options.actions[0].stats$selector"
}

ethtool_stats_get()
{
	local dev=$1; shift
+4 −28
Original line number Diff line number Diff line
@@ -6,39 +6,14 @@ CHECK_TC="yes"
# Can be overridden by the configuration file. See lib.sh
TC_HIT_TIMEOUT=${TC_HIT_TIMEOUT:=1000} # ms

__tc_check_packets()
{
	local id=$1
	local handle=$2
	local count=$3
	local operator=$4

	start_time="$(date -u +%s%3N)"
	while true
	do
		cmd_jq "tc -j -s filter show $id" \
		       ".[] | select(.options.handle == $handle) | \
			    select(.options.actions[0].stats.packets $operator $count)" \
		    &> /dev/null
		ret=$?
		if [[ $ret -eq 0 ]]; then
			return $ret
		fi
		current_time="$(date -u +%s%3N)"
		diff=$(expr $current_time - $start_time)
		if [ "$diff" -gt "$TC_HIT_TIMEOUT" ]; then
			return 1
		fi
	done
}

tc_check_packets()
{
	local id=$1
	local handle=$2
	local count=$3

	__tc_check_packets "$id" "$handle" "$count" "=="
	busywait "$TC_HIT_TIMEOUT" until_counter_is "== $count" \
		 tc_rule_handle_stats_get "$id" "$handle" > /dev/null
}

tc_check_packets_hitting()
@@ -46,5 +21,6 @@ tc_check_packets_hitting()
	local id=$1
	local handle=$2

	__tc_check_packets "$id" "$handle" 0 ">"
	busywait "$TC_HIT_TIMEOUT" until_counter_is "> 0" \
		 tc_rule_handle_stats_get "$id" "$handle" > /dev/null
}