From 7be3af7fa662958782d2e23989d79cc2c652b6bf Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Fri, 12 Mar 2021 15:35:56 +0100 Subject: 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). --- sysdep/unix/io.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sysdep') 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(); -- cgit v1.2.3