summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2024-05-10 20:28:12 -0700
committerFlorin Coras <fcoras@cisco.com>2024-12-02 21:11:38 -0800
commit63b34c8d2208d17fe7741df71ac178f47b17923d (patch)
treea59d753403f638a076d9c7ddae59a5845b5af6d9 /src
parent6b224de844539bde50913575305cddda09f3b2a6 (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.c11
-rw-r--r--src/vcl/vcl_locked.c14
-rw-r--r--src/vcl/vcl_locked.h1
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);