aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRaju Rangoju <Raju.Rangoju@amd.com>2025-11-29 23:20:16 +0530
committerJakub Kicinski <kuba@kernel.org>2025-12-01 14:30:06 -0800
commitab96af7004c76de5fdca077b1e3732a7ec96f69b (patch)
tree672598495c6221dd7dac84278640f5e04d43f217 /drivers
parentc3b744fd20191963f1739498446b5efb812c99d8 (diff)
downloadlinux-ab96af7004c76de5fdca077b1e3732a7ec96f69b.tar.gz
amd-xgbe: schedule NAPI on Rx Buffer Unavailable (RBU)
Under heavy load, Rx Buffer Unavailable (RBU) can occur if Rx processing is slower than network. When an RBU is signaled, try to schedule NAPI to help recover from such situation (including cases where an IRQ may be missed or such) Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com> Link: https://patch.msgid.link/20251129175016.3034185-3-Raju.Rangoju@amd.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-drv.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
index aca1c57554d709..3ddd896d698774 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
@@ -410,15 +410,29 @@ static void xgbe_isr_bh_work(struct work_struct *work)
* Decide which NAPI to use and whether to schedule:
* - When not using per-channel IRQs: schedule on global NAPI
* if TI or RI are set.
+ * - RBU should also trigger NAPI (either per-channel or global)
+ * to allow refill.
*/
if (!per_ch_irq && (ti || ri))
schedule_napi = true;
+ if (rbu) {
+ schedule_napi = true;
+ pdata->ext_stats.rx_buffer_unavailable++;
+ }
+
napi = per_ch_irq ? &channel->napi : &pdata->napi;
if (schedule_napi && napi_schedule_prep(napi)) {
/* Disable interrupts appropriately before polling */
- xgbe_disable_rx_tx_ints(pdata);
+ if (per_ch_irq) {
+ if (pdata->channel_irq_mode)
+ xgbe_disable_rx_tx_int(pdata, channel);
+ else
+ disable_irq_nosync(channel->dma_irq);
+ } else {
+ xgbe_disable_rx_tx_ints(pdata);
+ }
/* Turn on polling */
__napi_schedule(napi);
@@ -436,9 +450,6 @@ static void xgbe_isr_bh_work(struct work_struct *work)
XGMAC_SET_BITS(dma_ch_isr, DMA_CH_SR, RI, 0);
}
- if (rbu)
- pdata->ext_stats.rx_buffer_unavailable++;
-
/* Restart the device on a Fatal Bus Error */
if (fbe)
schedule_work(&pdata->restart_work);