Re: [PATCH v4 net-next 01/10] net: introduce mangleid_features
From: Eric Dumazet <edumazet@google.com>
Date: 2026-01-20 08:58:54
On Mon, Jan 19, 2026 at 4:10 PM Paolo Abeni [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Some/most devices implementing gso_partial need to disable the GSO partial features when the IP ID can't be mangled; to that extend each of them implements something alike the following[1]: if (skb->encapsulation && !(features & NETIF_F_TSO_MANGLEID)) features &= ~NETIF_F_TSO; in the ndo_features_check() op, which leads to a bit of duplicate code. Later patch in the series will implement GSO partial support for virtual devices, and the current status quo will require more duplicate code and a new indirect call in the TX path for them. Introduce the mangleid_features mask, allowing the core to disable NIC features based on/requiring MANGLEID, without any further intervention from the driver. The same functionality could be alternatively implemented adding a single boolean flag to the struct net_device, but would require an additional checks in ndo_features_check(). Also note that [1] is incorrect if the NIC additionally implements NETIF_F_GSO_UDP_L4, mangleid_features transparently handle even such a case. Signed-off-by: Paolo Abeni <pabeni@redhat.com> --- v3 -> v4: - ensure mangleid_features includes TSO_MANGLEID for better code in gso_features_check() - Eric - some changelog clarifications. --- include/linux/netdevice.h | 5 ++++- net/core/dev.c | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-)diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index d99b0fbc1942..23a698b70de1 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h@@ -1830,7 +1830,9 @@ enum netdev_reg_state { * and drivers will need to set them appropriately. * * @mpls_features: Mask of features inheritable by MPLS - * @gso_partial_features: value(s) from NETIF_F_GSO\* + * @gso_partial_features: value(s) from NETIF_F_GSO + * @mangleid_features: Mask of features requiring MANGLEID, will be + * disabled together with the latter. * * @ifindex: interface index * @group: The group the device belongs to@@ -2219,6 +2221,7 @@ struct net_device { netdev_features_t vlan_features; netdev_features_t hw_enc_features; netdev_features_t mpls_features; + netdev_features_t mangleid_features; unsigned int min_mtu; unsigned int max_mtu;diff --git a/net/core/dev.c b/net/core/dev.c index 2661b68f5be3..3f12061ae474 100644 --- a/net/core/dev.c +++ b/net/core/dev.c@@ -3802,7 +3802,7 @@ static netdev_features_t gso_features_check(const struct sk_buff *skb, inner_ip_hdr(skb) : ip_hdr(skb); if (!(iph->frag_off & htons(IP_DF))) - features &= ~NETIF_F_TSO_MANGLEID; + features &= ~dev->mangleid_features; } /* NETIF_F_IPV6_CSUM does not support IPv6 extension headers,@@ -11385,6 +11385,12 @@ int register_netdevice(struct net_device *dev) if (dev->hw_enc_features & NETIF_F_TSO) dev->hw_enc_features |= NETIF_F_TSO_MANGLEID; + /* Any mangleid feature disables TSO_MANGLEID; including the latter + * in mangleid_features allows for better code in the fastpath. + */ + if (dev->mangleid_features) + dev->mangleid_features |= NETIF_F_TSO_MANGLEID; +
It is a bit unclear why you test for anything being set in mangleid_features
I would force here the bit, without any condition ?
dev->mangleid_features |= NETIF_F_TSO_MANGLEID;
/* Make NETIF_F_HIGHDMA inheritable to VLAN devices.
*/
dev->vlan_features |= NETIF_F_HIGHDMA;
--
2.52.0