RE: [PATCH v5 net-next 1/2] net: update comments for SKB_GSO_TCP_ECN and SKB_GSO_TCP_ACCECN
"Chia-Yu Chang (Nokia)" <[email protected]>
| Newsgroups | dev.linux.lists.virtualization,org.kernel.vger.bpf,org.kernel.vger.linux-doc,org.kernel.vger.linux-kselftest,org.kernel.vger.linux-rdma,org.kernel.vger.netdev |
|---|---|
| Message-ID | <PAXPR07MB7984B2EF73D0D45A792F25A9A3AE2@PAXPR07MB7984.eurprd07.prod.outlook.com> |
-----Original Message----- From: Willem de Bruijn <[email protected]> Sent: Tuesday, August 25, 2026 6:12 PM To: Chia-Yu Chang (Nokia) <[email protected]>; Willem de Bruijn <[email protected]>; Jakub Kicinski <[email protected]> Cc: Mirja Kuehlewind <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Koen De Schepper (Nokia) <[email protected]>; [email protected]; Ingemar Johansson S <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; Parav Pandit <[email protected]>; Willem de Bruijn <[email protected]>; [email protected] Subject: RE: [PATCH v5 net-next 1/2] net: update comments for SKB_GSO_TCP_ECN and SKB_GSO_TCP_ACCECN CAUTION: This is an external email. Please be very careful when clicking links or opening attachments. See the URL nok.it/ext for additional information. > > > > On Fri, 14 Aug 2026 09:34:01 -0400 Willem de Bruijn wrote: > > > > > > Current SW GRO sets SKB_GSO_TCP_ACCECN when the flushed skb carries CWR in tcp_gro_complete(): > > > > > > if (th->cwr) > > > > > > shinfo->gso_type |= SKB_GSO_TCP_ACCECN; > > > > > > > > > > And I suppose it follows correct AccECN rules for coalescing. > > > > > > > > > > That is a performance regression from RFC 3168 ECN, as it allows > > > > > for less effective coalescing. I have no intuition how much it > > > > > will differ in practice. > > > > > > > > > > > For HW GRO of a legacy device that implementing RFC3168 semantics, setting SKB_GSO_TCP_ECN seems reasonable. > > > > > > However, such a device would not be able to preserve ACCECN signaling across the GRO/GSO. > > > > > > In that case, if preserving AccECN signaling is required, disabling HW GRO may indeed be necessary. > > > > > > > > > > Right. > > > > > > > > I'm still not following.. Maybe Willem can ELI5 what the problem is. > > > > > > > > _SW_ GRO follows only the AccECN rules. > > > > But if HW GRO follows RFC 3168 and we mark the aggregate as > > > > SKB_GSO_TCP_ECN - TSO will also abide, and segmented output will > > > > be identical to pre-GRO input. > > > > > > +1 > > > > > > > Are we trying to ban RFC 3168 behavior in HW purely to match SW? > > > > > > I think that's the intent here? > > Hi Willem, > > > > I think we can still change SKB_GSO_TCP_ECN into SKB_GSO_TCP_ACCECN on the RX path, even if HW GRO and SW GRO use different aggregation rules. > > Currently, SW GRO flushes when the CWR state changes and sets SKB_GSO_TCP_ACCECN when the resulting skb carries CWR=1. > > > > > > For HW GRO, if the device flushes immediately when a CWR=1 packet arrives, there is no need to set either SKB_GSO_TCP_ECN or SKB_GSO_TCP_ACCECN. > > In that case, each CWR=1 packet is emitted separately, and there is no need to preserve multiple CWR indications through GSO. > > So, if the HW can be confirmed to always flush CWR-marked packets without coalescing them, preserving multiple CWR indications through GSO is not required. > > In that case, using SKB_GSO_TCP_ACCECN would not provide any additional benefit. > > I agree. > > The difference on transmit is that SKB_GSO_TCP_ACCECN will copy the ECN bits to every segment, whereas SKB_GSO_TCP_ECN will only set the bits on the first segment. > > From commit 023af5a72ab1 ("gso: AccECN support") that introduced > SKB_GSO_TCP_ACCECN: > > With RFC 3168 ECN aware TSO (NETIF_F_TSO_ECN) CWR flag is cleared > starting from 2nd segment which is incompatible how AccECN handles > the CWR flag. Such super-segments are indicated by SKB_GSO_TCP_ECN. > With AccECN, CWR flag (or more accurately, the ACE field that also > includes ECE & AE flags) changes only when new packet(s) with CE > mark arrives so the flag should not be changed within a super-skb. > > Makes me wonder what SKB_GS_TCP_ACCECN adds. Copying bits from the GSO skb to all segments is the default. SKB_GSO_TCP_ECN is an indication that the NIC knows how to diverge from this default for these specific bits. > > That commit confirms this: > > If NIC is completely unaware of RFC3168 ECN (doesn't support > NETIF_F_TSO_ECN) or its TSO engine can be set to not touch CWR flag > despite supporting also NETIF_F_TSO_ECN, TSO could be safely used > with AccECN on such NIC. This should be evaluated per NIC basis > (not done in this patch series for any NICs).` > > > > > The problematic case is when a HW GRO aggregates multiple packets carrying CWR=1 and only sets SKB_GSO_TCP_ECN. > > The driver of such a device could be updated to set SKB_GSO_TCP_ACCECN or not set any such ECN GSO flag. > > The driver of other devices that do follow RFC 3168 semantics will continue to have to set SKB_GSO_TCP_ECN on the GSO skb. It is quite plausible that few or no devices currently support ECN in their HW-GRO coalescing. > Yes, I agree. In another email I was asking Jijie how their hns3 HW-GRO handles CWR-marked packets. If their device flushes immediately when a CWR=1 packet arrives, then the SKB_GSO_TCP_ECN handling in hns3_enet.c may not be necessary. In that case, each CWR-marked packet is emitted separately and there may be no need to use either SKB_GSO_TCP_ACCECN or SKB_GSO_TCP_ECN. If their HW-GRO can coalesce multiple CWR=1 packets, flagging the resulting skb with SKB_GSO_TCP_ECN would lose AccECN information during segmentation. In that case, the skb should either carry SKB_GSO_TCP_ACCECN, or no ECN GSO flag at all if the segmentation engine preserves the CWR signaling unchanged. > > During GSO, only the first output segment would carry CWR=1, which loses the remaining CWR signaling information required by AccECN. > > In that case, changing from SKB_GSO_TCP_ECN to SKB_GSO_TCP_ACCECN would preserve the original signaling by ensuring that the segmented packets carry the correct CWR information. > > As I understand RFC3168, receiving additional CWR-marked packets is harmless, because once a valid CWR has been received, the receiver already stops echoing ECE. > > Agreed. > > > Additional CWR indications do not change the receiver state. > > This would have a performance impact since it disables HW TSO for the skb and falls back to software segmentation. > > You mean if the device advertises NETIF_F_TSO_ECN, and GSO skbs may contain AccECN signals, the host must downgrade from TSO to GSO to avoid corrupting the signal? > > The cost of that would be significant. Not something to do for established environments. But technically seemingly correct, at least for packets with non-zero ECN bits. Yes, this is what I mean. And I agree the cost would not be small. So, I am thinking of first checking the existing drivers that still use SKB_GSO_TCP_ECN. So far I have only found hns3_enet. I also plan to update the comments for SKB_GSO_TCP_ECN and SKB_GSO_TCP_ACCECN in include/linux/skbuff.h to capture the conclusions from this discussion. Then we can at least clarify the expected semantics and review whether the existing HW-GRO implementations and drivers are consistent with them. Also, patch 6f74bc8b6e8d0 already added a flags_cwr GRO test, which may be useful when reviewing the expected behavior of future HW-GRO implementations. > > > But IMO it preserves correctness for both RFC3168 ECN and AccECN. > > Side-note: this thread probably has way too many Cc: for this narrow topic.