]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Modify event system to treat fd access more fairly
authorDonald Sharp <sharpd@nvidia.com>
Thu, 2 Nov 2023 20:46:27 +0000 (16:46 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Wed, 8 Nov 2023 20:32:56 +0000 (15:32 -0500)
Keep track of the last starting spot of where fd's were
being handled for read operations.  Modify the io read
handler to cycle through the list of fd's that need
to be handled such that fd's at the front do not take
precedence for being handled all the time.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
lib/event.c
lib/frrevent.h

index f5ebd0197351cd906e81e3953224a21a1caedab4..6e55310b654900bd761785c11ba0624cfe09c94a 100644 (file)
@@ -1649,6 +1649,10 @@ static inline void thread_process_io_inner_loop(struct event_loop *m,
  * Walks through file descriptor array looking for those pollfds whose .revents
  * field has something interesting. Deletes any invalid file descriptors.
  *
+ * Try to impart some impartiality to handling of io.  The event
+ * system will cycle through the fd's available for io
+ * giving each one a chance to go first.
+ *
  * @param m the thread master
  * @param num the number of active file descriptors (return value of poll())
  */
@@ -1656,10 +1660,15 @@ static void thread_process_io(struct event_loop *m, unsigned int num)
 {
        unsigned int ready = 0;
        struct pollfd *pfds = m->handler.copy;
+       nfds_t i, last_read = m->last_read % m->handler.copycount;
 
-       for (nfds_t i = 0; i < m->handler.copycount && ready < num; ++i) {
-         thread_process_io_inner_loop(m, num, pfds, &i, &ready);
-       }
+       for (i = last_read; i < m->handler.copycount && ready < num; ++i)
+               thread_process_io_inner_loop(m, num, pfds, &i, &ready);
+
+       for (i = 0; i < last_read && ready < num; ++i)
+               thread_process_io_inner_loop(m, num, pfds, &i, &ready);
+
+       m->last_read++;
 }
 
 /* Add all timers that have popped to the ready list. */
index 3f74df359bc204930bb659187b7ae7a93a313595..616fe131af5c114f17ddff8d8682e0a1122cad0b 100644 (file)
@@ -91,6 +91,8 @@ struct event_loop {
        pthread_mutex_t mtx;
        pthread_t owner;
 
+       nfds_t last_read;
+
        bool ready_run_loop;
        RUSAGE_T last_getrusage;
 };