From 321bd106a64bdd6c051579f58e111f71c2c7e7d6 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Wed, 1 Jun 2022 00:45:18 +0200 Subject: [PATCH] vlib: add VLIB_NUM_WORKERS_CHANGE_FN() handler Allows features to update their data structures after change in number of worker threads. Type: improvement Change-Id: Icd4d197e28608f5bbb1edd13eb624cd98e33cafe Signed-off-by: Damjan Marion --- src/vlib/buffer.c | 14 ++++---------- src/vlib/init.h | 2 ++ src/vlib/main.h | 1 + src/vlib/threads.c | 8 ++++++++ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/vlib/buffer.c b/src/vlib/buffer.c index fbded6e8300..304d1abd8ea 100644 --- a/src/vlib/buffer.c +++ b/src/vlib/buffer.c @@ -636,25 +636,19 @@ VLIB_CLI_COMMAND (show_buffers_command, static) = { /* *INDENT-ON* */ clib_error_t * -vlib_buffer_worker_init (vlib_main_t * vm) +vlib_buffer_num_workers_change (vlib_main_t *vm) { vlib_buffer_main_t *bm = vm->buffer_main; vlib_buffer_pool_t *bp; - /* *INDENT-OFF* */ vec_foreach (bp, bm->buffer_pools) - { - clib_spinlock_lock (&bp->lock); - vec_validate_aligned (bp->threads, vlib_get_n_threads () - 1, - CLIB_CACHE_LINE_BYTES); - clib_spinlock_unlock (&bp->lock); - } - /* *INDENT-ON* */ + vec_validate_aligned (bp->threads, vlib_get_n_threads () - 1, + CLIB_CACHE_LINE_BYTES); return 0; } -VLIB_WORKER_INIT_FUNCTION (vlib_buffer_worker_init); +VLIB_NUM_WORKERS_CHANGE_FN (vlib_buffer_num_workers_change); static clib_error_t * vlib_buffer_main_init_numa_alloc (struct vlib_main_t *vm, u32 numa_node, diff --git a/src/vlib/init.h b/src/vlib/init.h index e6235652ad1..364989eafe0 100644 --- a/src/vlib/init.h +++ b/src/vlib/init.h @@ -171,6 +171,8 @@ static __clib_unused void * __clib_unused_##tag##_##x = x #define VLIB_INIT_FUNCTION(x) VLIB_DECLARE_INIT_FUNCTION(x,init) #define VLIB_WORKER_INIT_FUNCTION(x) VLIB_DECLARE_INIT_FUNCTION(x,worker_init) +#define VLIB_NUM_WORKERS_CHANGE_FN(x) \ + VLIB_DECLARE_INIT_FUNCTION (x, num_workers_change) #define VLIB_MAIN_LOOP_ENTER_FUNCTION(x) \ VLIB_DECLARE_INIT_FUNCTION(x,main_loop_enter) diff --git a/src/vlib/main.h b/src/vlib/main.h index 1413158ad53..acb9924ac44 100644 --- a/src/vlib/main.h +++ b/src/vlib/main.h @@ -306,6 +306,7 @@ typedef struct vlib_global_main_t _vlib_init_function_list_elt_t *main_loop_enter_function_registrations; _vlib_init_function_list_elt_t *main_loop_exit_function_registrations; _vlib_init_function_list_elt_t *worker_init_function_registrations; + _vlib_init_function_list_elt_t *num_workers_change_function_registrations; _vlib_init_function_list_elt_t *api_init_function_registrations; vlib_config_function_runtime_t *config_function_registrations; diff --git a/src/vlib/threads.c b/src/vlib/threads.c index 6c39e688b72..5599c5b352b 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -820,6 +820,14 @@ start_workers (vlib_main_t * vm) } } vlib_worker_thread_barrier_sync (vm); + { + clib_error_t *err; + err = vlib_call_init_exit_functions ( + vm, &vgm->num_workers_change_function_registrations, 1 /* call_once */, + 1 /* is_global */); + if (err) + clib_error_report (err); + } vlib_worker_thread_barrier_release (vm); return 0; } -- 2.16.6