With MAX_SKB_FRAGS > TX_MAX_FRAGS, the xmit path linearizes skbs with more frags than a packet can have BDs. For GSO skbs, linearizing needs a large allocation, can produce a head which doesn't fit in a BD with BIG TCP, and always fails for unreadable skbs. Clear the GSO features of such skbs in ndo_features_check instead, so that the stack segments them. Non-GSO skbs are still linearized. Suggested-by: Eric Dumazet Link: https://lore.kernel.org/all/CANn89i+ps_CozfOyRnKav0_LUmSekJ9ExB5JkDbTAVf_ss_98g@mail.gmail.com/ Signed-off-by: Stanislav Fomichev --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 757c7266ce15..e7a4190a8c78 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -14300,6 +14300,11 @@ static netdev_features_t bnxt_features_check(struct sk_buff *skb, skb_shinfo(skb)->gso_size)) features &= ~NETIF_F_GSO_MASK; +#if (MAX_SKB_FRAGS > TX_MAX_FRAGS) + if (skb_shinfo(skb)->nr_frags > TX_MAX_FRAGS) + features &= ~NETIF_F_GSO_MASK; +#endif + switch (vlan_get_protocol(skb)) { case htons(ETH_P_IP): if (!skb->encapsulation) -- 2.53.0-Meta