X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp%2Fstats%2Fstat_segment.c;h=8459138be3455572f566c726e2357e8826f9614d;hb=2fee16787ed0d622631223567635a77e14c8c076;hp=16a727dbf64c0611c9c983f1f3e599ffe5b1a0f8;hpb=1f806587d8e1d94ee7630cee134fbaae2de2f31e;p=vpp.git diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c index 16a727dbf64..8459138be34 100644 --- a/src/vpp/stats/stat_segment.c +++ b/src/vpp/stats/stat_segment.c @@ -43,7 +43,7 @@ vlib_stats_push_heap (void) } void -vlib_stats_pop_heap (void *cm_arg, void *oldheap) +vlib_stats_pop_heap (void *cm_arg, void *oldheap, stat_directory_type_t type) { vlib_simple_counter_main_t *cm = (vlib_simple_counter_main_t *) cm_arg; stats_main_t *sm = &stats_main; @@ -80,7 +80,7 @@ vlib_stats_pop_heap (void *cm_arg, void *oldheap) } name_copy = format (0, "%s%c", stat_segment_name, 0); ep = clib_mem_alloc (sizeof (*ep)); - ep->type = STAT_DIR_TYPE_COUNTER_VECTOR; + ep->type = type; ep->value = cm->counters; hash_set_mem (sm->counter_vector_by_name, name_copy, ep); @@ -198,8 +198,13 @@ vlib_map_stat_segment_init (void) void *oldheap; u32 *lock; int rv; + u64 memory_size; - ssvmp->ssvm_size = 32 << 20; /*$$$$$ CONFIG PARAM */ + memory_size = sm->memory_size; + if (memory_size == 0) + memory_size = STAT_SEGMENT_DEFAULT_SIZE; + + ssvmp->ssvm_size = memory_size; ssvmp->i_am_master = 1; ssvmp->my_pid = getpid (); ssvmp->name = format (0, "/stats%c", 0); @@ -231,35 +236,43 @@ vlib_map_stat_segment_init (void) sm->input_rate_ptr = (scalar_data + 1); sm->last_runtime_ptr = (scalar_data + 2); sm->last_runtime_stats_clear_ptr = (scalar_data + 3); + sm->heartbeat_ptr = (scalar_data + 4); - name = format (0, "vector_rate%c", 0); + name = format (0, "/sys/vector_rate%c", 0); ep = clib_mem_alloc (sizeof (*ep)); ep->type = STAT_DIR_TYPE_SCALAR_POINTER; ep->value = sm->vector_rate_ptr; hash_set_mem (sm->counter_vector_by_name, name, ep); - name = format (0, "input_rate%c", 0); + name = format (0, "/sys/input_rate%c", 0); ep = clib_mem_alloc (sizeof (*ep)); ep->type = STAT_DIR_TYPE_SCALAR_POINTER; ep->value = sm->input_rate_ptr; hash_set_mem (sm->counter_vector_by_name, name, ep); - name = format (0, "last_update%c", 0); + name = format (0, "/sys/last_update%c", 0); ep = clib_mem_alloc (sizeof (*ep)); ep->type = STAT_DIR_TYPE_SCALAR_POINTER; ep->value = sm->last_runtime_ptr; hash_set_mem (sm->counter_vector_by_name, name, ep); - name = format (0, "last_stats_clear%c", 0); + name = format (0, "/sys/last_stats_clear%c", 0); ep = clib_mem_alloc (sizeof (*ep)); ep->type = STAT_DIR_TYPE_SCALAR_POINTER; ep->value = sm->last_runtime_stats_clear_ptr; hash_set_mem (sm->counter_vector_by_name, name, ep); + name = format (0, "/sys/heartbeat%c", 0); + ep = clib_mem_alloc (sizeof (*ep)); + ep->type = STAT_DIR_TYPE_SCALAR_POINTER; + ep->value = sm->heartbeat_ptr; + + hash_set_mem (sm->counter_vector_by_name, name, ep); + /* Publish the hash table */ shared_header->opaque[STAT_SEGMENT_OPAQUE_DIR] = sm->counter_vector_by_name; @@ -304,7 +317,8 @@ format_stat_dir_entry (u8 * s, va_list * args) type_name = "VectorPtr"; break; - case STAT_DIR_TYPE_COUNTER_VECTOR: + case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE: + case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED: type_name = "CMainPtr"; break; @@ -505,9 +519,36 @@ do_stat_segment_updates (stats_main_t * sm) sm->last_runtime_stats_clear_ptr[0] = vm->node_main.time_last_runtime_stats_clear; - update_serialized_nodes (sm); + if (sm->serialize_nodes) + update_serialized_nodes (sm); + + /* Heartbeat, so clients detect we're still here */ + (*sm->heartbeat_ptr)++; +} + +static clib_error_t * +statseg_config (vlib_main_t * vm, unformat_input_t * input) +{ + stats_main_t *sm = &stats_main; + uword ms; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "size %U", unformat_memory_size, &sm->memory_size)) + ; + else if (unformat (input, "serialize-nodes on")) + sm->serialize_nodes = 1; + else if (unformat (input, "serialize-nodes off")) + sm->serialize_nodes = 0; + else + return clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + } + + return 0; } +VLIB_EARLY_CONFIG_FUNCTION (statseg_config, "statseg"); /* * fd.io coding-style-patch-verification: ON