mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2025-07-01 08:06:54 +00:00
Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.6.94 Removed upstreamed: generic/backport-6.6/421-01-v6.16-spi-bcm63xx-spi-fix-shared-reset.patch[1] generic/backport-6.6/421-02-v6.16-spi-bcm63xx-hsspi-fix-shared-reset.patch[2] generic/backport-6.6/725-01-v6.16-net-dsa-tag_brcm-legacy-fix-pskb_may_pull-length.patch[3] mvebu/patches-6.6/0001-v6.16-pinctrl-armada-37xx-use-correct-OUTPUT_VAL-register-.patch[4] mvebu/patches-6.6/0002-v6.16-pinctrl-armada-37xx-set-GPIO-output-value-before-set.patch[5] Added new back-port: generic/backport-6.6/001-powerpc-kernel-Fix-pcc_save_regs-inclusion.patch[6] All other patches automatically rebased. 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.94&id=29abb7fc82443bee273ba4623ce319bf7ba1d43d 2. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.94&id=59d5f3134b5c265df233b7f385bbe718191411be 3. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.94&id=2e02edb66427e3b8752e1f3dd3cfc1bef3f2357b 4. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.94&id=39ed85ae485d991ffb24d25629a679c0b22e2d8f 5. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.94&id=8f0f45a312151a52aae920a091ea4b454ac97caf 6. Addresses a build failure for pcc Build system: x86/64 Build-tested: flogic/xiaomi_redmi-router-ax6000-ubootmod, ramips/tplink_archer-a6-v3, x86/64 Run-tested: flogic/xiaomi_redmi-router-ax6000-ubootmod, ramips/tplink_archer-a6-v3, x86/64 Signed-off-by: John Audia <therealgraysky@proton.me> Link: https://github.com/openwrt/openwrt/pull/19183 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
78 lines
3.0 KiB
Diff
78 lines
3.0 KiB
Diff
From 2d1a42cf7f77cda54dbbee18d00b1200e7bc22aa Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Wed, 18 Oct 2023 14:35:48 +0200
|
|
Subject: [PATCH 1/3] net: stmmac: improve TX timer arm logic
|
|
|
|
There is currently a problem with the TX timer getting armed multiple
|
|
unnecessary times causing big performance regression on some device that
|
|
suffer from heavy handling of hrtimer rearm.
|
|
|
|
The use of the TX timer is an old implementation that predates the napi
|
|
implementation and the interrupt enable/disable handling.
|
|
|
|
Due to stmmac being a very old code, the TX timer was never evaluated
|
|
again with this new implementation and was kept there causing
|
|
performance regression. The performance regression started to appear
|
|
with kernel version 4.19 with 8fce33317023 ("net: stmmac: Rework coalesce
|
|
timer and fix multi-queue races") where the timer was reduced to 1ms
|
|
causing it to be armed 40 times more than before.
|
|
|
|
Decreasing the timer made the problem more present and caused the
|
|
regression in the other of 600-700mbps on some device (regression where
|
|
this was notice is ipq806x).
|
|
|
|
The problem is in the fact that handling the hrtimer on some target is
|
|
expensive and recent kernel made the timer armed much more times.
|
|
A solution that was proposed was reverting the hrtimer change and use
|
|
mod_timer but such solution would still hide the real problem in the
|
|
current implementation.
|
|
|
|
To fix the regression, apply some additional logic and skip arming the
|
|
timer when not needed.
|
|
|
|
Arm the timer ONLY if a napi is not already scheduled. Running the timer
|
|
is redundant since the same function (stmmac_tx_clean) will run in the
|
|
napi TX poll. Also try to cancel any timer if a napi is scheduled to
|
|
prevent redundant run of TX call.
|
|
|
|
With the following new logic the original performance are restored while
|
|
keeping using the hrtimer.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
---
|
|
.../net/ethernet/stmicro/stmmac/stmmac_main.c | 18 +++++++++++++++---
|
|
1 file changed, 15 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
@@ -2993,13 +2993,25 @@ static void stmmac_tx_timer_arm(struct s
|
|
{
|
|
struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue];
|
|
u32 tx_coal_timer = priv->tx_coal_timer[queue];
|
|
+ struct stmmac_channel *ch;
|
|
+ struct napi_struct *napi;
|
|
|
|
if (!tx_coal_timer)
|
|
return;
|
|
|
|
- hrtimer_start(&tx_q->txtimer,
|
|
- STMMAC_COAL_TIMER(tx_coal_timer),
|
|
- HRTIMER_MODE_REL);
|
|
+ ch = &priv->channel[tx_q->queue_index];
|
|
+ napi = tx_q->xsk_pool ? &ch->rxtx_napi : &ch->tx_napi;
|
|
+
|
|
+ /* Arm timer only if napi is not already scheduled.
|
|
+ * Try to cancel any timer if napi is scheduled, timer will be armed
|
|
+ * again in the next scheduled napi.
|
|
+ */
|
|
+ if (unlikely(!napi_is_scheduled(napi)))
|
|
+ hrtimer_start(&tx_q->txtimer,
|
|
+ STMMAC_COAL_TIMER(tx_coal_timer),
|
|
+ HRTIMER_MODE_REL);
|
|
+ else
|
|
+ hrtimer_try_to_cancel(&tx_q->txtimer);
|
|
}
|
|
|
|
/**
|