• Kurt Kanzenbach's avatar
    taprio: Handle short intervals and large packets · 497cc002
    Kurt Kanzenbach authored
    When using short intervals e.g. below one millisecond, large packets won't be
    transmitted at all. The software implementations checks whether the packet can
    be fit into the remaining interval. Therefore, it takes the packet length and
    the transmission speed into account. That is correct.
    
    However, for large packets it may be that the transmission time exceeds the
    interval resulting in no packet transmission. The same situation works fine with
    hardware offloading applied.
    
    The problem has been observed with the following schedule and iperf3:
    
    |tc qdisc replace dev lan1 parent root handle 100 taprio \
    |   num_tc 8 \
    |   map 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 \
    |   queues 1@0 1@1 1@2 1@3 1@4 1@5 1@6 1@7 \
    |   base-time $base \
    |   sched-entry S 0x40 500000 \
    |   sched-entry S 0xbf 500000 \
    |   clockid CLOCK_TAI \
    |   flags 0x00
    
    [...]
    
    |root@tsn:~# iperf3 -c 192.168.2.105
    |Connecting to host 192.168.2.105, port 5201
    |[  5] local 192.168.2.121 port 52610 connected to 192.168.2.105 port 5201
    |[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
    |[  5]   0.00-1.00   sec  45.2 KBytes   370 Kbits/sec    0   1.41 KBytes
    |[  5]   1.00-2.00   sec  0.00 Bytes  0.00 bits/sec    0   1.41 KBytes
    
    After debugging, it seems that the packet length stored in the SKB is about
    7000-8000 bytes. Using a 100 Mbit/s link the transmission time is about 600us
    which larger than the interval of 500us.
    
    Therefore, segment the SKB into smaller chunks if the packet is too big. This
    yields similar results than the hardware offload:
    
    |root@tsn:~# iperf3 -c 192.168.2.105
    |Connecting to host 192.168.2.105, port 5201
    |- - - - - - - - - - - - - - - - - - - - - - - - -
    |[ ID] Interval           Transfer     Bitrate         Retr
    |[  5]   0.00-10.00  sec  48.9 MBytes  41.0 Mbits/sec    0             sender
    |[  5]   0.00-10.02  sec  48.7 MBytes  40.7 Mbits/sec                  receiver
    
    Furthermore, the segmentation can be skipped for the full offload case, as the
    driver or the hardware is expected to handle this.
    Signed-off-by: Kurt Kanzenbach's avatarKurt Kanzenbach <kurt@linutronix.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    497cc002
sch_taprio.c 50.8 KB