diff options
author | Damjan Marion <damarion@cisco.com> | 2022-03-16 17:57:29 +0100 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2022-03-17 20:31:14 +0000 |
commit | 1da361f9ea525663a1141c3665a67df5e81c4133 (patch) | |
tree | 301fd513bc709e68b31d9671e63e9894b8aee36b /src/vppinfra/vec.c | |
parent | 2b702da86c42267682b30a888299b89718bc46e8 (diff) |
vppinfra: store vector header size and alignment into header
On the forst vector alloc values are stored into header.
Later, when vector grows values from header are used istead of provided
ones.
In the debug image code will assert if same values are not provided.
Type: improvement
Change-Id: I8fdcfa495e9c1df0f6392c90f634e8c74b73b328
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vppinfra/vec.c')
-rw-r--r-- | src/vppinfra/vec.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/vppinfra/vec.c b/src/vppinfra/vec.c index 970f7f7bfa8..97e2762ecbf 100644 --- a/src/vppinfra/vec.c +++ b/src/vppinfra/vec.c @@ -57,6 +57,7 @@ vec_resize_allocate_memory (void *v, void *oldheap; header_bytes = vec_header_bytes (header_bytes); + data_align = data_align == 0 ? 1 : data_align; data_bytes += header_bytes; @@ -66,6 +67,9 @@ vec_resize_allocate_memory (void *v, clib_mem_set_per_cpu_heap (clib_mem_get_per_numa_heap (numa_id)); } + /* alignment must be power of 2 */ + ASSERT (count_set_bits (data_align) == 1); + if (!v) { new = clib_mem_alloc_aligned_at_offset (data_bytes, data_align, header_bytes, 1 /* yes, call os_out_of_memory */ @@ -77,11 +81,20 @@ vec_resize_allocate_memory (void *v, v = new + header_bytes; _vec_len (v) = length_increment; _vec_numa (v) = numa_id; + ASSERT (header_bytes / VEC_HEADER_ROUND <= 255); + _vec_find (v)->hdr_size = header_bytes / VEC_HEADER_ROUND; + _vec_find (v)->log2_align = min_log2 (data_align); if (PREDICT_FALSE (numa_id != VEC_NUMA_UNSPECIFIED)) clib_mem_set_per_cpu_heap (oldheap); return v; } + ASSERT (_vec_find (v)->hdr_size * VEC_HEADER_ROUND == header_bytes); + header_bytes = _vec_find (v)->hdr_size * VEC_HEADER_ROUND; + + ASSERT (data_align == (1 << _vec_find (v)->log2_align)); + data_align = 1 << _vec_find (v)->log2_align; + vh->len += length_increment; old = v - header_bytes; |