RE: [PATCH v10 1/2] virtio-net: Fix ECN feature descriptions

Parav Pandit <[email protected]> Fri, 17 Oct 2025 11:27:46 +0000
Newsgroups dev.linux.lists.virtio-comment
Message-ID <CY8PR12MB7195DEA3F51BDACD675BFC15DCF6A@CY8PR12MB7195.namprd12.prod.outlook.com>

> From: Ilpo Järvinen <[email protected]>
> Sent: 15 October 2025 11:13 PM
> 
> On Wed, 15 Oct 2025, Parav Pandit wrote:
> 
> >
> >
> > > From: Ilpo Järvinen <[email protected]>
> > > Sent: 15 October 2025 02:05 AM
> > >
> > > On Mon, 13 Oct 2025, Parav Pandit wrote:
> > > > > From: Chia-Yu Chang (Nokia) <[email protected]>
> > > > > Sent: 07 October 2025 02:12 PM
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Ilpo Järvinen <[email protected]>
> > > > > > Sent: Saturday, October 4, 2025 12:05 AM
> > > > > > To: Parav Pandit <[email protected]>
> > > > > > Cc: Chia-Yu Chang (Nokia) <[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]; [email protected];
> > > > > > [email protected];
> > > > > > [email protected]
> > > > > > Subject: RE: [PATCH v10 1/2] virtio-net: Fix ECN feature
> > > > > > descriptions
> > > > > >
> > > > > >
> > > > > > 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, 3 Oct 2025, Parav Pandit wrote:
> > > > > >
> > > > > > > > > > > You described,
> > > > > > > > > > >
> > > > > > > > > > >     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).
> > > > > > > > > > >
> > > > > > > > > > > Based on above commit log, can we say that when
> > > > > > > > > > > existing GSO_ECN is not
> > > > > > > > > > negotiated, ACCECN can work as_is without the patch_2?
> > > > > > > > > > >
> > > > > > > > > > > [1] commit 023af5a72ab16 ("gso: AccECN support")
> > > > > > > > > >
> > > > > > > > > > Indeed, this patch description implies that NIC that
> > > > > > > > > > currently don't support TCP_ECN will naturally support
> ACCECN.
> > > > > > > > > > But an extra TSO_ACCECN flag will make this into an
> > > > > > > > > > explicit requirement, like our patch in the Linux.
> > > > > > > > > >
> > > > > > > > > If so, the 2nd patch should word saying, the device must
> > > > > > > > > not modify IP
> > > > > > > > congestion code point bits and TCP ACE bits.
> > > > > > > > > All packets in the segment offload must have same bits.
> > > > > > > > >
> > > > > > > > > Similarly on RX side for GRO, the device requirement to
> > > > > > > > > spell out that GRO
> > > > > > > > stream to break when two subsequent packets have different
> > > > > > > > bits
> > > etc.
> > > > > > > > >
> > > > > > > > > If you can help to understand why RX side should set
> > > > > > > > > this and how one may
> > > > > > > > plan to use it, it makes sense to define the GUEST bit.
> > > > > > > > > Presently it does not look useful for rx side (guest bit).
> > > > > > > > >
> > > > > > > > > > Related to another email about existing driver, one
> > > > > > > > > > solution would be replace SKB_GSO_TCP_ECN with
> > > > > > > > > > SKB_GSO_TCP_ACCECN,
> > > > > like
> > > > > > > > > > in 4e4f7cefb130af6aba6a393b2d13930b49390df9.
> > > > > > > > > > This can avoid CWR corruption somewhere after GRO, and
> > > > > > > > > > we plan to submit related patches (old driver,
> > > > > > > > > > virtio-related) into net-next after this is approved in virtio-
> spec.
> > > > > > > > >
> > > > > > > > > Commit 4e4f7cefb130a looks incorrect to me, or I must be
> > > > > > > > > missing
> > > > > > > > something.
> > > > > > > > > It looks incorrect to me is because:
> > > > > > > > > 1. SKB_GSO_TCP_ACCECN is set when cwr is set, regardless
> > > > > > > > > of tcp socket
> > > > > > > > following rfc3168 or accecn.
> > > > > > > > > I was hoping to set this flag only when its accecn.
> > > > > > > > >
> > > > > > > > > 2. Even though it is set, it is not read by anyone, so
> > > > > > > > > not sure why one would
> > > > > > > > set it.
> > > > > > > > >
> > > > > > > > > 3. It appears to me that it is TX side flag and rx GRO
> > > > > > > > > should not be setting it,
> > > > > > > > because there isn't rx side code to handle it yet.
> > > > > > > > > May be this is part of some multi series work?
> > > > > > > > >
> > > > > > > > > 4. The commit 4e4f7cefb130a claims to prevent field
> corruption.
> > > > > > > > > A corruption sounds like a bug. And if it is a bug, it
> > > > > > > > > the patch needs fixes tag,
> > > > > > > > but it does not have it.
> > > > > > > > > Probably no fixes tag, because no users, that is strange
> > > > > > > > > kernel code to
> > > > > me.
> > > > > > > >
> > > > > > > > Please let me elaborate more.
> > > > > > > >
> > > > > > > > Patch 023af5a72ab16 is in tcp_gso_segment(), so it
> > > > > > > > disaggregates packet on the TX side after TCP stack.
> > > > > > > > Before patch 023af5a72ab16, CWR flag from the 2nd packet
> > > > > > > > will be cleaned if TSO_ECN is set by RFC3168 ECN in
> > > > > > > > tcp_output.c New TSO_ACCECN will be set by AccECN protocol
> > > > > > > > in tcp_output.c, indicating that this packet does not want
> > > > > > > > CWR flag cleaning from the 2nd
> > > > > packet.
> > > > > > > >
> > > > > > > I understood the commit 023af5a72ab16 and commit looks good
> > > > > > > to
> > > me.
> > > > > > >
> > > > > > > > Patch 4e4f7cefb130a is in tcp_gro_receive(), so it
> > > > > > > > aggregates packets on the RX side before going to TCP stack.
> > > > > > > > And you can see before 4e4f7cefb130a patch, TSO_ECN flag
> > > > > > > > will be set if cwr is 1.
> > > > > > > SKB_GSO_TCP_ACCECN and SKB_GSO_TCP_ECN are mutually
> exclusive.
> > > > > > > So not sure how gro receive commit 4e4f7cefb130a replaces
> > > > > > > TCP_ECN with
> > > > > ACCECN.
> > > > > > >
> > > > > > > But regardless of that, you explain that rx side can set skb
> > > > > > > field based on how device has coalesced the packet, And tx
> > > > > > > side can use the
> > > > > same skb when using tcp/ip stack as router/forwarding unit.
> > > > > > > (instead of terminating/originating tcp connection from the
> socket).
> > > > > > >
> > > > > > > > This TSO_ECN flag implies that it's ok to segment this
> > > > > > > > aggregated packet and clean CWR from the 2nd packets by
> > > > > > > > latter
> > > operations.
> > > > > > > > But this is NOT ok for AccECN protocl, new TSO_ACCECN flag
> > > > > > > > explicitly tells latter operations that it's NOT ok to
> > > > > > > > clean CWR from the
> > > > > 2nd packets.
> > > > > > > >
> > > > > > > Right.
> > > > > > >
> > > > > > > > And the corruption in the commit message means the CWR
> > > > > > > > flag cannot keep the origianl value (i.e., been reset by latter
> operations).
> > > > > > >
> > > > > > > If the code reset the value when it should not, it means it
> > > > > > > was bug and needs fixes tag.
> > > > > >
> > > > > > It was intentional for RFC 3168 ECN offloading to the reset the value.
> > > > > > In the traditional sense it isn't "bug" because it was done
> intentionally.
> > > > > > "When it should not" too, should considered with the
> > > > > > background this
> > > > > offloading feature has (from era when AccECN didn't exists at all).
> > > > > But it's fine to end up disagreeing on this detail about Fixes
> > > > > tag, in any case that commit is immutable now so this discussion
> > > > > is pretty
> > > moot :-).
> > > > > >
> > > > > > > Anyway, I don't want to diverge on the discussion.
> > > > > > >
> > > > > > > Seems like setting SKB_GSO_TCP_ECN seems fine even on rx skb
> too.
> > > > > >
> > > > > > SKB_GSO_TCP_ECN will not replicate the same TCP header flags
> > > > > > in a
> > > > > forwarding scenario:
> > > > > >
> > > > > > Segment 1 CWR set
> > > > > > Segment 2 CWR set
> > > > > >
> > > > > > GRO rx and GSO tx with SKB_GSO_TCP_ECN, after forwarding
> > > > > > outputs these
> > > > > > segments:
> > > > > >
> > > > > > Segment 1 CWR set
> > > > > > Segment 2 CWR cleared
> > > > > >
> > > > > > Thus, the ACE field in Segment 2 no longer contains the same
> > > > > > value as it was
> > > > > sent with.
> > > > > >
> > > > > > As rx side, generally, does not know if the sender is using
> > > > > > AccECN or RFC
> > > > > > 3168 (or some entirely different semantics for these flags as
> > > > > > these TCP
> > > > > features are negotiated). I said "generally" because it would
> > > > > required connection tracking to know it which is expensive and
> > > > > has its
> > > own challenges.
> > > > > >
> > > > > >
> > > > > > If you, on the other hand, imply that SKB_GSO_TCP_ECN could
> > > > > > just become
> > > > > SKB_GSO_TCP_ACCECN just by declaring this corruption a "bug",
> > > > > that too is not possible.
> > > > > >
> > > > > > Or to be more precise, that would mean removing RFC 3168 ECN
> > > > > > offloading
> > > > > support from the tx side (where it may have some, albeit IMO
> > > > > quite limited [*], performance benefits). When we're TX'ing
> > > > > segment the kernel knows originate from RFC 3168 sender as
> > > > > indicated by SKB_GSO_TCP_ECN flag, it can safely perform the RFC
> > > > > 3168 offloading
> > > without fear of corruption.
> > > > > >
> > > > > >
> > > > > > [*] RFC 3168 CWR is only sent once per RTT so those segments
> > > > > > should not
> > > > > appear very frequently. What RFC 3168 offloading does is
> > > > > effectively allow CWR to be send within the same super-skb with
> > > > > non-CWR segments as the RFC 3168 offloading with
> SKB_GSO_TCP_ECN
> > > > > ensures CWR is only sent out in one segment. Without
> > > > > SKB_GSO_TCP_ECN, the sender would have to send CWR segment
> > > > > separately (this potentially comes with a minor performance cost).
> > > > > >
> > > > > > > So you should just refine the wordings for patch 1 and 2 to
> > > > > > > match exactly what it means for virtio spec requiirements
> > > > > > > and description section.
> > > > >
> > > > > Thanks Ilpo for example above, and I just realized that the mail
> > > > > server miss- resend an old email on Sunday, sorry for spamming.
> > > > > And I hope above explanations related to the CWR flag are clear.
> > > > >
> > > > > One more thing I would like to raise is about the ECN flag
> > > > > mentioned in current virtio-spec.
> > > > > As SKB_GSO_TCP_ECN is not related to IP.ECN in RX path even
> > > > > before 4e4f7cefb130a patch, and neither in TX path before
> 023af5a72ab16.
> > > >
> > > > Can you please discuss with the netdev maintainer and clarify the
> > > > usage of
> > > SKB_GSO_TCP_ECN.
> > > > i.e.
> > > > a. does SKB_GSO_TCP_ECN apply to RX side? From the name of "GSO"
> > > > it
> > > does not seem so, but three drivers hns3, mlx5, virtio-net are using
> > > these on the RX.
> > > > If this applies to the RX also, can we please send comment update
> > > > patch to net-next to update, include/linux/skbuff.h
> > > >
> > > > Something like:
> > > >
> > > > --- a/include/linux/skbuff.h
> > > > +++ b/include/linux/skbuff.h
> > > > @@ -671,7 +671,9 @@ enum {
> > > >         /* This indicates the skb is from an untrusted source. */
> > > >         SKB_GSO_DODGY = 1 << 1,
> > > >
> > > > -       /* This indicates the tcp segment has CWR set. */
> > > > +       /* This indicates the first tcp segment has CWR set in GSO
> > > > + or GRO
> > > stream.
> > >
> > > Hi,
> > >
> > > It feels little odd to me to make such a change to a comment now if
> > > the whole point with AccECN is that SKB_GSO_TCP_ECN can no longer be
> > > safely used on the rx side.
> >
> > So SKB_GSO_TCP_ECN will be overloaded where if AccECN is negotiated,
> > GRO stream contains IP+TCP bits as per AccECN
> 
> No, it's not overloaded (in the sense that SKB_GSO_TCP_ECN could be
> interpreted in more than one way). The SKB_GSO_TCP_ECN semantics still
> follow RFC 3168 ECN which results in wrong behavior (corruption of AccECN
> signal).
> 
> > And without accECN negotiated, only the first segment will have ECN bits?
> > If so, can the header comment be updated in such a way?
> 
> If some change is wanted to this, maybe something along these lines:
> 
>  * For Tx, this indicates the first TCP segment has CWR set and any
>  * subsequent segment in the same skb have CWR cleared.
>  *
>  * This cannot be used on Rx because it is not tracked whether the
>  * connection the segment belongs to uses RFC 3168 or Accurate ECN (using
>  * RFC 3168 ECN offloading for AccECN segment may result in corruption of
>  * AccECN signal). Thus, on Rx any CWR flagged segment must use
>  * SKB_GSO_TCP_ACCECN.
> 
Sounds find to me.
I believe virtio-net, mlx5 and hns driver to follow the fix to not set this on rx, once your commit goes through.
Right?

> --
>  i.