From 4b20830b496ade3f1e77cd5fcbdf6d6c7bb5336d Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Wed, 30 Mar 2022 13:50:19 -0700 Subject: vlib: add support for workers sync Adds api that allows workers to synchronize through main thread. Type: improvement Signed-off-by: Florin Coras Change-Id: I1e75e2fb5144d397d19b13c4dfc7e937f11c044c --- src/vnet/session/session.h | 40 ++-------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) (limited to 'src/vnet/session') diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 56e30e6533b..0cf6cd084fe 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -803,41 +803,6 @@ pool_program_safe_realloc (void *p, u32 thread_index, uword_to_pointer (thread_index, void *)); } -#define pool_realloc_all_at_barrier(_not) \ - (*vlib_worker_threads->workers_at_barrier >= (vlib_num_workers () - _not)) - -always_inline void -pool_realloc_wait_at_barrier (void) -{ - session_main_t *sm = &session_main; - - /* Wait until main thread asks for barrier */ - while (!(*vlib_worker_threads->wait_at_barrier)) - ; - - /* Stop at realloc barrier and make sure all threads are either - * at worker barrier or at pool realloc barrier */ - clib_atomic_fetch_add (&sm->pool_realloc_at_barrier, 1); - while (!pool_realloc_all_at_barrier (sm->pool_realloc_at_barrier)) - ; - - /* Track all workers that are doing work */ - clib_atomic_fetch_add (&sm->pool_realloc_doing_work, 1); -} - -always_inline void -pool_realloc_done_wait_at_barrier (void) -{ - session_main_t *sm = &session_main; - - /* Wait until all workers at pool realloc barrier have started reallocs */ - while (sm->pool_realloc_doing_work < sm->pool_realloc_at_barrier) - ; - - clib_atomic_fetch_add (&sm->pool_realloc_doing_work, -1); - clib_atomic_fetch_add (&sm->pool_realloc_at_barrier, -1); -} - #define pool_needs_realloc(P) \ ((!P) || \ (vec_len (pool_header (P)->free_indices) < POOL_REALLOC_SAFE_ELT_THRESH && \ @@ -857,10 +822,9 @@ pool_realloc_done_wait_at_barrier (void) } \ else if (PREDICT_FALSE (!pool_free_elts (P))) \ { \ - pool_program_safe_realloc (P, thread_index, rpc_fn); \ - pool_realloc_wait_at_barrier (); \ + vlib_workers_sync (); \ pool_alloc_aligned (P, pool_max_len (P), align); \ - pool_realloc_done_wait_at_barrier (); \ + vlib_workers_continue (); \ ALWAYS_ASSERT (pool_free_elts (P) > 0); \ } \ else \ -- cgit 1.2.3-korg