vcl: accept vcl spurious wakeup in epoll wait eventfd 76/38376/3
authorFlorin Coras <fcoras@cisco.com>
Wed, 1 Mar 2023 08:45:31 +0000 (00:45 -0800)
committerDave Wallace <dwallacelf@gmail.com>
Wed, 1 Mar 2023 19:28:06 +0000 (19:28 +0000)
Accept one spurious wakeup from vcl in epoll_pwait_eventfd to avoid
returning zero events to app without timeout.

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I447c7f8176413c562be28605376a92d15e22a1f9

src/vcl/ldp.c

index 3d4c01c..9e01ac9 100644 (file)
@@ -2567,7 +2567,7 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events,
                         int maxevents, int timeout, const sigset_t * sigmask)
 {
   ldp_worker_ctx_t *ldpw;
-  int libc_epfd, rv = 0, num_ev;
+  int libc_epfd, rv = 0, num_ev, vcl_wups = 0;
   vls_handle_t ep_vlsh;
 
   ldp_init_check ();
@@ -2651,6 +2651,7 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events,
       goto done;
     }
 
+epoll_again:
   rv = libc_epoll_pwait (libc_epfd, events, maxevents, timeout, sigmask);
   if (rv <= 0)
     goto done;
@@ -2668,6 +2669,9 @@ ldp_epoll_pwait_eventfd (int epfd, struct epoll_event *events,
          num_ev = vls_epoll_wait (ep_vlsh, &events[rv], maxevents - rv, 0);
          if (PREDICT_TRUE (num_ev > 0))
            rv += num_ev;
+         /* Woken up by vcl but no events generated. Accept it once */
+         if (rv == 0 && vcl_wups++ < 1)
+           goto epoll_again;
          break;
        }
     }