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

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
...@@ -114,23 +114,12 @@ ping_ipv4() ...@@ -114,23 +114,12 @@ ping_ipv4()
ping_test $h1 192.0.2.2 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() __test_defprio()
{ {
local prio_install=$1; shift local prio_install=$1; shift
local prio_observe=$1; shift local prio_observe=$1; shift
local delta
local key local key
local t1
local i local i
RET=0 RET=0
...@@ -139,9 +128,10 @@ __test_defprio() ...@@ -139,9 +128,10 @@ __test_defprio()
local t0=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe) local t0=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)
mausezahn -q $h1 -d 100m -c 10 -t arp reply 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" log_test "Default priority $prio_install/$prio_observe"
defprio_uninstall $swp1 $prio_install defprio_uninstall $swp1 $prio_install
......
...@@ -351,7 +351,7 @@ build_backlog() ...@@ -351,7 +351,7 @@ build_backlog()
local i=0 local i=0
while :; do while :; do
local cur=$(busywait 1100 until_counter_is $((cur + 1)) \ local cur=$(busywait 1100 until_counter_is "> $cur" \
get_qdisc_backlog $vlan) get_qdisc_backlog $vlan)
local diff=$((size - cur)) local diff=$((size - cur))
local pkts=$(((diff + 7999) / 8000)) local pkts=$(((diff + 7999) / 8000))
...@@ -481,14 +481,14 @@ do_mc_backlog_test() ...@@ -481,14 +481,14 @@ do_mc_backlog_test()
start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) bc start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) bc
start_tcp_traffic $h2.$vlan $(ipaddr 2 $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) get_qdisc_backlog $vlan)
check_err $? "Could not build MC backlog" check_err $? "Could not build MC backlog"
# Verify that we actually see the backlog on BUM TC. Do a busywait as # Verify that we actually see the backlog on BUM TC. Do a busywait as
# well, performance blips might cause false fail. # well, performance blips might cause false fail.
local ebl local ebl
ebl=$(busywait 5000 until_counter_is 500000 \ ebl=$(busywait 5000 until_counter_is ">= 500000" \
get_mc_transmit_queue $vlan) get_mc_transmit_queue $vlan)
check_err $? "MC backlog reported by qdisc not visible in ethtool" check_err $? "MC backlog reported by qdisc not visible in ethtool"
......
...@@ -277,11 +277,11 @@ wait_for_offload() ...@@ -277,11 +277,11 @@ wait_for_offload()
until_counter_is() until_counter_is()
{ {
local value=$1; shift local expr=$1; shift
local current=$("$@") local current=$("$@")
echo $((current)) echo $((current))
((current >= value)) ((current $expr))
} }
busywait_for_counter() busywait_for_counter()
...@@ -290,7 +290,7 @@ busywait_for_counter() ...@@ -290,7 +290,7 @@ busywait_for_counter()
local delta=$1; shift local delta=$1; shift
local base=$("$@") local base=$("$@")
busywait "$timeout" until_counter_is $((base + delta)) "$@" busywait "$timeout" until_counter_is ">= $((base + delta))" "$@"
} }
setup_wait_dev() setup_wait_dev()
...@@ -626,6 +626,17 @@ tc_rule_stats_get() ...@@ -626,6 +626,17 @@ tc_rule_stats_get()
| jq ".[1].options.actions[].stats$selector" | 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() ethtool_stats_get()
{ {
local dev=$1; shift local dev=$1; shift
......
...@@ -6,39 +6,14 @@ CHECK_TC="yes" ...@@ -6,39 +6,14 @@ CHECK_TC="yes"
# Can be overridden by the configuration file. See lib.sh # Can be overridden by the configuration file. See lib.sh
TC_HIT_TIMEOUT=${TC_HIT_TIMEOUT:=1000} # ms 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() tc_check_packets()
{ {
local id=$1 local id=$1
local handle=$2 local handle=$2
local count=$3 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() tc_check_packets_hitting()
...@@ -46,5 +21,6 @@ tc_check_packets_hitting() ...@@ -46,5 +21,6 @@ tc_check_packets_hitting()
local id=$1 local id=$1
local handle=$2 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
} }
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