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 | |
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')
-rw-r--r-- | src/vlib/counter.c | 14 | ||||
-rw-r--r-- | src/vlib/error.c | 20 | ||||
-rw-r--r-- | src/vlib/stat_weak_inlines.h | 61 | ||||
-rw-r--r-- | src/vlib/threads.c | 27 |
4 files changed, 79 insertions, 43 deletions
diff --git a/src/vlib/counter.c b/src/vlib/counter.c index 5b73d5fa21a..faf106942b7 100644 --- a/src/vlib/counter.c +++ b/src/vlib/counter.c @@ -38,6 +38,7 @@ */ #include <vlib/vlib.h> +#include <vlib/stat_weak_inlines.h> void vlib_clear_simple_counters (vlib_simple_counter_main_t * cm) @@ -74,19 +75,6 @@ vlib_clear_combined_counters (vlib_combined_counter_main_t * cm) } } -void *vlib_stats_push_heap (void *) __attribute__ ((weak)); -void * -vlib_stats_push_heap (void *unused) -{ - return 0; -}; - -void vlib_stats_pop_heap (void *, void *, u32, int) __attribute__ ((weak)); -void -vlib_stats_pop_heap (void *notused, void *notused2, u32 i, int type) -{ -}; - void vlib_validate_simple_counter (vlib_simple_counter_main_t * cm, u32 index) { diff --git a/src/vlib/error.c b/src/vlib/error.c index a416649cfa7..7c61f319fc0 100644 --- a/src/vlib/error.c +++ b/src/vlib/error.c @@ -39,6 +39,7 @@ #include <vlib/vlib.h> #include <vppinfra/heap.h> +#include <vlib/stat_weak_inlines.h> uword vlib_error_drop_buffers (vlib_main_t * vm, @@ -109,20 +110,6 @@ vlib_error_drop_buffers (vlib_main_t * vm, return n_buffers; } -void vlib_stats_register_error_index (u8 *, u64 *, u64) - __attribute__ ((weak)); -void -vlib_stats_register_error_index (u8 * notused, u64 * notused2, u64 notused3) -{ -}; - -void vlib_stats_pop_heap2 (void *, u32, void *) __attribute__ ((weak)); -void -vlib_stats_pop_heap2 (void *notused, u32 notused2, void *notused3) -{ -}; - - /* Reserves given number of error codes for given node. */ void vlib_register_errors (vlib_main_t * vm, @@ -132,7 +119,6 @@ vlib_register_errors (vlib_main_t * vm, vlib_node_t *n = vlib_get_node (vm, node_index); uword l; void *oldheap; - void *vlib_stats_push_heap (void) __attribute__ ((weak)); ASSERT (vlib_get_thread_index () == 0); @@ -157,7 +143,7 @@ vlib_register_errors (vlib_main_t * vm, vec_validate (vm->error_elog_event_types, l - 1); /* Switch to the stats segment ... */ - oldheap = vlib_stats_push_heap (); + oldheap = vlib_stats_push_heap (0); /* Allocate a counter/elog type for each error. */ vec_validate (em->counters, l - 1); @@ -186,7 +172,7 @@ vlib_register_errors (vlib_main_t * vm, } /* (re)register the em->counters base address, switch back to main heap */ - vlib_stats_pop_heap2 (em->counters, vm->thread_index, oldheap); + vlib_stats_pop_heap2 (em->counters, vm->thread_index, oldheap, 1); { elog_event_type_t t; diff --git a/src/vlib/stat_weak_inlines.h b/src/vlib/stat_weak_inlines.h new file mode 100644 index 00000000000..5c04610ef13 --- /dev/null +++ b/src/vlib/stat_weak_inlines.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2019 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * NOTE: Only include this file from external components that require + * a loose coupling to the stats component. + */ + +#ifndef included_stat_weak_inlines_h +#define included_stat_weak_inlines_h +void *vlib_stats_push_heap (void *) __attribute__ ((weak)); +void * +vlib_stats_push_heap (void *unused) +{ + return 0; +}; + +void vlib_stats_pop_heap (void *, void *, u32, int) __attribute__ ((weak)); +void +vlib_stats_pop_heap (void *notused, void *notused2, u32 i, int type) +{ +}; +void vlib_stats_register_error_index (u8 *, u64 *, u64) + __attribute__ ((weak)); +void +vlib_stats_register_error_index (u8 * notused, u64 * notused2, u64 notused3) +{ +}; + +void vlib_stats_pop_heap2 (void *, u32, void *, int) __attribute__ ((weak)); +void +vlib_stats_pop_heap2 (void *notused, u32 notused2, void *notused3, + int notused4) +{ +}; + +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) +{ +} + +#endif 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) { |