libmemif: timer causes spin at 100% cpu 29/36029/3
authorDaniel Béreš <dberes@cisco.com>
Fri, 22 Apr 2022 08:06:17 +0000 (08:06 +0000)
committerDamjan Marion <dmarion@me.com>
Tue, 26 Apr 2022 15:46:00 +0000 (15:46 +0000)
In case of timer is set and expires:
1. timer_fd is readable and stay readable.
2. timer_fd is part of epoll_fd set. This makes epoll_pwait()
   calls return immediately instead of sleeping.

Type: fix

Signed-off-by: Daniel Béreš <dberes@cisco.com>
Change-Id: I9b228464fe45b83def9b182c885d6febf428049c

extras/libmemif/src/main.c

index 397c2bb..21b3994 100644 (file)
@@ -409,6 +409,16 @@ memif_connect_handler (memif_fd_event_type_t type, void *private_ctx)
   memif_socket_t *ms = (memif_socket_t *) private_ctx;
   memif_connection_t *c;
 
+  if (ms->timer_fd >= 0)
+    {
+      uint64_t u64;
+      /*
+       Have to read the timer fd else it stays read-ready
+       and makes epoll_pwait() return without sleeping
+      */
+      read (ms->timer_fd, &u64, sizeof (u64));
+    }
+
   /* loop ms->slave_interfaces and request connection for disconnected ones */
   TAILQ_FOREACH (c, &ms->slave_interfaces, next)
   {