xref: /openbmc/linux/tools/testing/selftests/drivers/net/mlxsw/qos_headroom.sh (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1a65cc53aSPetr Machata#!/bin/bash
2a65cc53aSPetr Machata# SPDX-License-Identifier: GPL-2.0
3a65cc53aSPetr Machata
4a65cc53aSPetr MachataALL_TESTS="
5a65cc53aSPetr Machata	test_defaults
6a65cc53aSPetr Machata	test_dcb_ets
7a65cc53aSPetr Machata	test_mtu
8a65cc53aSPetr Machata	test_pfc
9a65cc53aSPetr Machata	test_int_buf
10a65cc53aSPetr Machata	test_tc_priomap
11a65cc53aSPetr Machata	test_tc_mtu
12a65cc53aSPetr Machata	test_tc_sizes
13a65cc53aSPetr Machata	test_tc_int_buf
14a65cc53aSPetr Machata"
15a65cc53aSPetr Machata
16a65cc53aSPetr Machatalib_dir=$(dirname $0)/../../../net/forwarding
17a65cc53aSPetr Machata
18a65cc53aSPetr MachataNUM_NETIFS=0
19a65cc53aSPetr Machatasource $lib_dir/lib.sh
20a65cc53aSPetr Machatasource $lib_dir/devlink_lib.sh
21a65cc53aSPetr Machata
22a65cc53aSPetr Machataswp=$NETIF_NO_CABLE
23a65cc53aSPetr Machata
24a65cc53aSPetr Machatacleanup()
25a65cc53aSPetr Machata{
26a65cc53aSPetr Machata	pre_cleanup
27a65cc53aSPetr Machata}
28a65cc53aSPetr Machata
29a65cc53aSPetr Machataget_prio_pg()
30a65cc53aSPetr Machata{
319a1cac06SPetr Machata	# Produces a string of numbers "<B0> <B1> ... <B7> ", where BX is number
329a1cac06SPetr Machata	# of buffer that priority X is mapped to.
339a1cac06SPetr Machata	dcb -j buffer show dev $swp |
349a1cac06SPetr Machata		jq -r '[.prio_buffer | .[] | tostring + " "] | add'
35a65cc53aSPetr Machata}
36a65cc53aSPetr Machata
37a65cc53aSPetr Machataget_prio_pfc()
38a65cc53aSPetr Machata{
399a1cac06SPetr Machata	# Produces a string of numbers "<P0> <P1> ... <P7> ", where PX denotes
409a1cac06SPetr Machata	# whether priority X has PFC enabled (the value is 1) or disabled (0).
419a1cac06SPetr Machata	dcb -j pfc show dev $swp |
429a1cac06SPetr Machata		jq -r '[.prio_pfc | .[] | if . then "1 " else "0 " end] | add'
43a65cc53aSPetr Machata}
44a65cc53aSPetr Machata
45a65cc53aSPetr Machataget_prio_tc()
46a65cc53aSPetr Machata{
479a1cac06SPetr Machata	# Produces a string of numbers "<T0> <T1> ... <T7> ", where TC is number
489a1cac06SPetr Machata	# of TC that priority X is mapped to.
499a1cac06SPetr Machata	dcb -j ets show dev $swp |
509a1cac06SPetr Machata		jq -r '[.prio_tc | .[] | tostring + " "] | add'
51a65cc53aSPetr Machata}
52a65cc53aSPetr Machata
53a65cc53aSPetr Machataget_buf_size()
54a65cc53aSPetr Machata{
55a65cc53aSPetr Machata	local idx=$1; shift
56a65cc53aSPetr Machata
579a1cac06SPetr Machata	dcb -j buffer show dev $swp | jq ".buffer_size[$idx]"
58a65cc53aSPetr Machata}
59a65cc53aSPetr Machata
60a65cc53aSPetr Machataget_tot_size()
61a65cc53aSPetr Machata{
629a1cac06SPetr Machata	dcb -j buffer show dev $swp | jq '.total_size'
63a65cc53aSPetr Machata}
64a65cc53aSPetr Machata
65a65cc53aSPetr Machatacheck_prio_pg()
66a65cc53aSPetr Machata{
67a65cc53aSPetr Machata	local expect=$1; shift
68a65cc53aSPetr Machata
69a65cc53aSPetr Machata	local current=$(get_prio_pg)
70a65cc53aSPetr Machata	test "$current" = "$expect"
71a65cc53aSPetr Machata	check_err $? "prio2buffer is '$current', expected '$expect'"
72a65cc53aSPetr Machata}
73a65cc53aSPetr Machata
74a65cc53aSPetr Machatacheck_prio_pfc()
75a65cc53aSPetr Machata{
76a65cc53aSPetr Machata	local expect=$1; shift
77a65cc53aSPetr Machata
78a65cc53aSPetr Machata	local current=$(get_prio_pfc)
79a65cc53aSPetr Machata	test "$current" = "$expect"
80a65cc53aSPetr Machata	check_err $? "prio PFC is '$current', expected '$expect'"
81a65cc53aSPetr Machata}
82a65cc53aSPetr Machata
83a65cc53aSPetr Machatacheck_prio_tc()
84a65cc53aSPetr Machata{
85a65cc53aSPetr Machata	local expect=$1; shift
86a65cc53aSPetr Machata
87a65cc53aSPetr Machata	local current=$(get_prio_tc)
88a65cc53aSPetr Machata	test "$current" = "$expect"
89a65cc53aSPetr Machata	check_err $? "prio_tc is '$current', expected '$expect'"
90a65cc53aSPetr Machata}
91a65cc53aSPetr Machata
92a65cc53aSPetr Machata__check_buf_size()
93a65cc53aSPetr Machata{
94a65cc53aSPetr Machata	local idx=$1; shift
95a65cc53aSPetr Machata	local expr=$1; shift
96a65cc53aSPetr Machata	local what=$1; shift
97a65cc53aSPetr Machata
98a65cc53aSPetr Machata	local current=$(get_buf_size $idx)
99a65cc53aSPetr Machata	((current $expr))
100a65cc53aSPetr Machata	check_err $? "${what}buffer $idx size is '$current', expected '$expr'"
101a65cc53aSPetr Machata	echo $current
102a65cc53aSPetr Machata}
103a65cc53aSPetr Machata
104a65cc53aSPetr Machatacheck_buf_size()
105a65cc53aSPetr Machata{
106a65cc53aSPetr Machata	__check_buf_size "$@" > /dev/null
107a65cc53aSPetr Machata}
108a65cc53aSPetr Machata
109a65cc53aSPetr Machatatest_defaults()
110a65cc53aSPetr Machata{
111a65cc53aSPetr Machata	RET=0
112a65cc53aSPetr Machata
113a65cc53aSPetr Machata	check_prio_pg "0 0 0 0 0 0 0 0 "
114a65cc53aSPetr Machata	check_prio_tc "0 0 0 0 0 0 0 0 "
115a65cc53aSPetr Machata	check_prio_pfc "0 0 0 0 0 0 0 0 "
116a65cc53aSPetr Machata
117a65cc53aSPetr Machata	log_test "Default headroom configuration"
118a65cc53aSPetr Machata}
119a65cc53aSPetr Machata
120a65cc53aSPetr Machatatest_dcb_ets()
121a65cc53aSPetr Machata{
122a65cc53aSPetr Machata	RET=0
123a65cc53aSPetr Machata
1249a1cac06SPetr Machata	dcb ets set dev $swp prio-tc 0:0 1:2 2:4 3:6 4:1 5:3 6:5 7:7
125a65cc53aSPetr Machata
126a65cc53aSPetr Machata	check_prio_pg "0 2 4 6 1 3 5 7 "
127a65cc53aSPetr Machata	check_prio_tc "0 2 4 6 1 3 5 7 "
128a65cc53aSPetr Machata	check_prio_pfc "0 0 0 0 0 0 0 0 "
129a65cc53aSPetr Machata
1309a1cac06SPetr Machata	dcb ets set dev $swp prio-tc all:0
131a65cc53aSPetr Machata
132a65cc53aSPetr Machata	check_prio_pg "0 0 0 0 0 0 0 0 "
133a65cc53aSPetr Machata	check_prio_tc "0 0 0 0 0 0 0 0 "
134a65cc53aSPetr Machata
1359a1cac06SPetr Machata	dcb buffer set dev $swp prio-buffer 0:1 1:3 2:5 3:7 4:0 5:2 6:4 7:6 2>/dev/null
136a65cc53aSPetr Machata	check_fail $? "prio2buffer accepted in DCB mode"
137a65cc53aSPetr Machata
138a65cc53aSPetr Machata	log_test "Configuring headroom through ETS"
139a65cc53aSPetr Machata}
140a65cc53aSPetr Machata
141a65cc53aSPetr Machatatest_mtu()
142a65cc53aSPetr Machata{
143a65cc53aSPetr Machata	local what=$1; shift
144a65cc53aSPetr Machata	local buf0size_2
145a65cc53aSPetr Machata	local buf0size
146a65cc53aSPetr Machata
147a65cc53aSPetr Machata	RET=0
148a65cc53aSPetr Machata	buf0size=$(__check_buf_size 0 "> 0")
149a65cc53aSPetr Machata
150a65cc53aSPetr Machata	mtu_set $swp 3000
151a65cc53aSPetr Machata	buf0size_2=$(__check_buf_size 0 "> $buf0size" "MTU 3000: ")
152a65cc53aSPetr Machata	mtu_restore $swp
153a65cc53aSPetr Machata
154a65cc53aSPetr Machata	mtu_set $swp 6000
155a65cc53aSPetr Machata	check_buf_size 0 "> $buf0size_2" "MTU 6000: "
156a65cc53aSPetr Machata	mtu_restore $swp
157a65cc53aSPetr Machata
158a65cc53aSPetr Machata	check_buf_size 0 "== $buf0size"
159a65cc53aSPetr Machata
160a65cc53aSPetr Machata	log_test "${what}MTU impacts buffer size"
161a65cc53aSPetr Machata}
162a65cc53aSPetr Machata
163a65cc53aSPetr Machatatest_tc_mtu()
164a65cc53aSPetr Machata{
165a65cc53aSPetr Machata	# In TC mode, MTU still impacts the threshold below which a buffer is
166a65cc53aSPetr Machata	# not permitted to go.
167a65cc53aSPetr Machata
168a65cc53aSPetr Machata	tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M
169a65cc53aSPetr Machata	test_mtu "TC: "
170a65cc53aSPetr Machata	tc qdisc delete dev $swp root
171a65cc53aSPetr Machata}
172a65cc53aSPetr Machata
173a65cc53aSPetr Machatatest_pfc()
174a65cc53aSPetr Machata{
175a65cc53aSPetr Machata	RET=0
176a65cc53aSPetr Machata
1779a1cac06SPetr Machata	dcb ets set dev $swp prio-tc all:0 5:1 6:2 7:3
178a65cc53aSPetr Machata
179a65cc53aSPetr Machata	local buf0size=$(get_buf_size 0)
180a65cc53aSPetr Machata	local buf1size=$(get_buf_size 1)
181a65cc53aSPetr Machata	local buf2size=$(get_buf_size 2)
182a65cc53aSPetr Machata	local buf3size=$(get_buf_size 3)
183a65cc53aSPetr Machata	check_buf_size 0 "> 0"
184a65cc53aSPetr Machata	check_buf_size 1 "> 0"
185a65cc53aSPetr Machata	check_buf_size 2 "> 0"
186a65cc53aSPetr Machata	check_buf_size 3 "> 0"
187a65cc53aSPetr Machata	check_buf_size 4 "== 0"
188a65cc53aSPetr Machata	check_buf_size 5 "== 0"
189a65cc53aSPetr Machata	check_buf_size 6 "== 0"
190a65cc53aSPetr Machata	check_buf_size 7 "== 0"
191a65cc53aSPetr Machata
192a65cc53aSPetr Machata	log_test "Buffer size sans PFC"
193a65cc53aSPetr Machata
194a65cc53aSPetr Machata	RET=0
195a65cc53aSPetr Machata
1969a1cac06SPetr Machata	dcb pfc set dev $swp prio-pfc all:off 5:on 6:on 7:on delay 0
197a65cc53aSPetr Machata
198a65cc53aSPetr Machata	check_prio_pg "0 0 0 0 0 1 2 3 "
199a65cc53aSPetr Machata	check_prio_pfc "0 0 0 0 0 1 1 1 "
200a65cc53aSPetr Machata	check_buf_size 0 "== $buf0size"
201a65cc53aSPetr Machata	check_buf_size 1 "> $buf1size"
202a65cc53aSPetr Machata	check_buf_size 2 "> $buf2size"
203a65cc53aSPetr Machata	check_buf_size 3 "> $buf3size"
204a65cc53aSPetr Machata
205a65cc53aSPetr Machata	local buf1size=$(get_buf_size 1)
206a65cc53aSPetr Machata	check_buf_size 2 "== $buf1size"
207a65cc53aSPetr Machata	check_buf_size 3 "== $buf1size"
208a65cc53aSPetr Machata
209a65cc53aSPetr Machata	log_test "PFC: Cable length 0"
210a65cc53aSPetr Machata
211a65cc53aSPetr Machata	RET=0
212a65cc53aSPetr Machata
2139a1cac06SPetr Machata	dcb pfc set dev $swp delay 1000
214a65cc53aSPetr Machata
215a65cc53aSPetr Machata	check_buf_size 0 "== $buf0size"
216a65cc53aSPetr Machata	check_buf_size 1 "> $buf1size"
217a65cc53aSPetr Machata	check_buf_size 2 "> $buf1size"
218a65cc53aSPetr Machata	check_buf_size 3 "> $buf1size"
219a65cc53aSPetr Machata
220a65cc53aSPetr Machata	log_test "PFC: Cable length 1000"
221a65cc53aSPetr Machata
222a65cc53aSPetr Machata	RET=0
223a65cc53aSPetr Machata
2249a1cac06SPetr Machata	dcb pfc set dev $swp prio-pfc all:off delay 0
2259a1cac06SPetr Machata	dcb ets set dev $swp prio-tc all:0
226a65cc53aSPetr Machata
227a65cc53aSPetr Machata	check_prio_pg "0 0 0 0 0 0 0 0 "
228a65cc53aSPetr Machata	check_prio_tc "0 0 0 0 0 0 0 0 "
229a65cc53aSPetr Machata	check_buf_size 0 "> 0"
230a65cc53aSPetr Machata	check_buf_size 1 "== 0"
231a65cc53aSPetr Machata	check_buf_size 2 "== 0"
232a65cc53aSPetr Machata	check_buf_size 3 "== 0"
233a65cc53aSPetr Machata	check_buf_size 4 "== 0"
234a65cc53aSPetr Machata	check_buf_size 5 "== 0"
235a65cc53aSPetr Machata	check_buf_size 6 "== 0"
236a65cc53aSPetr Machata	check_buf_size 7 "== 0"
237a65cc53aSPetr Machata
238a65cc53aSPetr Machata	log_test "PFC: Restore defaults"
239a65cc53aSPetr Machata}
240a65cc53aSPetr Machata
241a65cc53aSPetr Machatatest_tc_priomap()
242a65cc53aSPetr Machata{
243a65cc53aSPetr Machata	RET=0
244a65cc53aSPetr Machata
2459a1cac06SPetr Machata	dcb ets set dev $swp prio-tc 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7
246a65cc53aSPetr Machata	check_prio_pg "0 1 2 3 4 5 6 7 "
247a65cc53aSPetr Machata
248a65cc53aSPetr Machata	tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M
249a65cc53aSPetr Machata	check_prio_pg "0 0 0 0 0 0 0 0 "
250a65cc53aSPetr Machata
2519a1cac06SPetr Machata	dcb buffer set dev $swp prio-buffer 0:1 1:3 2:5 3:7 4:0 5:2 6:4 7:6
252a65cc53aSPetr Machata	check_prio_pg "1 3 5 7 0 2 4 6 "
253a65cc53aSPetr Machata
254a65cc53aSPetr Machata	tc qdisc delete dev $swp root
255a65cc53aSPetr Machata	check_prio_pg "0 1 2 3 4 5 6 7 "
256a65cc53aSPetr Machata
257a65cc53aSPetr Machata	# Clean up.
258a65cc53aSPetr Machata	tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M
2599a1cac06SPetr Machata	dcb buffer set dev $swp prio-buffer all:0
260a65cc53aSPetr Machata	tc qdisc delete dev $swp root
2619a1cac06SPetr Machata	dcb ets set dev $swp prio-tc all:0
262a65cc53aSPetr Machata
263a65cc53aSPetr Machata	log_test "TC: priomap"
264a65cc53aSPetr Machata}
265a65cc53aSPetr Machata
266a65cc53aSPetr Machatatest_tc_sizes()
267a65cc53aSPetr Machata{
268a65cc53aSPetr Machata	local cell_size=$(devlink_cell_size_get)
269a65cc53aSPetr Machata	local size=$((cell_size * 1000))
270a65cc53aSPetr Machata
271a65cc53aSPetr Machata	RET=0
272a65cc53aSPetr Machata
2739a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0 0:$size 2>/dev/null
274a65cc53aSPetr Machata	check_fail $? "buffer_size should fail before qdisc is added"
275a65cc53aSPetr Machata
276a65cc53aSPetr Machata	tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M
277a65cc53aSPetr Machata
2789a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0 0:$size
279a65cc53aSPetr Machata	check_err $? "buffer_size should pass after qdisc is added"
280a65cc53aSPetr Machata	check_buf_size 0 "== $size" "set size: "
281a65cc53aSPetr Machata
282a65cc53aSPetr Machata	mtu_set $swp 6000
283a65cc53aSPetr Machata	check_buf_size 0 "== $size" "set MTU: "
284a65cc53aSPetr Machata	mtu_restore $swp
285a65cc53aSPetr Machata
2869a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0
287a65cc53aSPetr Machata
288a65cc53aSPetr Machata	# After replacing the qdisc for the same kind, buffer_size still has to
289a65cc53aSPetr Machata	# work.
290a65cc53aSPetr Machata	tc qdisc replace dev $swp root handle 1: bfifo limit 1M
291a65cc53aSPetr Machata
2929a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0 0:$size
293a65cc53aSPetr Machata	check_buf_size 0 "== $size" "post replace, set size: "
294a65cc53aSPetr Machata
2959a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0
296a65cc53aSPetr Machata
297a65cc53aSPetr Machata	# Likewise after replacing for a different kind.
298a65cc53aSPetr Machata	tc qdisc replace dev $swp root handle 2: prio bands 8
299a65cc53aSPetr Machata
3009a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0 0:$size
301a65cc53aSPetr Machata	check_buf_size 0 "== $size" "post replace different kind, set size: "
302a65cc53aSPetr Machata
303a65cc53aSPetr Machata	tc qdisc delete dev $swp root
304a65cc53aSPetr Machata
3059a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0 0:$size 2>/dev/null
306a65cc53aSPetr Machata	check_fail $? "buffer_size should fail after qdisc is deleted"
307a65cc53aSPetr Machata
308a65cc53aSPetr Machata	log_test "TC: buffer size"
309a65cc53aSPetr Machata}
310a65cc53aSPetr Machata
311a65cc53aSPetr Machatatest_int_buf()
312a65cc53aSPetr Machata{
313a65cc53aSPetr Machata	local what=$1; shift
314a65cc53aSPetr Machata
315a65cc53aSPetr Machata	RET=0
316a65cc53aSPetr Machata
317a65cc53aSPetr Machata	local buf0size=$(get_buf_size 0)
318a65cc53aSPetr Machata	local tot_size=$(get_tot_size)
319a65cc53aSPetr Machata
320a65cc53aSPetr Machata	# Size of internal buffer and buffer 9.
321a65cc53aSPetr Machata	local dsize=$((tot_size - buf0size))
322a65cc53aSPetr Machata
323a65cc53aSPetr Machata	tc qdisc add dev $swp clsact
324a65cc53aSPetr Machata	tc filter add dev $swp egress matchall skip_sw action mirred egress mirror dev $swp
325a65cc53aSPetr Machata
326a65cc53aSPetr Machata	local buf0size_2=$(get_buf_size 0)
327a65cc53aSPetr Machata	local tot_size_2=$(get_tot_size)
328a65cc53aSPetr Machata	local dsize_2=$((tot_size_2 - buf0size_2))
329a65cc53aSPetr Machata
330a65cc53aSPetr Machata	# Egress SPAN should have added to the "invisible" buffer configuration.
331a65cc53aSPetr Machata	((dsize_2 > dsize))
332a65cc53aSPetr Machata	check_err $? "Invisible buffers account for '$dsize_2', expected '> $dsize'"
333a65cc53aSPetr Machata
334a65cc53aSPetr Machata	mtu_set $swp 3000
335a65cc53aSPetr Machata
336a65cc53aSPetr Machata	local buf0size_3=$(get_buf_size 0)
337a65cc53aSPetr Machata	local tot_size_3=$(get_tot_size)
338a65cc53aSPetr Machata	local dsize_3=$((tot_size_3 - buf0size_3))
339a65cc53aSPetr Machata
340a65cc53aSPetr Machata	# MTU change might change buffer 0, which will show at total, but the
341a65cc53aSPetr Machata	# hidden buffers should stay the same size.
342a65cc53aSPetr Machata	((dsize_3 == dsize_2))
343a65cc53aSPetr Machata	check_err $? "MTU change: Invisible buffers account for '$dsize_3', expected '== $dsize_2'"
344a65cc53aSPetr Machata
345a65cc53aSPetr Machata	mtu_restore $swp
346a65cc53aSPetr Machata	tc qdisc del dev $swp clsact
347a65cc53aSPetr Machata
348a65cc53aSPetr Machata	# After SPAN removal, hidden buffers should be back to the original sizes.
349a65cc53aSPetr Machata	local buf0size_4=$(get_buf_size 0)
350a65cc53aSPetr Machata	local tot_size_4=$(get_tot_size)
351a65cc53aSPetr Machata	local dsize_4=$((tot_size_4 - buf0size_4))
352a65cc53aSPetr Machata	((dsize_4 == dsize))
353a65cc53aSPetr Machata	check_err $? "SPAN removed: Invisible buffers account for '$dsize_4', expected '== $dsize'"
354a65cc53aSPetr Machata
355a65cc53aSPetr Machata	log_test "${what}internal buffer size"
356a65cc53aSPetr Machata}
357a65cc53aSPetr Machata
358a65cc53aSPetr Machatatest_tc_int_buf()
359a65cc53aSPetr Machata{
360a65cc53aSPetr Machata	local cell_size=$(devlink_cell_size_get)
361a65cc53aSPetr Machata	local size=$((cell_size * 1000))
362a65cc53aSPetr Machata
363a65cc53aSPetr Machata	tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M
364a65cc53aSPetr Machata	test_int_buf "TC: "
365a65cc53aSPetr Machata
3669a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0 0:$size
367a65cc53aSPetr Machata	test_int_buf "TC+buffsize: "
368a65cc53aSPetr Machata
3699a1cac06SPetr Machata	dcb buffer set dev $swp buffer-size all:0
370a65cc53aSPetr Machata	tc qdisc delete dev $swp root
371a65cc53aSPetr Machata}
372a65cc53aSPetr Machata
373*8fcac792SPetr Machatabail_on_lldpad "configure DCB" "configure Qdiscs"
37418d2c710SPetr Machata
37518d2c710SPetr Machatatrap cleanup EXIT
376a65cc53aSPetr Machatasetup_wait
377a65cc53aSPetr Machatatests_run
378a65cc53aSPetr Machata
379a65cc53aSPetr Machataexit $EXIT_STATUS
380