aboutsummaryrefslogtreecommitdiffstats
path: root/sysdep
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2021-03-12 15:35:56 +0100
committerOndrej Zajicek (work) <santiago@crfreenet.org>2021-03-12 15:35:56 +0100
commit7be3af7fa662958782d2e23989d79cc2c652b6bf (patch)
treeaeecb3e36af55eb4367f0b5218e3301d6383808e /sysdep
parent9cf3d533110313d55b60d47c134f1b7050d6be78 (diff)
downloadbird-7be3af7fa662958782d2e23989d79cc2c652b6bf.tar.gz
Rate-limit scheduling of work-events
In general, events are code handling some some condition, which is scheduled when such condition happened and executed independently from I/O loop. Work-events are a subgroup of events that are scheduled repeatedly until some (often significant) work is done (e.g. feeding routes to protocol). All scheduled events are executed during each I/O loop iteration. Separate work-events from regular events to a separate queue and rate limit their execution to a fixed number per I/O loop iteration. That should prevent excess latency when many work-events are scheduled at one time (e.g. simultaneous reload of many BGP sessions).
Diffstat (limited to 'sysdep')
-rw-r--r--sysdep/unix/io.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index 9d54a2c3..3d67d0a7 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -2161,6 +2161,7 @@ io_init(void)
{
init_list(&sock_list);
init_list(&global_event_list);
+ init_list(&global_work_list);
krt_io_init();
// XXX init_times();
// XXX update_times();
@@ -2172,6 +2173,7 @@ io_init(void)
static int short_loops = 0;
#define SHORT_LOOP_MAX 10
+#define WORK_EVENTS_MAX 10
void
io_loop(void)
@@ -2189,6 +2191,7 @@ io_loop(void)
{
times_update(&main_timeloop);
events = ev_run_list(&global_event_list);
+ events = ev_run_list_limited(&global_work_list, WORK_EVENTS_MAX) || events;
timers_fire(&main_timeloop);
io_close_event();