diff options
author | Florin Coras <fcoras@cisco.com> | 2021-04-28 13:01:06 -0700 |
---|---|---|
committer | Florin Coras <fcoras@cisco.com> | 2021-04-28 18:10:10 -0700 |
commit | ccdb8b8b159ee3a489d66d5b95742949afaa2b09 (patch) | |
tree | f8e0d8cfb2fb0fc6e6feb99930807e54f684cda3 /src/vcl/vppcom.c | |
parent | 3295ddf6b6e06f43ebf1e081a09b7b785dd217ea (diff) |
vcl: fix epoll wait with indefinite timeout
Also avoid syscalls if timeout is 0.
Type: fix
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I9193d731c51a1432a52c89d5e54e6406e5100c96
Diffstat (limited to 'src/vcl/vppcom.c')
-rw-r--r-- | src/vcl/vppcom.c | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index a0f4338f902..5e37dcfef39 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -3001,56 +3001,50 @@ handle_dequeued: } static int -vppcom_epoll_wait_condvar (vcl_worker_t * wrk, struct epoll_event *events, - int maxevents, u32 n_evts, double wait_for_time) +vppcom_epoll_wait_condvar (vcl_worker_t *wrk, struct epoll_event *events, + int maxevents, u32 n_evts, double timeout_ms) { - double wait = 0, start = 0, now; + double end = -1; if (!n_evts) { - wait = wait_for_time; - start = clib_time_now (&wrk->clib_time); + if (timeout_ms > 0) + end = clib_time_now (&wrk->clib_time) + (timeout_ms / 1e3); } do { vcl_epoll_wait_handle_mq (wrk, wrk->app_event_queue, events, maxevents, - wait, &n_evts); - if (n_evts) + timeout_ms, &n_evts); + if (n_evts || !timeout_ms) return n_evts; - if (wait == -1) - continue; - - now = clib_time_now (&wrk->clib_time); - wait -= (now - start) * 1e3; - start = now; } - while (wait > 0); + while (end == -1 || clib_time_now (&wrk->clib_time) < end); return 0; } static int -vppcom_epoll_wait_eventfd (vcl_worker_t * wrk, struct epoll_event *events, - int maxevents, u32 n_evts, double wait_for_time) +vppcom_epoll_wait_eventfd (vcl_worker_t *wrk, struct epoll_event *events, + int maxevents, u32 n_evts, double timeout_ms) { - double wait = 0, start = 0, now; int __clib_unused n_read; vcl_mq_evt_conn_t *mqc; int n_mq_evts, i; + double end = -1; u64 buf; vec_validate (wrk->mq_events, pool_elts (wrk->mq_evt_conns)); if (!n_evts) { - wait = wait_for_time; - start = clib_time_now (&wrk->clib_time); + if (timeout_ms > 0) + end = clib_time_now (&wrk->clib_time) + (timeout_ms / 1e3); } do { n_mq_evts = epoll_wait (wrk->mqs_epfd, wrk->mq_events, - vec_len (wrk->mq_events), wait); + vec_len (wrk->mq_events), timeout_ms); if (n_mq_evts < 0) { VDBG (0, "epoll_wait error %u", errno); @@ -3065,16 +3059,10 @@ vppcom_epoll_wait_eventfd (vcl_worker_t * wrk, struct epoll_event *events, &n_evts); } - if (n_evts) + if (n_evts || !timeout_ms) return n_evts; - if (wait == -1) - continue; - - now = clib_time_now (&wrk->clib_time); - wait -= (now - start) * 1e3; - start = now; } - while (wait > 0); + while (end == -1 || clib_time_now (&wrk->clib_time) < end); return 0; } |