From ccdb8b8b159ee3a489d66d5b95742949afaa2b09 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Wed, 28 Apr 2021 13:01:06 -0700 Subject: [PATCH] vcl: fix epoll wait with indefinite timeout Also avoid syscalls if timeout is 0. Type: fix Signed-off-by: Florin Coras Change-Id: I9193d731c51a1432a52c89d5e54e6406e5100c96 --- src/plugins/hs_apps/vcl/vcl_test_protos.c | 8 +++--- src/vcl/vppcom.c | 44 +++++++++++-------------------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/plugins/hs_apps/vcl/vcl_test_protos.c b/src/plugins/hs_apps/vcl/vcl_test_protos.c index 45fff0fa1a1..3c44093156a 100644 --- a/src/plugins/hs_apps/vcl/vcl_test_protos.c +++ b/src/plugins/hs_apps/vcl/vcl_test_protos.c @@ -51,7 +51,7 @@ vt_tcp_listen (vcl_test_session_t *ts, vppcom_endpt_t *endpt) { int rv; - ts->fd = vppcom_session_create (VPPCOM_PROTO_TCP, 0 /* is_nonblocking */); + ts->fd = vppcom_session_create (VPPCOM_PROTO_TCP, 1 /* is_nonblocking */); if (ts->fd < 0) { vterr ("vppcom_session_create()", ts->fd); @@ -138,7 +138,7 @@ vt_udp_listen (vcl_test_session_t *ts, vppcom_endpt_t *endpt) { int rv; - ts->fd = vppcom_session_create (VPPCOM_PROTO_UDP, 0 /* is_nonblocking */); + ts->fd = vppcom_session_create (VPPCOM_PROTO_UDP, 1 /* is_nonblocking */); if (ts->fd < 0) { vterr ("vppcom_session_create()", ts->fd); @@ -318,7 +318,7 @@ vt_tls_listen (vcl_test_session_t *ts, vppcom_endpt_t *endpt) uint32_t ckp_len; int rv; - ts->fd = vppcom_session_create (VPPCOM_PROTO_TLS, 0 /* is_nonblocking */); + ts->fd = vppcom_session_create (VPPCOM_PROTO_TLS, 1 /* is_nonblocking */); if (ts->fd < 0) { vterr ("vppcom_session_create()", ts->fd); @@ -423,7 +423,7 @@ vt_dtls_listen (vcl_test_session_t *ts, vppcom_endpt_t *endpt) uint32_t ckp_len; int rv; - ts->fd = vppcom_session_create (VPPCOM_PROTO_DTLS, 0 /* is_nonblocking */); + ts->fd = vppcom_session_create (VPPCOM_PROTO_DTLS, 1 /* is_nonblocking */); if (ts->fd < 0) { vterr ("vppcom_session_create()", ts->fd); 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; } -- 2.16.6