aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2022-06-01 00:45:18 +0200
committerBeno�t Ganne <bganne@cisco.com>2022-06-01 11:34:03 +0000
commit321bd106a64bdd6c051579f58e111f71c2c7e7d6 (patch)
tree4e5cb606b19a533d404f8dc60325c620ff6d1951
parentdd2f12ba6ab952d9d66f4d9ba89ffde6309b1ff2 (diff)
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 <damarion@cisco.com>
-rw-r--r--src/vlib/buffer.c14
-rw-r--r--src/vlib/init.h2
-rw-r--r--src/vlib/main.h1
-rw-r--r--src/vlib/threads.c8
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;
}