Re: [PATCH v2] net: stmmac: xgmac2: disable RBUE in default RX interrupt mask

From: Simon Horman

Date: Mon Jun 08 2026 - 12:00:29 EST


From: 'Simon Horman' <horms@xxxxxxxxxx>

This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
Full review at: https://sashiko.dev
---
net: stmmac: xgmac2: disable RBUE in default RX interrupt mask

This commit removes the RX Buffer Unavailable (RBUE) interrupt from the
default enable masks for XGMAC2 devices. This is intended to prevent MAC
interrupt storms that can occur under heavy RX pressure when the DMA
runs out of RX descriptors.

> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h
> index 51943705a2b03..b5fdc253a2f24 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h
> @@ -379,9 +379,9 @@
> #define XGMAC_RIE BIT(6)
> #define XGMAC_TBUE BIT(2)
> #define XGMAC_TIE BIT(0)
> -#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | XGMAC_RBUE | \
> +#define XGMAC_DMA_INT_DEFAULT_EN (XGMAC_NIE | XGMAC_AIE | \
> XGMAC_RIE | XGMAC_TIE)
> -#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RBUE | XGMAC_RIE)
> +#define XGMAC_DMA_INT_DEFAULT_RX (XGMAC_RIE)

[Severity: High]
Does removing the RBUE interrupt break the driver's ability to recover from
RX out-of-memory conditions, leading to a permanent RX queue stall?

When stmmac_rx() processes packets, it calls stmmac_rx_refill() to replenish
the ring descriptors. If page_pool_alloc_pages() fails due to memory
pressure, the descriptors remain empty:

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c:stmmac_rx_refill() {
...
buf->page = page_pool_alloc_pages(rx_q->page_pool, gfp);
if (!buf->page)
break;
...
}

stmmac_rx() then returns the number of processed packets, which will be
less than the NAPI budget if the ring is empty. This causes
stmmac_napi_poll_rx() to complete NAPI and re-enable interrupts:

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c:stmmac_napi_poll_rx() {
...
work_done = stmmac_rx(priv, budget, chan);
if (work_done < budget && napi_complete_done(napi, work_done)) {
...
stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 0);
}
...
}

When the hardware subsequently tries to receive a packet, it finds no
descriptors and enters the Receive Buffer Unavailable (RBU) state. By
removing XGMAC_RBUE from the RX interrupt enable mask, the MAC will no
longer trigger an interrupt for the RBU state.

Because no packets can be successfully received without descriptors, the
normal Receive Interrupt (RIE) will also never fire. With NAPI stopped and
no interrupts firing, the driver has no polling timer to retry allocation,
which could result in a permanent stall of the RX queue.

> #define XGMAC_DMA_INT_DEFAULT_TX (XGMAC_TIE)
> #define XGMAC_DMA_CH_Rx_WATCHDOG(x) (0x0000313c + (0x80 * (x)))
> #define XGMAC_RWT GENMASK(7, 0)