Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcm63xx: fix Tx cleanup when NAPI poll budget is zero

NAPI poll() function may be passed a budget value of zero, i.e. during
netpoll, which isn't NAPI context.
Therefore, napi_consume_skb() must be given budget value instead of
!force to truly discern netpoll-like scenarios.

Fixes: c63c615e22eb ("bcm63xx_enet: switch to napi_build_skb() to reuse skbuff_heads")
Signed-off-by: Sieng-Piaw Liew <liew.s.piaw@gmail.com>
Link: https://lore.kernel.org/r/20220708080303.298-1-liew.s.piaw@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Sieng-Piaw Liew and committed by
Jakub Kicinski
10c8fd2f b205c1b4

+5 -5
+5 -5
drivers/net/ethernet/broadcom/bcm63xx_enet.c
··· 423 423 /* 424 424 * try to or force reclaim of transmitted buffers 425 425 */ 426 - static int bcm_enet_tx_reclaim(struct net_device *dev, int force) 426 + static int bcm_enet_tx_reclaim(struct net_device *dev, int force, int budget) 427 427 { 428 428 struct bcm_enet_priv *priv; 429 429 unsigned int bytes; ··· 468 468 dev->stats.tx_errors++; 469 469 470 470 bytes += skb->len; 471 - napi_consume_skb(skb, !force); 471 + napi_consume_skb(skb, budget); 472 472 released++; 473 473 } 474 474 ··· 499 499 ENETDMAC_IR, priv->tx_chan); 500 500 501 501 /* reclaim sent skb */ 502 - bcm_enet_tx_reclaim(dev, 0); 502 + bcm_enet_tx_reclaim(dev, 0, budget); 503 503 504 504 spin_lock(&priv->rx_lock); 505 505 rx_work_done = bcm_enet_receive_queue(dev, budget); ··· 1211 1211 bcm_enet_disable_mac(priv); 1212 1212 1213 1213 /* force reclaim of all tx buffers */ 1214 - bcm_enet_tx_reclaim(dev, 1); 1214 + bcm_enet_tx_reclaim(dev, 1, 0); 1215 1215 1216 1216 /* free the rx buffer ring */ 1217 1217 bcm_enet_free_rx_buf_ring(kdev, priv); ··· 2362 2362 bcm_enet_disable_dma(priv, priv->rx_chan); 2363 2363 2364 2364 /* force reclaim of all tx buffers */ 2365 - bcm_enet_tx_reclaim(dev, 1); 2365 + bcm_enet_tx_reclaim(dev, 1, 0); 2366 2366 2367 2367 /* free the rx buffer ring */ 2368 2368 bcm_enet_free_rx_buf_ring(kdev, priv);