stats: refactor vlib counters
Change-Id: I09d2da73eff42c52ba1373acc99ff28f283a6725 Type: improvement Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:

committed by
Florin Coras

parent
92991e5c69
commit
58fd481d73
@ -79,63 +79,59 @@ void
|
||||
vlib_validate_simple_counter (vlib_simple_counter_main_t * cm, u32 index)
|
||||
{
|
||||
vlib_thread_main_t *tm = vlib_get_thread_main ();
|
||||
int i, resized = 0;
|
||||
void *oldheap = vlib_stats_set_heap ();
|
||||
char *name = cm->stat_segment_name ? cm->stat_segment_name : cm->name;
|
||||
|
||||
vec_validate (cm->counters, tm->n_vlib_mains - 1);
|
||||
for (i = 0; i < tm->n_vlib_mains; i++)
|
||||
if (index >= vec_len (cm->counters[i]))
|
||||
{
|
||||
if (vec_resize_will_expand (cm->counters[i],
|
||||
index - vec_len (cm->counters[i]) +
|
||||
1 /* length_increment */))
|
||||
resized++;
|
||||
if (name == 0)
|
||||
{
|
||||
if (cm->counters == 0)
|
||||
cm->stats_entry_index = ~0;
|
||||
vec_validate (cm->counters, tm->n_vlib_mains - 1);
|
||||
for (int i = 0; i < tm->n_vlib_mains; i++)
|
||||
vec_validate_aligned (cm->counters[i], index, CLIB_CACHE_LINE_BYTES);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
clib_mem_set_heap (oldheap);
|
||||
/* Avoid the epoch increase when there was no counter vector resize. */
|
||||
if (resized)
|
||||
vlib_stats_update_counter (cm, index, STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE);
|
||||
if (cm->counters == 0)
|
||||
cm->stats_entry_index = vlib_stats_add_counter_vector ("%s", name);
|
||||
|
||||
vlib_stats_validate (cm->stats_entry_index, tm->n_vlib_mains - 1, index);
|
||||
cm->counters = vlib_stats_get_entry_data_pointer (cm->stats_entry_index);
|
||||
}
|
||||
|
||||
void
|
||||
vlib_free_simple_counter (vlib_simple_counter_main_t * cm)
|
||||
{
|
||||
int i;
|
||||
|
||||
vlib_stats_delete_cm (cm);
|
||||
|
||||
void *oldheap = vlib_stats_set_heap ();
|
||||
for (i = 0; i < vec_len (cm->counters); i++)
|
||||
vec_free (cm->counters[i]);
|
||||
vec_free (cm->counters);
|
||||
clib_mem_set_heap (oldheap);
|
||||
if (cm->stats_entry_index == ~0)
|
||||
{
|
||||
for (int i = 0; i < vec_len (cm->counters); i++)
|
||||
vec_free (cm->counters[i]);
|
||||
vec_free (cm->counters);
|
||||
}
|
||||
else
|
||||
vlib_stats_remove_entry (cm->stats_entry_index);
|
||||
}
|
||||
|
||||
void
|
||||
vlib_validate_combined_counter (vlib_combined_counter_main_t * cm, u32 index)
|
||||
{
|
||||
vlib_thread_main_t *tm = vlib_get_thread_main ();
|
||||
int i, resized = 0;
|
||||
void *oldheap = vlib_stats_set_heap ();
|
||||
char *name = cm->stat_segment_name ? cm->stat_segment_name : cm->name;
|
||||
|
||||
vec_validate (cm->counters, tm->n_vlib_mains - 1);
|
||||
for (i = 0; i < tm->n_vlib_mains; i++)
|
||||
if (index >= vec_len (cm->counters[i]))
|
||||
{
|
||||
if (vec_resize_will_expand (cm->counters[i],
|
||||
index - vec_len (cm->counters[i]) +
|
||||
1 /* length_increment */))
|
||||
resized++;
|
||||
if (name == 0)
|
||||
{
|
||||
if (cm->counters == 0)
|
||||
cm->stats_entry_index = ~0;
|
||||
vec_validate (cm->counters, tm->n_vlib_mains - 1);
|
||||
for (int i = 0; i < tm->n_vlib_mains; i++)
|
||||
vec_validate_aligned (cm->counters[i], index, CLIB_CACHE_LINE_BYTES);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
clib_mem_set_heap (oldheap);
|
||||
/* Avoid the epoch increase when there was no counter vector resize. */
|
||||
if (resized)
|
||||
vlib_stats_update_counter (cm, index,
|
||||
STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED);
|
||||
if (cm->counters == 0)
|
||||
cm->stats_entry_index = vlib_stats_add_counter_pair_vector ("%s", name);
|
||||
|
||||
vlib_stats_validate (cm->stats_entry_index, tm->n_vlib_mains - 1, index);
|
||||
cm->counters = vlib_stats_get_entry_data_pointer (cm->stats_entry_index);
|
||||
}
|
||||
|
||||
int
|
||||
@ -173,15 +169,14 @@ int
|
||||
void
|
||||
vlib_free_combined_counter (vlib_combined_counter_main_t * cm)
|
||||
{
|
||||
int i;
|
||||
|
||||
vlib_stats_delete_cm (cm);
|
||||
|
||||
void *oldheap = vlib_stats_set_heap ();
|
||||
for (i = 0; i < vec_len (cm->counters); i++)
|
||||
vec_free (cm->counters[i]);
|
||||
vec_free (cm->counters);
|
||||
clib_mem_set_heap (oldheap);
|
||||
if (cm->stats_entry_index == ~0)
|
||||
{
|
||||
for (int i = 0; i < vec_len (cm->counters); i++)
|
||||
vec_free (cm->counters[i]);
|
||||
vec_free (cm->counters);
|
||||
}
|
||||
else
|
||||
vlib_stats_remove_entry (cm->stats_entry_index);
|
||||
}
|
||||
|
||||
u32
|
||||
|
@ -59,6 +59,7 @@ typedef struct
|
||||
counter_t **counters; /**< Per-thread u64 non-atomic counters */
|
||||
char *name; /**< The counter collection's name. */
|
||||
char *stat_segment_name; /**< Name in stat segment directory */
|
||||
u32 stats_entry_index;
|
||||
} vlib_simple_counter_main_t;
|
||||
|
||||
/** The number of counters (not the number of per-thread counters) */
|
||||
@ -219,6 +220,7 @@ typedef struct
|
||||
vlib_counter_t **counters; /**< Per-thread u64 non-atomic counter pairs */
|
||||
char *name; /**< The counter collection's name. */
|
||||
char *stat_segment_name; /**< Name in stat segment directory */
|
||||
u32 stats_entry_index;
|
||||
} vlib_combined_counter_main_t;
|
||||
|
||||
/** The number of counters (not the number of per-thread counters) */
|
||||
|
@ -17,7 +17,7 @@ vector_rate_collector_fn (vlib_stats_collector_data_t *d)
|
||||
f64 vector_rate = 0.0;
|
||||
u32 i, n_threads = vlib_get_n_threads ();
|
||||
|
||||
vlib_stats_validate_counter_vector (d->entry_index, n_threads - 1);
|
||||
vlib_stats_validate (d->entry_index, 0, n_threads - 1);
|
||||
|
||||
for (i = 0; i < n_threads; i++)
|
||||
{
|
||||
@ -118,7 +118,7 @@ vlib_stats_init (vlib_main_t *vm)
|
||||
reg.entry_index =
|
||||
vlib_stats_add_counter_vector ("/sys/vector_rate_per_worker");
|
||||
vlib_stats_register_collector_fn (®);
|
||||
vlib_stats_validate_counter_vector (reg.entry_index, vlib_get_n_threads ());
|
||||
vlib_stats_validate (reg.entry_index, 0, vlib_get_n_threads ());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ vlib_stats_register_mem_heap (clib_mem_heap_t *heap)
|
||||
vec_add1 (memory_heaps_vec, heap);
|
||||
|
||||
r.entry_index = idx = vlib_stats_add_counter_vector ("/mem/%s", heap->name);
|
||||
vlib_stats_validate_counter_vector (idx, STAT_MEM_RELEASABLE);
|
||||
vlib_stats_validate (idx, 0, STAT_MEM_RELEASABLE);
|
||||
|
||||
/* Create symlink */
|
||||
vlib_stats_add_symlink (idx, STAT_MEM_TOTAL, "/mem/%s/used", heap->name);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -119,15 +119,21 @@ vlib_stats_get_entry (vlib_stats_segment_t *sm, u32 entry_index)
|
||||
return e;
|
||||
}
|
||||
|
||||
static_always_inline void *
|
||||
vlib_stats_get_entry_data_pointer (u32 entry_index)
|
||||
{
|
||||
vlib_stats_segment_t *sm = vlib_stats_get_segment ();
|
||||
vlib_stats_entry_t *e = vlib_stats_get_entry (sm, entry_index);
|
||||
return e->data;
|
||||
}
|
||||
|
||||
clib_error_t *vlib_stats_init (vlib_main_t *vm);
|
||||
void *vlib_stats_set_heap ();
|
||||
void vlib_stats_update_counter (void *, u32, stat_directory_type_t);
|
||||
void vlib_stats_register_error_index (u64 *em_vec, u64 index, char *fmt, ...);
|
||||
void vlib_stats_update_error_vector (u64 *error_vector, u32 thread_index,
|
||||
int lock);
|
||||
void vlib_stats_segment_lock (void);
|
||||
void vlib_stats_segment_unlock (void);
|
||||
void vlib_stats_delete_cm (void *);
|
||||
void vlib_stats_register_mem_heap (clib_mem_heap_t *);
|
||||
f64 vlib_stats_get_segment_update_rate (void);
|
||||
|
||||
@ -139,9 +145,11 @@ void vlib_stats_set_gauge (u32 entry_index, u64 value);
|
||||
u32 vlib_stats_add_timestamp (char *fmt, ...);
|
||||
void vlib_stats_set_timestamp (u32 entry_index, f64 value);
|
||||
|
||||
/* vector */
|
||||
/* counter vector */
|
||||
u32 vlib_stats_add_counter_vector (char *fmt, ...);
|
||||
void vlib_stats_validate_counter_vector (u32 entry_index, u32 vector_index);
|
||||
|
||||
/* counter pair vector */
|
||||
u32 vlib_stats_add_counter_pair_vector (char *fmt, ...);
|
||||
|
||||
/* string vector */
|
||||
u32 vlib_stats_add_string_vector (char *fmt, ...);
|
||||
@ -153,6 +161,8 @@ u32 vlib_stats_add_symlink (u32 entry_index, u32 vector_index, char *fmt, ...);
|
||||
void vlib_stats_rename_symlink (u64 entry_index, char *fmt, ...);
|
||||
|
||||
/* common to all types */
|
||||
void vlib_stats_validate (u32 entry_index, ...);
|
||||
int vlib_stats_validate_will_expand (u32 entry_index, ...);
|
||||
void vlib_stats_remove_entry (u32 entry_index);
|
||||
u32 vlib_stats_find_entry_index (char *fmt, ...);
|
||||
void vlib_stats_register_collector_fn (vlib_stats_collector_reg_t *r);
|
||||
|
Reference in New Issue
Block a user