stats: refactor vlib counters

Change-Id: I09d2da73eff42c52ba1373acc99ff28f283a6725
Type: improvement
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2022-03-14 13:04:38 +01:00
committed by Florin Coras
parent 92991e5c69
commit 58fd481d73
6 changed files with 219 additions and 163 deletions

View File

@ -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

View File

@ -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) */

View File

@ -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 (&reg);
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;
}

View File

@ -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

View File

@ -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);