realtek: add cond_resched to loops accessing the FDB table
authorJan Hoffmann <jan@3e8.eu>
Sat, 17 Dec 2022 20:45:43 +0000 (21:45 +0100)
committerSander Vanheule <sander@svanheule.net>
Tue, 27 Dec 2022 15:29:57 +0000 (16:29 +0100)
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@3e8.eu>
target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/debugfs.c
target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/debugfs.c
target/linux/realtek/files-5.15/drivers/net/dsa/rtl83xx/dsa.c

index 9a7c7714c64e7e4390221e34684c4ee33da2f2b3..3c935f629af68d241e1dc08c68e38cad5556387d 100644 (file)
@@ -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++) {
index 6eea0dc93676a013bbf83627f0b4e69b9b4315a4..63461ff573488717e3ff0c063ec957f10babe684 100644 (file)
@@ -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++) {
index 9a7c7714c64e7e4390221e34684c4ee33da2f2b3..3c935f629af68d241e1dc08c68e38cad5556387d 100644 (file)
@@ -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++) {
index 9281e08d33ebc84c5cd20fd98eee8f16d5b03be0..3e71813112b5c75455e34222f2b9aeac6d79ef99 100644 (file)
@@ -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++) {