From 233e4681830bc2a9cd40deb4b5909b4e310d1a2a Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Thu, 16 May 2019 15:01:34 +0200 Subject: 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 --- src/vlib/threads.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'src/vlib/threads.c') 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 #include +#include + 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) { -- cgit 1.2.3-korg