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:
commit
78efdb5c9f
@ -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()
|
|||||||
|
|
||||||
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()
|
|||||||
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()
|
|||||||
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()
|
|||||||
|
|
||||||
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()
|
|||||||
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()
|
|||||||
| 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"
|
|||||||
# 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()
|
|||||||
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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user