[PATCH] mvneta: fix "napi poll" infinite loop for openwrt

webmaster at jbsky.fr webmaster at jbsky.fr
Wed Sep 11 05:18:19 PDT 2024


From: Julien Blais <webmaster at jbsky.fr>

This patch is submitted to the kernel.

For your information, this fixes the problem identified during a test with
 iperf, the packet sending stall and above all the use of a 100% CPU
 because of the softIRQ.

Before:
root at wrt1900acv1:~# cat /proc/interrupts
           CPU0       CPU1
 24:   18652404   15171396      MPIC   5 Level     armada_370_xp_per_cpu_tick
 26:     292136         78      MPIC  31 Level     mv64xxx_i2c
 27:         26          0      MPIC  41 Level     ttyS0
 33:    1024678          0      MPIC  45 Level     ehci_hcd:usb1
 34:   23007175          0      MPIC   8 Level     eth0

After:
root at OpenWrt:/# cat /proc/interrupts
           CPU0       CPU1
 24:     194183     161947      MPIC   5 Level     armada_370_xp_per_cpu_tick
 25:          0          0      MPIC   3 Level     arm-pmu
 26:        246          0      MPIC  31 Level     mv64xxx_i2c
 27:       5488          0      MPIC  41 Level     ttyS0
 33:          0          0      MPIC  45 Level     ehci_hcd:usb1
 34:    2015130    6330694      MPIC   8 Level     eth0

Signed-off-by: Julien Blais <webmaster at jbsky.fr>
---
 .../700-mvneta-tx-queue-workaround.patch      | 38 -------------------
 ...1-mvneta-fix-napi-poll-infinite-loop.patch | 38 +++++++++++++++++++
 2 files changed, 38 insertions(+), 38 deletions(-)
 delete mode 100644 target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch
 create mode 100644 target/linux/mvebu/patches-5.15/701-mvneta-fix-napi-poll-infinite-loop.patch

diff --git a/target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch b/target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch
deleted file mode 100644
index 32e8ef4b7d..0000000000
--- a/target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-The hardware queue scheduling is apparently configured with fixed
-priorities, which creates a nasty fairness issue where traffic from one
-CPU can starve traffic from all other CPUs.
-
-Work around this issue by forcing all tx packets to go through one CPU,
-until this issue is fixed properly.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
---- a/drivers/net/ethernet/marvell/mvneta.c
-+++ b/drivers/net/ethernet/marvell/mvneta.c
-@@ -5006,6 +5006,16 @@ static int mvneta_setup_tc(struct net_de
- 	}
- }
- 
-+#ifndef CONFIG_ARM64
-+static u16 mvneta_select_queue(struct net_device *dev, struct sk_buff *skb,
-+			       struct net_device *sb_dev)
-+{
-+	/* XXX: hardware queue scheduling is broken,
-+	 * use only one queue until it is fixed */
-+	return 0;
-+}
-+#endif
-+
- static const struct net_device_ops mvneta_netdev_ops = {
- 	.ndo_open            = mvneta_open,
- 	.ndo_stop            = mvneta_stop,
-@@ -5016,6 +5026,9 @@ static const struct net_device_ops mvnet
- 	.ndo_fix_features    = mvneta_fix_features,
- 	.ndo_get_stats64     = mvneta_get_stats64,
- 	.ndo_eth_ioctl        = mvneta_ioctl,
-+#ifndef CONFIG_ARM64
-+	.ndo_select_queue    = mvneta_select_queue,
-+#endif
- 	.ndo_bpf	     = mvneta_xdp,
- 	.ndo_xdp_xmit        = mvneta_xdp_xmit,
- 	.ndo_setup_tc	     = mvneta_setup_tc,
diff --git a/target/linux/mvebu/patches-5.15/701-mvneta-fix-napi-poll-infinite-loop.patch b/target/linux/mvebu/patches-5.15/701-mvneta-fix-napi-poll-infinite-loop.patch
new file mode 100644
index 0000000000..0fa191ea14
--- /dev/null
+++ b/target/linux/mvebu/patches-5.15/701-mvneta-fix-napi-poll-infinite-loop.patch
@@ -0,0 +1,38 @@
+From bbeea07de50e925df3877f63a24aee1d35828a02 Mon Sep 17 00:00:00 2001
+From: Julien Blais <webmaster at jbsky.fr>
+Date: Wed, 11 Sep 2024 13:27:09 +0200
+Subject: [PATCH v2] mvneta: fix "napi poll" infinite loop
+
+In percpu mode, when there's a network load, one of the cpus can be
+solicited without having anything to process.
+If 0 is returned to napi poll, napi will ignore the next requests,
+causing an infinite loop with ISR handling.
+
+Without this change, patches hang around fixing the queue at 0 and
+the interrupt remains stuck on the 1st CPU.
+The percpu conf is useless in this case, so we might as well remove it.
+
+Signed-off-by: Julien Blais <webmaster at jbsky.fr>
+---
+ drivers/net/ethernet/marvell/mvneta.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
+index 3f124268b..b6e89b888 100644
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -3186,7 +3186,10 @@ static int mvneta_poll(struct napi_struct *napi, int budget)
+ 
+ 	if (rx_done < budget) {
+ 		cause_rx_tx = 0;
+-		napi_complete_done(napi, rx_done);
++		if (rx_done)
++			napi_complete_done(napi, rx_done);
++		else
++			napi_complete(napi);
+ 
+ 		if (pp->neta_armada3700) {
+ 			unsigned long flags;
+-- 
+2.39.2
+
-- 
2.39.2



--
This e-mail and any attached files are confidential and may be legally privileged. If you are not the addressee, any disclosure, reproduction, copying, distribution, or other dissemination or use of this communication is strictly prohibited. If you have received this transmission in error please notify the sender immediately and then delete this mail.
E-mail transmission cannot be guaranteed to be secure or error free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. The sender therefore does not accept liability for any errors or omissions in the contents of this message which arise as a result of e-mail transmission or changes to transmitted date not specifically approved by the sender.
If this e-mail or attached files contain information which do not relate to our professional activity we do not accept liability for such information.




More information about the openwrt-devel mailing list