* [PATCH net] net: stmmac: fix RX coalesce frames counter
@ 2026-10-09 11:11 Pengfei Zhang
2026-10-09 11:14 ` netdev-bot+sinfo
0 siblings, 1 reply; 2+ messages in thread
From: Pengfei Zhang @ 2026-10-09 11:11 UTC (permalink / raw)
To: Maxime Chevallier, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Maxime Coquelin, Alexandre Torgue
Cc: Jose Abreu, zhangpengfei16, netdev, linux-stm32,
linux-arm-kernel, linux-kernel
The RX refill path should set the IC bit once every rx_coal_frames
descriptors and leave the rest to the RX watchdog (RIWT), as done by
commit d429b66e2ebc ("net: stmmac: Implement RX Coalesce Frames
setting").
Since commit 6fa9d691b91a ("net: stmmac: Prevent divide-by-zero") the
counter is increased by N+1 for each descriptor and then compared
against N, so it is always reset to 0. With a non-zero rx-frames, IC is
therefore set on every descriptor and every frame raises an interrupt.
Fix this by counting one descriptor at a time in a helper used by both
stmmac_rx_refill() and stmmac_rx_refill_zc(). Platforms without RIWT
(IC on every descriptor) are unaffected.
Fixes: 6fa9d691b91a ("net: stmmac: Prevent divide-by-zero")
Signed-off-by: Pengfei Zhang <zhangfeionline@gmail.com>
---
The default rx-frames is 0 (watchdog only) since commit da2024510031
("net: stmmac: Tune-up default coalesce settings"), so this is only hit
when rx-frames is set explicitly.
Verified with "ethtool -C eth0 rx-frames 16" under UDP load: without
this patch almost every received frame raised an RX interrupt, about
twice as many interrupts as with rx-frames 0.
.../net/ethernet/stmicro/stmmac/stmmac_main.c | 36 +++++++++----------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index b837e8e27..72678760e 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -5071,6 +5071,22 @@ static void stmmac_rx_vlan(struct net_device *dev, struct sk_buff *skb)
}
}
+static bool stmmac_rx_need_ic(struct stmmac_priv *priv,
+ struct stmmac_rx_queue *rx_q, u32 queue)
+{
+ u32 frames = priv->rx_coal_frames[queue];
+
+ /* without the RX watchdog every descriptor needs IC */
+ if (!priv->use_riwt)
+ return true;
+
+ if (!frames || ++rx_q->rx_count_frames < frames)
+ return false;
+
+ rx_q->rx_count_frames = 0;
+ return true;
+}
+
/**
* stmmac_rx_refill - refill used skb preallocated buffers
* @priv: driver private structure
@@ -5116,15 +5132,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
stmmac_rx_check_buf2_cap(priv));
stmmac_refill_desc3(priv, rx_q, p);
- rx_q->rx_count_frames++;
- rx_q->rx_count_frames += priv->rx_coal_frames[queue];
- if (rx_q->rx_count_frames > priv->rx_coal_frames[queue])
- rx_q->rx_count_frames = 0;
-
- use_rx_wd = !priv->rx_coal_frames[queue];
- use_rx_wd |= rx_q->rx_count_frames > 0;
- if (!priv->use_riwt)
- use_rx_wd = false;
+ use_rx_wd = !stmmac_rx_need_ic(priv, rx_q, queue);
dma_wmb();
stmmac_set_rx_owner(priv, p, use_rx_wd);
@@ -5492,15 +5500,7 @@ static bool stmmac_rx_refill_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
stmmac_set_desc_sec_addr(priv, rx_desc, 0, false);
stmmac_refill_desc3(priv, rx_q, rx_desc);
- rx_q->rx_count_frames++;
- rx_q->rx_count_frames += priv->rx_coal_frames[queue];
- if (rx_q->rx_count_frames > priv->rx_coal_frames[queue])
- rx_q->rx_count_frames = 0;
-
- use_rx_wd = !priv->rx_coal_frames[queue];
- use_rx_wd |= rx_q->rx_count_frames > 0;
- if (!priv->use_riwt)
- use_rx_wd = false;
+ use_rx_wd = !stmmac_rx_need_ic(priv, rx_q, queue);
dma_wmb();
stmmac_set_rx_owner(priv, rx_desc, use_rx_wd);
--
2.54.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH net] net: stmmac: fix RX coalesce frames counter
2026-10-09 11:11 [PATCH net] net: stmmac: fix RX coalesce frames counter Pengfei Zhang
@ 2026-10-09 11:14 ` netdev-bot+sinfo
0 siblings, 0 replies; 2+ messages in thread
From: netdev-bot+sinfo @ 2026-10-09 11:14 UTC (permalink / raw)
To: Pengfei Zhang
Cc: Maxime Chevallier, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Maxime Coquelin, Alexandre Torgue,
Jose Abreu, zhangpengfei16, netdev, linux-stm32,
linux-arm-kernel, linux-kernel
Hi!
This is an automated message. This series looks like a fix, but its
commit messages seem to be missing some information:
- What hardware the change was tested on. For driver fixes please
mention the device (and if relevant firmware version) used for
testing, or say that the change was not tested on real hardware.
Please do not repost the series just to address the above. Instead,
reply to this email with the missing information, so that reviewers
can take it into account. If the series needs another revision for
other reasons, please include the information in the commit messages
then.
The evaluation is done by an LLM so it may be wrong, if you think
that is the case please reply and explain.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-10-09 11:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-09 11:11 [PATCH net] net: stmmac: fix RX coalesce frames counter Pengfei Zhang
2026-10-09 11:14 ` netdev-bot+sinfo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®