diff options
author | Florin Coras <fcoras@cisco.com> | 2024-05-10 20:28:12 -0700 |
---|---|---|
committer | Florin Coras <fcoras@cisco.com> | 2024-12-02 21:11:38 -0800 |
commit | 63b34c8d2208d17fe7741df71ac178f47b17923d (patch) | |
tree | a59d753403f638a076d9c7ddae59a5845b5af6d9 /src | |
parent | 6b224de844539bde50913575305cddda09f3b2a6 (diff) |
vcl: fix poll support
Type: fix
Change-Id: I827f19d893153277baba3c2d0efde5f2827eb0ff
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/vcl/ldp.c | 11 | ||||
-rw-r--r-- | src/vcl/vcl_locked.c | 14 | ||||
-rw-r--r-- | src/vcl/vcl_locked.h | 1 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/vcl/ldp.c b/src/vcl/ldp.c index e8cabd2a2cd..e1046441968 100644 --- a/src/vcl/ldp.c +++ b/src/vcl/ldp.c @@ -2734,12 +2734,19 @@ epoll_wait (int epfd, struct epoll_event *events, int maxevents, int timeout) int poll (struct pollfd *fds, nfds_t nfds, int timeout) { - ldp_worker_ctx_t *ldpw = ldp_worker_get_current (); int rv, i, n_revents = 0; + ldp_worker_ctx_t *ldpw; vls_handle_t vlsh; vcl_poll_t *vp; double max_time; + ldp_init_check (); + + if (PREDICT_FALSE (vppcom_worker_index () == ~0)) + vls_register_vcl_worker (); + + ldpw = ldp_worker_get_current (); + LDBG (3, "fds %p, nfds %ld, timeout %d", fds, nfds, timeout); if (PREDICT_FALSE (ldpw->clib_time.init_cpu_time == 0)) @@ -2780,7 +2787,7 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) { if (vec_len (ldpw->vcl_poll)) { - rv = vppcom_poll (ldpw->vcl_poll, vec_len (ldpw->vcl_poll), 0); + rv = vls_poll (ldpw->vcl_poll, vec_len (ldpw->vcl_poll), 0); if (rv < 0) { errno = -rv; diff --git a/src/vcl/vcl_locked.c b/src/vcl/vcl_locked.c index 9f3d6b56c2e..bae1c0d86b3 100644 --- a/src/vcl/vcl_locked.c +++ b/src/vcl/vcl_locked.c @@ -1626,6 +1626,20 @@ vls_select (int n_bits, vcl_si_set * read_map, vcl_si_set * write_map, return rv; } +int +vls_poll (vcl_poll_t *vp, uint32_t n_sids, double wait_for_time) +{ + int rv; + vcl_locked_session_t *vls = NULL; + + vls_mt_detect (); + vls_mt_guard (vls, VLS_MT_OP_XPOLL); + rv = vppcom_poll (vp, n_sids, wait_for_time); + vls_mt_unguard (); + vls_handle_pending_wrk_cleanup (); + return rv; +} + static void vls_unshare_vcl_worker_sessions (vcl_worker_t * wrk) { diff --git a/src/vcl/vcl_locked.h b/src/vcl/vcl_locked.h index bc131402cc9..0e747acdea0 100644 --- a/src/vcl/vcl_locked.h +++ b/src/vcl/vcl_locked.h @@ -48,6 +48,7 @@ int vls_epoll_wait (vls_handle_t ep_vlsh, struct epoll_event *events, int maxevents, double wait_for_time); int vls_select (int n_bits, vcl_si_set * read_map, vcl_si_set * write_map, vcl_si_set * except_map, double wait_for_time); +int vls_poll (vcl_poll_t *vp, uint32_t n_sids, double wait_for_time); vcl_session_handle_t vlsh_to_sh (vls_handle_t vlsh); vcl_session_handle_t vlsh_to_session_index (vls_handle_t vlsh); int vlsh_to_worker_index (vls_handle_t vlsh); |