Path: blob/master/tools/testing/selftests/drivers/net/mlxsw/qos_headroom.sh
26292 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023ALL_TESTS="4test_defaults5test_dcb_ets6test_mtu7test_pfc8test_int_buf9test_tc_priomap10test_tc_mtu11test_tc_sizes12test_tc_int_buf13"1415lib_dir=$(dirname $0)/../../../net/forwarding1617NUM_NETIFS=018source $lib_dir/lib.sh19source $lib_dir/devlink_lib.sh2021swp=$NETIF_NO_CABLE2223cleanup()24{25pre_cleanup26}2728get_prio_pg()29{30# Produces a string of numbers "<B0> <B1> ... <B7> ", where BX is number31# of buffer that priority X is mapped to.32dcb -j buffer show dev $swp |33jq -r '[.prio_buffer | .[] | tostring + " "] | add'34}3536get_prio_pfc()37{38# Produces a string of numbers "<P0> <P1> ... <P7> ", where PX denotes39# whether priority X has PFC enabled (the value is 1) or disabled (0).40dcb -j pfc show dev $swp |41jq -r '[.prio_pfc | .[] | if . then "1 " else "0 " end] | add'42}4344get_prio_tc()45{46# Produces a string of numbers "<T0> <T1> ... <T7> ", where TC is number47# of TC that priority X is mapped to.48dcb -j ets show dev $swp |49jq -r '[.prio_tc | .[] | tostring + " "] | add'50}5152get_buf_size()53{54local idx=$1; shift5556dcb -j buffer show dev $swp | jq ".buffer_size[$idx]"57}5859get_tot_size()60{61dcb -j buffer show dev $swp | jq '.total_size'62}6364check_prio_pg()65{66local expect=$1; shift6768local current=$(get_prio_pg)69test "$current" = "$expect"70check_err $? "prio2buffer is '$current', expected '$expect'"71}7273check_prio_pfc()74{75local expect=$1; shift7677local current=$(get_prio_pfc)78test "$current" = "$expect"79check_err $? "prio PFC is '$current', expected '$expect'"80}8182check_prio_tc()83{84local expect=$1; shift8586local current=$(get_prio_tc)87test "$current" = "$expect"88check_err $? "prio_tc is '$current', expected '$expect'"89}9091__check_buf_size()92{93local idx=$1; shift94local expr=$1; shift95local what=$1; shift9697local current=$(get_buf_size $idx)98((current $expr))99check_err $? "${what}buffer $idx size is '$current', expected '$expr'"100echo $current101}102103check_buf_size()104{105__check_buf_size "$@" > /dev/null106}107108test_defaults()109{110RET=0111112check_prio_pg "0 0 0 0 0 0 0 0 "113check_prio_tc "0 0 0 0 0 0 0 0 "114check_prio_pfc "0 0 0 0 0 0 0 0 "115116log_test "Default headroom configuration"117}118119test_dcb_ets()120{121RET=0122123dcb ets set dev $swp prio-tc 0:0 1:2 2:4 3:6 4:1 5:3 6:5 7:7124125check_prio_pg "0 2 4 6 1 3 5 7 "126check_prio_tc "0 2 4 6 1 3 5 7 "127check_prio_pfc "0 0 0 0 0 0 0 0 "128129dcb ets set dev $swp prio-tc all:0130131check_prio_pg "0 0 0 0 0 0 0 0 "132check_prio_tc "0 0 0 0 0 0 0 0 "133134dcb buffer set dev $swp prio-buffer 0:1 1:3 2:5 3:7 4:0 5:2 6:4 7:6 2>/dev/null135check_fail $? "prio2buffer accepted in DCB mode"136137log_test "Configuring headroom through ETS"138}139140test_mtu()141{142local what=$1; shift143local buf0size_2144local buf0size145146RET=0147buf0size=$(__check_buf_size 0 "> 0")148149mtu_set $swp 3000150buf0size_2=$(__check_buf_size 0 "> $buf0size" "MTU 3000: ")151mtu_restore $swp152153mtu_set $swp 6000154check_buf_size 0 "> $buf0size_2" "MTU 6000: "155mtu_restore $swp156157check_buf_size 0 "== $buf0size"158159log_test "${what}MTU impacts buffer size"160}161162test_tc_mtu()163{164# In TC mode, MTU still impacts the threshold below which a buffer is165# not permitted to go.166167tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M168test_mtu "TC: "169tc qdisc delete dev $swp root170}171172test_pfc()173{174RET=0175176dcb ets set dev $swp prio-tc all:0 5:1 6:2 7:3177178local buf0size=$(get_buf_size 0)179local buf1size=$(get_buf_size 1)180local buf2size=$(get_buf_size 2)181local buf3size=$(get_buf_size 3)182check_buf_size 0 "> 0"183check_buf_size 1 "> 0"184check_buf_size 2 "> 0"185check_buf_size 3 "> 0"186check_buf_size 4 "== 0"187check_buf_size 5 "== 0"188check_buf_size 6 "== 0"189check_buf_size 7 "== 0"190191log_test "Buffer size sans PFC"192193RET=0194195dcb pfc set dev $swp prio-pfc all:off 5:on 6:on 7:on delay 0196197check_prio_pg "0 0 0 0 0 1 2 3 "198check_prio_pfc "0 0 0 0 0 1 1 1 "199check_buf_size 0 "== $buf0size"200check_buf_size 1 "> $buf1size"201check_buf_size 2 "> $buf2size"202check_buf_size 3 "> $buf3size"203204local buf1size=$(get_buf_size 1)205check_buf_size 2 "== $buf1size"206check_buf_size 3 "== $buf1size"207208log_test "PFC: Cable length 0"209210RET=0211212dcb pfc set dev $swp delay 1000213214check_buf_size 0 "== $buf0size"215check_buf_size 1 "> $buf1size"216check_buf_size 2 "> $buf1size"217check_buf_size 3 "> $buf1size"218219log_test "PFC: Cable length 1000"220221RET=0222223dcb pfc set dev $swp prio-pfc all:off delay 0224dcb ets set dev $swp prio-tc all:0225226check_prio_pg "0 0 0 0 0 0 0 0 "227check_prio_tc "0 0 0 0 0 0 0 0 "228check_buf_size 0 "> 0"229check_buf_size 1 "== 0"230check_buf_size 2 "== 0"231check_buf_size 3 "== 0"232check_buf_size 4 "== 0"233check_buf_size 5 "== 0"234check_buf_size 6 "== 0"235check_buf_size 7 "== 0"236237log_test "PFC: Restore defaults"238}239240test_tc_priomap()241{242RET=0243244dcb ets set dev $swp prio-tc 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7245check_prio_pg "0 1 2 3 4 5 6 7 "246247tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M248check_prio_pg "0 0 0 0 0 0 0 0 "249250dcb buffer set dev $swp prio-buffer 0:1 1:3 2:5 3:7 4:0 5:2 6:4 7:6251check_prio_pg "1 3 5 7 0 2 4 6 "252253tc qdisc delete dev $swp root254check_prio_pg "0 1 2 3 4 5 6 7 "255256# Clean up.257tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M258dcb buffer set dev $swp prio-buffer all:0259tc qdisc delete dev $swp root260dcb ets set dev $swp prio-tc all:0261262log_test "TC: priomap"263}264265test_tc_sizes()266{267local cell_size=$(devlink_cell_size_get)268local size=$((cell_size * 1000))269270RET=0271272dcb buffer set dev $swp buffer-size all:0 0:$size 2>/dev/null273check_fail $? "buffer_size should fail before qdisc is added"274275tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M276277dcb buffer set dev $swp buffer-size all:0 0:$size278check_err $? "buffer_size should pass after qdisc is added"279check_buf_size 0 "== $size" "set size: "280281mtu_set $swp 6000282check_buf_size 0 "== $size" "set MTU: "283mtu_restore $swp284285dcb buffer set dev $swp buffer-size all:0286287# After replacing the qdisc for the same kind, buffer_size still has to288# work.289tc qdisc replace dev $swp root handle 1: bfifo limit 1M290291dcb buffer set dev $swp buffer-size all:0 0:$size292check_buf_size 0 "== $size" "post replace, set size: "293294dcb buffer set dev $swp buffer-size all:0295296# Likewise after replacing for a different kind.297tc qdisc replace dev $swp root handle 2: prio bands 8298299dcb buffer set dev $swp buffer-size all:0 0:$size300check_buf_size 0 "== $size" "post replace different kind, set size: "301302tc qdisc delete dev $swp root303304dcb buffer set dev $swp buffer-size all:0 0:$size 2>/dev/null305check_fail $? "buffer_size should fail after qdisc is deleted"306307log_test "TC: buffer size"308}309310test_int_buf()311{312local what=$1; shift313314RET=0315316local buf0size=$(get_buf_size 0)317local tot_size=$(get_tot_size)318319# Size of internal buffer and buffer 9.320local dsize=$((tot_size - buf0size))321322tc qdisc add dev $swp clsact323tc filter add dev $swp egress matchall skip_sw action mirred egress mirror dev $swp324325local buf0size_2=$(get_buf_size 0)326local tot_size_2=$(get_tot_size)327local dsize_2=$((tot_size_2 - buf0size_2))328329# Egress SPAN should have added to the "invisible" buffer configuration.330((dsize_2 > dsize))331check_err $? "Invisible buffers account for '$dsize_2', expected '> $dsize'"332333mtu_set $swp 3000334335local buf0size_3=$(get_buf_size 0)336local tot_size_3=$(get_tot_size)337local dsize_3=$((tot_size_3 - buf0size_3))338339# MTU change might change buffer 0, which will show at total, but the340# hidden buffers should stay the same size.341((dsize_3 == dsize_2))342check_err $? "MTU change: Invisible buffers account for '$dsize_3', expected '== $dsize_2'"343344mtu_restore $swp345tc qdisc del dev $swp clsact346347# After SPAN removal, hidden buffers should be back to the original sizes.348local buf0size_4=$(get_buf_size 0)349local tot_size_4=$(get_tot_size)350local dsize_4=$((tot_size_4 - buf0size_4))351((dsize_4 == dsize))352check_err $? "SPAN removed: Invisible buffers account for '$dsize_4', expected '== $dsize'"353354log_test "${what}internal buffer size"355}356357test_tc_int_buf()358{359local cell_size=$(devlink_cell_size_get)360local size=$((cell_size * 1000))361362tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M363test_int_buf "TC: "364365dcb buffer set dev $swp buffer-size all:0 0:$size366test_int_buf "TC+buffsize: "367368dcb buffer set dev $swp buffer-size all:0369tc qdisc delete dev $swp root370}371372bail_on_lldpad "configure DCB" "configure Qdiscs"373374trap cleanup EXIT375setup_wait376tests_run377378exit $EXIT_STATUS379380381