diff options
author | Ole Troan <ot@cisco.com> | 2019-05-16 15:01:34 +0200 |
---|---|---|
committer | Andrew Yourtchenko <ayourtch@gmail.com> | 2019-05-22 09:43:49 +0000 |
commit | 233e4681830bc2a9cd40deb4b5909b4e310d1a2a (patch) | |
tree | 495c36ffbafdfaf8c85672024e2162ea8ee923ac /src/vlib/threads.c | |
parent | a29d18ae6bb7cda3923693a052c3b9208588be8e (diff) |
stats: support multiple works for error counters
The current code only allowed access to the main thread error counters.
That is not so useful for a multi worker instance.
No return a vector indexed by thread of counter_t values.
Type: fix
Change-Id: Ie322c8889c0c8175e1116e71de04a2cf453b9ed7
Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vlib/threads.c')
-rw-r--r-- | src/vlib/threads.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/src/vlib/threads.c b/src/vlib/threads.c index 6a23bfd8a2f..22fa5f12ecd 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -23,6 +23,8 @@ #include <vlib/threads.h> #include <vlib/unix/cj.h> +#include <vlib/stat_weak_inlines.h> + DECLARE_CJ_GLOBAL_LOG; #define FRAME_QUEUE_NELTS 64 @@ -872,8 +874,13 @@ start_workers (vlib_main_t * vm) clib_mem_set_heap (oldheap); vec_add1_aligned (vlib_mains, vm_clone, CLIB_CACHE_LINE_BYTES); + /* Switch to the stats segment ... */ + void *oldheap = vlib_stats_push_heap (0); vm_clone->error_main.counters = vec_dup_aligned (vlib_mains[0]->error_main.counters, CLIB_CACHE_LINE_BYTES); + vlib_stats_pop_heap2 (vm_clone->error_main.counters, + worker_thread_index, oldheap, 1); + vm_clone->error_main.counters_last_clear = vec_dup_aligned (vlib_mains[0]->error_main.counters_last_clear, CLIB_CACHE_LINE_BYTES); @@ -1036,9 +1043,15 @@ vlib_worker_thread_node_refork (void) clib_memcpy_fast (&vm_clone->error_main, &vm->error_main, sizeof (vm->error_main)); j = vec_len (vm->error_main.counters) - 1; + + /* Switch to the stats segment ... */ + void *oldheap = vlib_stats_push_heap (0); vec_validate_aligned (old_counters, j, CLIB_CACHE_LINE_BYTES); - vec_validate_aligned (old_counters_all_clear, j, CLIB_CACHE_LINE_BYTES); vm_clone->error_main.counters = old_counters; + vlib_stats_pop_heap2 (vm_clone->error_main.counters, vm_clone->thread_index, + oldheap, 0); + + vec_validate_aligned (old_counters_all_clear, j, CLIB_CACHE_LINE_BYTES); vm_clone->error_main.counters_last_clear = old_counters_all_clear; nm_clone = &vm_clone->node_main; @@ -1466,18 +1479,6 @@ vlib_worker_thread_barrier_sync_int (vlib_main_t * vm, const char *func_name) } -void vlib_stat_segment_lock (void) __attribute__ ((weak)); -void -vlib_stat_segment_lock (void) -{ -} - -void vlib_stat_segment_unlock (void) __attribute__ ((weak)); -void -vlib_stat_segment_unlock (void) -{ -} - void vlib_worker_thread_barrier_release (vlib_main_t * vm) { |