vlib: fix counter_will_expand prediction

vlib_validate_combined_counter_will_expand() was calling
_vec_resize_will_expand() with wrong arguments, which resulted in false
return value. Apart from the initial call, it never indicated a vector
resize.

The callers relying on this function did not perform a barrier sync
because of the wrong prediction even if the vector got extended by
a subsequent vlib_validate_combined_counter() call.

The fix introduces a new, simplified macro that is easier to call.
vec_resize_will_expand() accepts the same arguments as vec_resize().

Type: fix
Signed-off-by: Miklos Tirpak <miklos.tirpak@gmail.com>
Change-Id: Ib2c2c8afd3e665e0e3d6ae62ff5cfa287acf670f
This commit is contained in:
Miklos Tirpak
2021-01-13 10:00:38 +01:00
committed by Ole Tr�an
parent d7b9af4add
commit e700df8eb4
2 changed files with 18 additions and 6 deletions

View File

@@ -140,12 +140,9 @@ int
/* Trivially OK, and proves that index >= vec_len(...) */
if (index < vec_len (cm->counters[i]))
continue;
if (_vec_resize_will_expand
(cm->counters[i],
index - vec_len (cm->counters[i]) /* length_increment */ ,
sizeof (cm->counters[i]) /* data_bytes */ ,
0 /* header_bytes */ ,
CLIB_CACHE_LINE_BYTES /* data_alignment */ ))
if (vec_resize_will_expand (cm->counters[i],
index - vec_len (cm->counters[i]) +
1 /* length_increment */))
{
vlib_stats_pop_heap (cm, oldheap, index,
3 /*STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED */ );

View File

@@ -209,6 +209,21 @@ _vec_resize_will_expand (void *v,
return 1;
}
/** \brief Determine if vector will resize with next allocation
@param V pointer to a vector
@param N number of elements to add
@return 1 if vector will resize 0 otherwise
*/
#define vec_resize_will_expand(V, N) \
({ \
word _v (n) = (N); \
word _v (l) = vec_len (V); \
_vec_resize_will_expand ((V), _v (n), \
(_v (l) + _v (n)) * sizeof ((V)[0]), 0, 0); \
})
/** \brief Predicate function, says whether the supplied vector is a clib heap
object (general version).