Skip to content

Commit 71a753c

Browse files
author
Shruti Parab
committed
bnxt_en: Linearize TX SKB if the fragments exceed the max
JIRA: https://issues.redhat.com/browse/RHEL-76565 commit b91e821 Author: Michael Chan <michael.chan@broadcom.com> Date: Fri Mar 21 14:16:39 2025 -0700 bnxt_en: Linearize TX SKB if the fragments exceed the max If skb_shinfo(skb)->nr_frags excceds what the chip can support, linearize the SKB and warn once to let the user know. net.core.max_skb_frags can be lowered, for example, to avoid the issue. Fixes: 3948b05 ("net: introduce a config option to tweak MAX_SKB_FRAGS") Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com> Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20250321211639.3812992-3-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Shruti Parab <shruti.parab@broadcom.com>
1 parent 50f0260 commit 71a753c

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,17 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
485485
txr = &bp->tx_ring[bp->tx_ring_map[i]];
486486
prod = txr->tx_prod;
487487

488+
#if (MAX_SKB_FRAGS > TX_MAX_FRAGS)
489+
if (skb_shinfo(skb)->nr_frags > TX_MAX_FRAGS) {
490+
netdev_warn_once(dev, "SKB has too many (%d) fragments, max supported is %d. SKB will be linearized.\n",
491+
skb_shinfo(skb)->nr_frags, TX_MAX_FRAGS);
492+
if (skb_linearize(skb)) {
493+
dev_kfree_skb_any(skb);
494+
dev_core_stats_tx_dropped_inc(dev);
495+
return NETDEV_TX_OK;
496+
}
497+
}
498+
#endif
488499
free_size = bnxt_tx_avail(bp, txr);
489500
if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) {
490501
/* We must have raced with NAPI cleanup */

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ struct tx_bd {
8484

8585
#define TX_BD_CNT(n) (((n) << TX_BD_FLAGS_BD_CNT_SHIFT) & TX_BD_FLAGS_BD_CNT)
8686

87+
#define TX_MAX_BD_CNT 32
88+
89+
#define TX_MAX_FRAGS (TX_MAX_BD_CNT - 2)
90+
8791
struct tx_bd_ext {
8892
__le32 tx_bd_hsize_lflags;
8993
#define TX_BD_FLAGS_TCP_UDP_CHKSUM (1 << 0)

0 commit comments

Comments
 (0)