From c602b384ac022f70690a3a7c711149f7cb63ad12 Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Mon, 3 Jun 2019 19:48:22 -0400 Subject: sort worker-thread init functions in advance Otherwise, all N worker threads try to sort the list at the same time: a good way to have a bad day. This approach performs *far* better than maintaing order by adding a spin-lock. By direct measurement w/ elog + g2: 11 threads execute the per-thread init function list in 22us, vs. 50ms with a CLIB_PAUSE() enabled spin-lock. Change-Id: I1745f2a213c0561260139a60114dcb981e0c64e5 Signed-off-by: Dave Barach --- src/vlib/init.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'src/vlib/init.c') diff --git a/src/vlib/init.c b/src/vlib/init.c index 8010e9e97cd..135f9d582e9 100644 --- a/src/vlib/init.c +++ b/src/vlib/init.c @@ -72,7 +72,7 @@ comma_split (u8 * s, u8 ** a, u8 ** b) * @returns 0 on success, otherwise a clib_error_t *. */ -static clib_error_t *init_exit_function_sort +clib_error_t *vlib_sort_init_exit_functions (_vlib_init_function_list_elt_t ** head) { uword *index_by_name; @@ -329,15 +329,15 @@ again: * A and B - and it leads to hugely annoying debugging exercises. */ -clib_error_t * -vlib_call_init_exit_functions (vlib_main_t * vm, - _vlib_init_function_list_elt_t ** headp, - int call_once) +static inline clib_error_t * +call_init_exit_functions_internal (vlib_main_t * vm, + _vlib_init_function_list_elt_t ** headp, + int call_once, int do_sort) { clib_error_t *error = 0; _vlib_init_function_list_elt_t *i; - if ((error = init_exit_function_sort (headp))) + if (do_sort && (error = vlib_sort_init_exit_functions (headp))) return (error); i = *headp; @@ -356,6 +356,24 @@ vlib_call_init_exit_functions (vlib_main_t * vm, return error; } +clib_error_t * +vlib_call_init_exit_functions (vlib_main_t * vm, + _vlib_init_function_list_elt_t ** headp, + int call_once) +{ + return call_init_exit_functions_internal (vm, headp, call_once, + 1 /* do_sort */ ); +} + +clib_error_t * +vlib_call_init_exit_functions_no_sort (vlib_main_t * vm, + _vlib_init_function_list_elt_t ** + headp, int call_once) +{ + return call_init_exit_functions_internal (vm, headp, call_once, + 0 /* do_sort */ ); +} + clib_error_t * vlib_call_all_init_functions (vlib_main_t * vm) { -- cgit 1.2.3-korg