[PATCH net] net: stmmac: keep gso_enabled_types in sync with netdev features
Maxime Chevallier
maxime.chevallier at bootlin.com
Tue Aug 11 03:08:25 PDT 2026
Hi Lorenzo,
On 8/8/26 20:00, Lorenzo Bianconi wrote:
> stmmac_set_gso_types() derives priv->gso_enabled_types all-or-nothing
> from NETIF_F_TSO, but stmmac_set_gso_features() advertises NETIF_F_TSO,
> NETIF_F_TSO6 and (on GMAC4) NETIF_F_GSO_UDP_L4 as independently
> toggleable features. Since netdev_fix_features() only ties TSO6 to the
> checksum features, disabling TSO (ethtool -K ethX tx-tcp-segmentation
> off) leaves TSO6 enabled in dev->features while gso_enabled_types
> becomes 0.
>
> For a TCPv6 GSO skb the stack then keeps the frame unsegmented
> (NETIF_F_TSO6 is still set), stmmac_features_check() does not clear the
> GSO mask, and the stmmac_xmit() gate (gso_type & gso_enabled_types) is
> false, so the multi-MSS skb is transmitted through the ordinary
> descriptor path as a single oversized frame.
>
> Derive each GSO type from its own feature bit instead, so the mask stays
> in sync with dev->features and TCPv6 (or UDP L4 on GMAC4) segmentation
> keeps working when only TSO is disabled.
Thanks for tackling this :)
>
> Fixes: 2e4082e4b739 ("net: stmmac: simplify GSO/TSO test in stmmac_xmit()")
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi at oss.qualcomm.com>
> ---
> drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 24 ++++++++++++-----------
> 1 file changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> index a71f0df26378..3d3042afcdf4 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> @@ -4371,16 +4371,18 @@ static void stmmac_flush_tx_descriptors(struct stmmac_priv *priv, int queue)
> stmmac_set_queue_tx_tail_ptr(priv, tx_q, queue, tx_q->cur_tx);
> }
>
> -static void stmmac_set_gso_types(struct stmmac_priv *priv, bool tso)
> +static void stmmac_set_gso_types(struct stmmac_priv *priv,
> + netdev_features_t features)
> {
> - if (!tso) {
> - priv->gso_enabled_types = 0;
> - } else {
> - /* Manage oversized TCP frames for GMAC4 device */
> - priv->gso_enabled_types = SKB_GSO_TCPV4 | SKB_GSO_TCPV6;
> - if (priv->plat->core_type == DWMAC_CORE_GMAC4)
> - priv->gso_enabled_types |= SKB_GSO_UDP_L4;
> - }
> + priv->gso_enabled_types = 0;
> +
> + if (features & NETIF_F_TSO)
> + priv->gso_enabled_types |= SKB_GSO_TCPV4;
> + if (features & NETIF_F_TSO6)
> + priv->gso_enabled_types |= SKB_GSO_TCPV6;
> + /* Manage oversized UDP frames for GMAC4 devices */
> + if (features & NETIF_F_GSO_UDP_L4)
> + priv->gso_enabled_types |= SKB_GSO_UDP_L4;
> }
Sashiko says this could be racy, as there's a short window where the enabled_types is 0.
Maxime
More information about the linux-arm-kernel
mailing list