summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vpp/stats/stat_segment.c54
-rw-r--r--src/vpp/stats/stat_segment.h31
-rw-r--r--src/vpp/stats/stat_segment_provider.c77
3 files changed, 96 insertions, 66 deletions
diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c
index efbc2e42ffc..24ab3e62ff9 100644
--- a/src/vpp/stats/stat_segment.c
+++ b/src/vpp/stats/stat_segment.c
@@ -359,16 +359,6 @@ stat_validate_counter_vector (stat_segment_directory_entry_t *ep, u32 max)
stat_validate_counter_vector2 (ep, tm->n_vlib_mains, max);
}
-always_inline void
-stat_set_simple_counter (stat_segment_directory_entry_t * ep,
- u32 thread_index, u32 index, u64 value)
-{
- ASSERT (ep->data);
- counter_t **counters = ep->data;
- counter_t *cb = counters[thread_index];
- cb[index] = value;
-}
-
void
vlib_stats_pop_heap2 (u64 * error_vector, u32 thread_index, void *oldheap,
int lock)
@@ -751,11 +741,8 @@ update_node_counters (stat_segment_main_t * sm)
static void
do_stat_segment_updates (vlib_main_t *vm, stat_segment_main_t *sm)
{
- f64 vector_rate;
u64 input_packets;
f64 dt, now;
- vlib_main_t *this_vlib_main;
- int i;
static int num_worker_threads_set;
/*
@@ -765,46 +752,15 @@ do_stat_segment_updates (vlib_main_t *vm, stat_segment_main_t *sm)
*/
if (PREDICT_FALSE (num_worker_threads_set == 0))
{
- void *oldheap = clib_mem_set_heap (sm->heap);
- vlib_stat_segment_lock ();
-
- stat_validate_counter_vector (&sm->directory_vector
- [STAT_COUNTER_VECTOR_RATE_PER_WORKER], 0);
+ vlib_thread_main_t *tm = vlib_get_thread_main ();
+ ASSERT (tm->n_vlib_mains > 0);
+ stat_provider_register_vector_rate (tm->n_vlib_mains - 1);
+ sm->directory_vector[STAT_COUNTER_NUM_WORKER_THREADS].value =
+ tm->n_vlib_mains - 1;
num_worker_threads_set = 1;
- vlib_stat_segment_unlock ();
- clib_mem_set_heap (oldheap);
}
/*
- * Compute per-worker vector rates, and the average vector rate
- * across all workers
- */
- vector_rate = 0.0;
-
- for (i = 0; i < vlib_get_n_threads (); i++)
- {
-
- f64 this_vector_rate;
-
- this_vlib_main = vlib_get_main_by_index (i);
-
- this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
- vlib_clear_internal_node_vector_rate (this_vlib_main);
-
- vector_rate += this_vector_rate;
-
- /* Set the per-worker rate */
- stat_set_simple_counter (&sm->directory_vector
- [STAT_COUNTER_VECTOR_RATE_PER_WORKER], i, 0,
- this_vector_rate);
- }
-
- /* And set the system average rate */
- vector_rate /= (f64) (i > 1 ? i - 1 : 1);
-
- sm->directory_vector[STAT_COUNTER_VECTOR_RATE].value = vector_rate;
-
- /*
* Compute the aggregate input rate
*/
now = vlib_time_now (vm);
diff --git a/src/vpp/stats/stat_segment.h b/src/vpp/stats/stat_segment.h
index c6056b1fade..f5862a684e4 100644
--- a/src/vpp/stats/stat_segment.h
+++ b/src/vpp/stats/stat_segment.h
@@ -22,20 +22,18 @@
typedef enum
{
- STAT_COUNTER_VECTOR_RATE = 0,
- STAT_COUNTER_NUM_WORKER_THREADS,
- STAT_COUNTER_VECTOR_RATE_PER_WORKER,
- STAT_COUNTER_INPUT_RATE,
- STAT_COUNTER_LAST_UPDATE,
- STAT_COUNTER_LAST_STATS_CLEAR,
- STAT_COUNTER_HEARTBEAT,
- STAT_COUNTER_NODE_CLOCKS,
- STAT_COUNTER_NODE_VECTORS,
- STAT_COUNTER_NODE_CALLS,
- STAT_COUNTER_NODE_SUSPENDS,
- STAT_COUNTER_INTERFACE_NAMES,
- STAT_COUNTER_NODE_NAMES,
- STAT_COUNTERS
+ STAT_COUNTER_NUM_WORKER_THREADS = 0,
+ STAT_COUNTER_INPUT_RATE,
+ STAT_COUNTER_LAST_UPDATE,
+ STAT_COUNTER_LAST_STATS_CLEAR,
+ STAT_COUNTER_HEARTBEAT,
+ STAT_COUNTER_NODE_CLOCKS,
+ STAT_COUNTER_NODE_VECTORS,
+ STAT_COUNTER_NODE_CALLS,
+ STAT_COUNTER_NODE_SUSPENDS,
+ STAT_COUNTER_INTERFACE_NAMES,
+ STAT_COUNTER_NODE_NAMES,
+ STAT_COUNTERS
} stat_segment_counter_t;
/* clang-format off */
@@ -46,9 +44,6 @@ typedef enum
_ (NODE_SUSPENDS, COUNTER_VECTOR_SIMPLE, suspends, /sys/node)
#define foreach_stat_segment_counter_name \
- _ (VECTOR_RATE, SCALAR_INDEX, vector_rate, /sys) \
- _ (VECTOR_RATE_PER_WORKER, COUNTER_VECTOR_SIMPLE, vector_rate_per_worker, \
- /sys) \
_ (NUM_WORKER_THREADS, SCALAR_INDEX, num_worker_threads, /sys) \
_ (INPUT_RATE, SCALAR_INDEX, input_rate, /sys) \
_ (LAST_UPDATE, SCALAR_INDEX, last_update, /sys) \
@@ -123,4 +118,6 @@ void vlib_stat_segment_unlock (void);
void vlib_stats_register_symlink (void *oldheap, u8 *name, u32 index1,
u32 index2, u8 lock);
+void stat_provider_register_vector_rate (u32 num_workers);
+
#endif
diff --git a/src/vpp/stats/stat_segment_provider.c b/src/vpp/stats/stat_segment_provider.c
index 2212ffe98dd..fc883f7751d 100644
--- a/src/vpp/stats/stat_segment_provider.c
+++ b/src/vpp/stats/stat_segment_provider.c
@@ -119,3 +119,80 @@ vlib_stats_register_mem_heap (clib_mem_heap_t *heap)
stat_segment_poll_add (mem_vector_index, stat_provider_mem_usage_update_fn,
heap_index, 10);
}
+
+static void
+stat_provider_vector_rate_per_thread_update_fn (
+ stat_segment_directory_entry_t *e, u32 index)
+{
+ vlib_main_t *this_vlib_main;
+ int i;
+ ASSERT (e->data);
+ counter_t **counters = e->data;
+
+ for (i = 0; i < vlib_get_n_threads (); i++)
+ {
+
+ f64 this_vector_rate;
+
+ this_vlib_main = vlib_get_main_by_index (i);
+
+ this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
+ vlib_clear_internal_node_vector_rate (this_vlib_main);
+ /* Set the per-worker rate */
+ counter_t *cb = counters[i];
+ cb[0] = this_vector_rate;
+ }
+}
+
+static void
+stat_provider_vector_rate_update_fn (stat_segment_directory_entry_t *e,
+ u32 index)
+{
+ vlib_main_t *this_vlib_main;
+ int i;
+ f64 vector_rate = 0.0;
+ for (i = 0; i < vlib_get_n_threads (); i++)
+ {
+
+ f64 this_vector_rate;
+
+ this_vlib_main = vlib_get_main_by_index (i);
+
+ this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
+ vlib_clear_internal_node_vector_rate (this_vlib_main);
+
+ vector_rate += this_vector_rate;
+ }
+
+ /* And set the system average rate */
+ vector_rate /= (f64) (i > 1 ? i - 1 : 1);
+ e->value = vector_rate;
+}
+
+void
+stat_provider_register_vector_rate (u32 num_workers)
+{
+ int i;
+
+ u8 *s = format (0, "/sys/vector_rate");
+
+ i = stat_segment_new_entry (s, STAT_DIR_TYPE_SCALAR_INDEX);
+ if (i == ~0)
+ ASSERT (0);
+ vec_free (s);
+ stat_segment_poll_add (i, stat_provider_vector_rate_update_fn, ~0, 10);
+
+ s = format (0, "/sys/vector_rate_per_worker");
+ i = stat_segment_new_entry (s, STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE);
+ if (i == ~0)
+ ASSERT (0);
+ vec_free (s);
+ stat_segment_poll_add (i, stat_provider_vector_rate_per_thread_update_fn, ~0,
+ 10);
+
+ stat_segment_main_t *sm = &stat_segment_main;
+ vlib_stat_segment_lock ();
+ stat_segment_directory_entry_t *ep = &sm->directory_vector[i];
+ ep->data = stat_validate_counter_vector3 (ep->data, num_workers, 0);
+ vlib_stat_segment_unlock ();
+}