Patch "igc: No strict mode in pure launchtime/CBS offload" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    igc: No strict mode in pure launchtime/CBS offload

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     igc-no-strict-mode-in-pure-launchtime-cbs-offload.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 61956d16d51fe7d6d2b7ae9f849d0920cdfc2e00
Author: Florian Kauer <florian.kauer@xxxxxxxxxxxxx>
Date:   Wed Jun 14 16:07:12 2023 +0200

    igc: No strict mode in pure launchtime/CBS offload
    
    [ Upstream commit 8b86f10ab64eca0287ea8f7c94e9ad8b2e101c01 ]
    
    The flags IGC_TXQCTL_STRICT_CYCLE and IGC_TXQCTL_STRICT_END
    prevent the packet transmission over slot and cycle boundaries.
    This is important for taprio offload where the slots and
    cycles correspond to the slots and cycles configured for the
    network.
    
    However, the Qbv offload feature of the i225 is also used for
    enabling TX launchtime / ETF offload. In that case, however,
    the cycle has no meaning for the network and is only used
    internally to adapt the base time register after a second has
    passed.
    
    Enabling strict mode in this case would unnecessarily prevent
    the transmission of certain packets (i.e. at the boundary of a
    second) and thus interferes with the ETF qdisc that promises
    transmission at a certain point in time.
    
    Similar to ETF, this also applies to CBS offload that also should
    not be influenced by strict mode unless taprio offload would be
    enabled at the same time.
    
    This fully reverts
    commit d8f45be01dd9 ("igc: Use strict cycles for Qbv scheduling")
    but its commit message only describes what was already implemented
    before that commit. The difference to a plain revert of that commit
    is that it now copes with the base_time = 0 case that was fixed with
    commit e17090eb2494 ("igc: allow BaseTime 0 enrollment for Qbv")
    
    In particular, enabling strict mode leads to TX hang situations
    under high traffic if taprio is applied WITHOUT taprio offload
    but WITH ETF offload, e.g. as in
    
        sudo tc qdisc replace dev enp1s0 parent root handle 100 taprio \
                num_tc 1 \
                map 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \
                queues 1@0 \
                base-time 0 \
                sched-entry S 01 300000 \
                flags 0x1 \
                txtime-delay 500000 \
                clockid CLOCK_TAI
        sudo tc qdisc replace dev enp1s0 parent 100:1 etf \
                clockid CLOCK_TAI \
                delta 500000 \
                offload \
                skip_sock_check
    
    and traffic generator
    
        sudo trafgen -i traffic.cfg -o enp1s0 --cpp -n0 -q -t1400ns
    
    with traffic.cfg
    
        #define ETH_P_IP        0x0800
    
        {
          /* Ethernet Header */
          0x30, 0x1f, 0x9a, 0xd0, 0xf0, 0x0e,  # MAC Dest - adapt as needed
          0x24, 0x5e, 0xbe, 0x57, 0x2e, 0x36,  # MAC Src  - adapt as needed
          const16(ETH_P_IP),
    
          /* IPv4 Header */
          0b01000101, 0,   # IPv4 version, IHL, TOS
          const16(1028),   # IPv4 total length (UDP length + 20 bytes (IP header))
          const16(2),      # IPv4 ident
          0b01000000, 0,   # IPv4 flags, fragmentation off
          64,              # IPv4 TTL
          17,              # Protocol UDP
          csumip(14, 33),  # IPv4 checksum
    
          /* UDP Header */
          10,  0, 48, 1,   # IP Src - adapt as needed
          10,  0, 48, 10,  # IP Dest - adapt as needed
          const16(5555),   # UDP Src Port
          const16(6666),   # UDP Dest Port
          const16(1008),   # UDP length (UDP header 8 bytes + payload length)
          csumudp(14, 34), # UDP checksum
    
          /* Payload */
          fill('W', 1000),
        }
    
    and the observed message with that is for example
    
     igc 0000:01:00.0 enp1s0: Detected Tx Unit Hang
       Tx Queue             <0>
       TDH                  <d0>
       TDT                  <f0>
       next_to_use          <f0>
       next_to_clean        <d0>
     buffer_info[next_to_clean]
       time_stamp           <ffff661f>
       next_to_watch        <00000000245a4efb>
       jiffies              <ffff6e48>
       desc.status          <1048000>
    
    Fixes: d8f45be01dd9 ("igc: Use strict cycles for Qbv scheduling")
    Signed-off-by: Florian Kauer <florian.kauer@xxxxxxxxxxxxx>
    Reviewed-by: Kurt Kanzenbach <kurt@xxxxxxxxxxxxx>
    Tested-by: Naama Meir <naamax.meir@xxxxxxxxxxxxxxx>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/intel/igc/igc_tsn.c b/drivers/net/ethernet/intel/igc/igc_tsn.c
index b76ebfc10b1d5..a9c08321aca90 100644
--- a/drivers/net/ethernet/intel/igc/igc_tsn.c
+++ b/drivers/net/ethernet/intel/igc/igc_tsn.c
@@ -132,8 +132,28 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter)
 		wr32(IGC_STQT(i), ring->start_time);
 		wr32(IGC_ENDQT(i), ring->end_time);
 
-		txqctl |= IGC_TXQCTL_STRICT_CYCLE |
-			IGC_TXQCTL_STRICT_END;
+		if (adapter->taprio_offload_enable) {
+			/* If taprio_offload_enable is set we are in "taprio"
+			 * mode and we need to be strict about the
+			 * cycles: only transmit a packet if it can be
+			 * completed during that cycle.
+			 *
+			 * If taprio_offload_enable is NOT true when
+			 * enabling TSN offload, the cycle should have
+			 * no external effects, but is only used internally
+			 * to adapt the base time register after a second
+			 * has passed.
+			 *
+			 * Enabling strict mode in this case would
+			 * unnecessarily prevent the transmission of
+			 * certain packets (i.e. at the boundary of a
+			 * second) and thus interfere with the launchtime
+			 * feature that promises transmission at a
+			 * certain point in time.
+			 */
+			txqctl |= IGC_TXQCTL_STRICT_CYCLE |
+				IGC_TXQCTL_STRICT_END;
+		}
 
 		if (ring->launchtime_enable)
 			txqctl |= IGC_TXQCTL_QUEUE_MODE_LAUNCHT;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux