[PATCH v2 3/3] realtek: add cond_resched to loops accessing the FDB table

Jan Hoffmann jan at 3e8.eu
Sat Dec 17 12:45:43 PST 2022


A full loop accessing all FDB entries can take several milliseconds
(on RTL839x about 20 ms), so give other kernel tasks a chance to run.
This is especially important for rtl83xx_port_fdb_dump which is itself
called in a loop for all ports by the kernel.

Signed-off-by: Jan Hoffmann <jan at 3e8.eu>
---
 .../linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/debugfs.c | 3 +++
 target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c  | 3 +++
 .../linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/debugfs.c | 3 +++
 target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c  | 3 +++
 4 files changed, 12 insertions(+)

diff --git a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/debugfs.c b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/debugfs.c
index 9a7c7714c64e..3c935f629af6 100644
--- a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/debugfs.c
+++ b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/debugfs.c
@@ -343,6 +343,9 @@ static int l2_table_show(struct seq_file *m, void *v)
 
 		seq_printf(m, "Hash table bucket %d index %d ", bucket, index);
 		l2_table_print_entry(m, priv, &e);
+
+		if (!((i + 1) % 64))
+			cond_resched();
 	}
 
 	for (i = 0; i < 64; i++) {
diff --git a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
index 6eea0dc93676..63461ff57348 100644
--- a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
+++ b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
@@ -1728,6 +1728,9 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port,
 
 		if (e.port == port || e.port == RTL930X_PORT_IGNORE)
 			cb(e.mac, e.vid, e.is_static, data);
+
+		if (!((i + 1) % 64))
+			cond_resched();
 	}
 
 	for (i = 0; i < 64; i++) {
diff --git a/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/debugfs.c b/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/debugfs.c
index 9a7c7714c64e..3c935f629af6 100644
--- a/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/debugfs.c
+++ b/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/debugfs.c
@@ -343,6 +343,9 @@ static int l2_table_show(struct seq_file *m, void *v)
 
 		seq_printf(m, "Hash table bucket %d index %d ", bucket, index);
 		l2_table_print_entry(m, priv, &e);
+
+		if (!((i + 1) % 64))
+			cond_resched();
 	}
 
 	for (i = 0; i < 64; i++) {
diff --git a/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c
index 9281e08d33eb..3e71813112b5 100644
--- a/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c
+++ b/target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c
@@ -1725,6 +1725,9 @@ static int rtl83xx_port_fdb_dump(struct dsa_switch *ds, int port,
 
 		if (e.port == port || e.port == RTL930X_PORT_IGNORE)
 			cb(e.mac, e.vid, e.is_static, data);
+
+		if (!((i + 1) % 64))
+			cond_resched();
 	}
 
 	for (i = 0; i < 64; i++) {
-- 
2.38.1




More information about the openwrt-devel mailing list