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: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2020-03-03 17:03:52 -08:00
commit 78efdb5c9f
4 changed files with 25 additions and 48 deletions

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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
}