Thread (14 messages) 14 messages, 5 authors, 2020-01-20

RE: [PATCH iproute2-next] taprio: Add support for the SetAndHold and SetAndRelease commands

From: Jose Abreu <Jose.Abreu@synopsys.com>
Date: 2020-01-20 09:18:30

From: Murali Karicheri <redacted>
Date: Jan/17/2020, 22:18:07 (UTC+00:00)
Hi Jose,

On 01/07/2020 04:27 AM, Jose Abreu wrote:
quoted
From: Murali Karicheri <redacted>
Date: Jan/03/2020, 22:24:14
(UTC+00:00)
quoted
So you have one sched entry that specify SetAndHold for all remaining
queues. So this means, queue 0 will never get sent. I guess you also
support SetAndRelease so that a mix of SetAndHold followed by
SetAndRelease can be sent to enable sending from Queue 0. Is that
correct?

Something like
                sched-entry H 02 300000 \ <=== 300 usec tx from Q1
                sched-entry R 01 200000   <=== 300 usec tx from Q0

Just trying to understand how this is being used for real world
application.
This is the command I use:

# tc qdisc add dev $intf handle 100: parent root taprio \
	num_tc 4 \
	map 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \
	base-time $base \
	cycle-time 1000000 \
	sched-entry R 00 100000 \
	sched-entry H 02 200000 \
	sched-entry H 04 300000 \
	sched-entry H 08 400000 \
	flags 0x2
# sleep 2
# iperf3 -c <ip> -u -b 0 -t 15 &
# sleep 5
# echo "Queue 3: Expected=40%, Queue 0 will now be preempted"
# tperf -i <ethX> -p 3

This will basically preempt Queue 0 and flood Queue 3 with express
traffic.
I see you don't include Q0 in your schedule. Why is that the case?

Why is the entry with zero mask introduced (first entry)? Typo?
I thought it should be like below. No?

 > # tc qdisc add dev $intf handle 100: parent root taprio \
 > 	num_tc 4 \
 > 	map 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \
 > 	base-time $base \
 > 	cycle-time 1000000 \
 > 	sched-entry R 01 100000 \
 > 	sched-entry H 02 200000 \
 > 	sched-entry H 04 300000 \
 > 	sched-entry H 08 400000 \
 > 	flags 0x2

Based on my understanding, if holdAdvance is t1 and releaseAdvance is
t2, hold is asserted t1 nano second before Q1 slot (during first
entry) begins and release is asserted t2 nano second before the start of
Q0 slot (during fourth entry) so that pre-emptable frame start 
transmission during first entry.

I thought R/H entries are a replacement for zero mask entry that
are introduced in the schedule as a guard band before express queue
slot when frame pre-emption not supported. Is my understanding correct?

So the above make sense?
You are right, my example was an old one, sorry.

This is what I'm currently using:

[...]
cycle-time 1000000 \
sched-entry R 02 200000 \
sched-entry R 04 400000 \
sched-entry H 08 400000 \
[...]

Notice I don't need to set Queue 0 on sched-entry because its always 
preemptable queue.

Then I test it with:
# echo "Queue 0: Exp=60%"
# iperf3 -t 15 -c <ip> -Z -A <cpu> &
# sleep 5
# echo "Queue 3: Exp=40%"
# tperf -i <interface> -p 3 -c <cpu>

This will result in:
- iperf will have 60% of bandwidth because Queue 0-2 have 400 + 200 = 60% 
cycle time
- tperf will have 40% of bandwidth because Queue 3 has 40% cycle time and 
is express Queue

---
Thanks,
Jose Miguel Abreu
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help