summaryrefslogtreecommitdiff
path: root/net/bird3/files/patch-05-mainloop-dropped-old-socket
diff options
context:
space:
mode:
authorOlivier Cochard <olivier@FreeBSD.org>2025-01-09 22:58:36 +0100
committerOlivier Cochard <olivier@FreeBSD.org>2025-01-09 23:07:38 +0100
commit4516e09a236bb31d6e852eadfb05f9576e4db7da (patch)
tree5c2d947f22448c924040427c8613edf8d6bda02e /net/bird3/files/patch-05-mainloop-dropped-old-socket
parentmath/gp2c: upgrade to 0.0.14 (diff)
net/bird3: Add new branch 3.x (multithreaded)
Warning: Consider version 3.0.0 to be unstable. PR: 283403 Sponsored by: Netflix
Diffstat (limited to 'net/bird3/files/patch-05-mainloop-dropped-old-socket')
-rw-r--r--net/bird3/files/patch-05-mainloop-dropped-old-socket86
1 files changed, 86 insertions, 0 deletions
diff --git a/net/bird3/files/patch-05-mainloop-dropped-old-socket b/net/bird3/files/patch-05-mainloop-dropped-old-socket
new file mode 100644
index 000000000000..eea4d1d26af2
--- /dev/null
+++ b/net/bird3/files/patch-05-mainloop-dropped-old-socket
@@ -0,0 +1,86 @@
+From 3d1f19e335f55c8cfa3cb7ca9d7b88ca03173d8e Mon Sep 17 00:00:00 2001
+From: Maria Matejka <mq@ucw.cz>
+Date: Sun, 22 Dec 2024 21:32:28 +0100
+Subject: [PATCH] Mainloop: Dropped old socket prioritization magic
+
+This is now done in worker threads and the mainloop needs to do other things,
+most notably kernel and CLI, with less overhead of repeatedly checking poll.
+---
+ sysdep/unix/io-loop.c | 2 +-
+ sysdep/unix/io.c | 21 +++++++--------------
+ 2 files changed, 8 insertions(+), 15 deletions(-)
+
+diff --git a/sysdep/unix/io-loop.c b/sysdep/unix/io-loop.c
+index f69189e06..a72c69a03 100644
+--- sysdep/unix/io-loop.c
++++ sysdep/unix/io-loop.c
+@@ -1403,7 +1403,7 @@ bool task_still_in_limit(void)
+ {
+ static u64 main_counter = 0;
+ if (this_birdloop == &main_birdloop)
+- return (++main_counter % 2048); /* This is a hack because of no accounting in mainloop */
++ return (++main_counter % 512); /* This is a hack because of no accounting in mainloop */
+ else
+ return ns_now() < account_last + this_thread->max_loop_time_ns;
+ }
+diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
+index f9785c074..51395e1e9 100644
+--- sysdep/unix/io.c
++++ sysdep/unix/io.c
+@@ -53,14 +53,15 @@
+
+ /* Maximum number of calls of tx handler for one socket in one
+ * poll iteration. Should be small enough to not monopolize CPU by
+- * one protocol instance.
++ * one protocol instance. But as most of the problems are now offloaded
++ * to worker threads, too low values may actually bring problems with
++ * latency.
+ */
+-#define MAX_STEPS 4
++#define MAX_STEPS 2048
+
+ /* Maximum number of calls of rx handler for all sockets in one poll
+- iteration. RX callbacks are often much more costly so we limit
+- this to gen small latencies */
+-#define MAX_RX_STEPS 4
++ iteration. RX callbacks are often a little bit more costly. */
++#define MAX_RX_STEPS 512
+
+
+ /*
+@@ -2581,8 +2582,6 @@ io_init(void)
+ srandom((uint) (now ^ (now >> 32)));
+ }
+
+-static int short_loops = 0;
+-#define SHORT_LOOP_MAX 10
+ #define WORK_EVENTS_MAX 10
+
+ sock *stored_sock;
+@@ -2670,10 +2669,9 @@ io_loop(void)
+ {
+ if (pfd.pfd.data[0].revents & POLLIN)
+ {
+- /* IO loop reload requested */
++ /* Somebody sent an event to mainloop */
+ pipe_drain(&main_birdloop.thread->wakeup);
+ atomic_fetch_and_explicit(&main_birdloop.thread_transition, ~LTT_PING, memory_order_acq_rel);
+- continue;
+ }
+
+ times_update();
+@@ -2719,11 +2717,6 @@ io_loop(void)
+ main_birdloop.sock_active = sk_next(s);
+ }
+
+- short_loops++;
+- if (events && (short_loops < SHORT_LOOP_MAX))
+- continue;
+- short_loops = 0;
+-
+ int count = 0;
+ main_birdloop.sock_active = stored_sock;
+ if (main_birdloop.sock_active == NULL)
+--
+GitLab
+