The TX BD length field is 16 bits wide. Limit netmem TX frags to the largest power of 2 which fits, which keeps 4K aligned frags 4K aligned. With 64K pages this already applies to PAGE_SIZE net_iovs, whose 64KB frags would otherwise wrap the BD length to 0 with BIG TCP. Tested on a 50Gb/s NIC: devmem TX from a 2MB hugepage-backed udmabuf runs at line rate with 2-3 frags per 64KB skb, none above 32KB. kperf output (sender side, 1 flow): client: == Source client: Tx 46.358 Gbps (174483046400 bytes in 30110590 usec) client: Rx 0.000 Gbps (0 bytes in 30110590 usec) client: TCP retrans reord rtt rttvar d_ce snd_wnd cwnd client: 729 153 599 48 0 13893632 3147 client: net CPU 71: usr: 0.03% sys: 0.06% idle:67.62% iow: 0.00% irq: 1.12% sirq:31.14% client: app CPU 72: usr: 0.16% sys: 6.01% idle:90.66% iow: 0.00% irq: 0.83% sirq: 2.32% Signed-off-by: Stanislav Fomichev Acked-by: Mina Almasry --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index e7a4190a8c78..c8a887facc20 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -17439,6 +17439,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) if (BNXT_SUPPORTS_QUEUE_API(bp)) dev->queue_mgmt_ops = &bnxt_queue_mgmt_ops; dev->netmem_tx = NETMEM_TX_DMA; + dev->netmem_tx_max_frag_size = SZ_32K; rc = register_netdev(dev); if (rc) -- 2.53.0-Meta