Skip to content

Commit 8b86f10

Browse files
koaloanguy11
authored andcommitted
igc: No strict mode in pure launchtime/CBS offload
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 d8f45be ("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 e17090e ("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: d8f45be ("igc: Use strict cycles for Qbv scheduling") Signed-off-by: Florian Kauer <[email protected]> Reviewed-by: Kurt Kanzenbach <[email protected]> Tested-by: Naama Meir <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent e5d88c5 commit 8b86f10

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

drivers/net/ethernet/intel/igc/igc_tsn.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,28 @@ static int igc_tsn_enable_offload(struct igc_adapter *adapter)
132132
wr32(IGC_STQT(i), ring->start_time);
133133
wr32(IGC_ENDQT(i), ring->end_time);
134134

135-
txqctl |= IGC_TXQCTL_STRICT_CYCLE |
136-
IGC_TXQCTL_STRICT_END;
135+
if (adapter->taprio_offload_enable) {
136+
/* If taprio_offload_enable is set we are in "taprio"
137+
* mode and we need to be strict about the
138+
* cycles: only transmit a packet if it can be
139+
* completed during that cycle.
140+
*
141+
* If taprio_offload_enable is NOT true when
142+
* enabling TSN offload, the cycle should have
143+
* no external effects, but is only used internally
144+
* to adapt the base time register after a second
145+
* has passed.
146+
*
147+
* Enabling strict mode in this case would
148+
* unnecessarily prevent the transmission of
149+
* certain packets (i.e. at the boundary of a
150+
* second) and thus interfere with the launchtime
151+
* feature that promises transmission at a
152+
* certain point in time.
153+
*/
154+
txqctl |= IGC_TXQCTL_STRICT_CYCLE |
155+
IGC_TXQCTL_STRICT_END;
156+
}
137157

138158
if (ring->launchtime_enable)
139159
txqctl |= IGC_TXQCTL_QUEUE_MODE_LAUNCHT;

0 commit comments

Comments
 (0)