vppinfra: vec_max_len, vec_mem_size use stored header size
Type: improvement Change-Id: I17778e89674da0e8204713302e2293377bdabcbc Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:

committed by
Florin Coras

parent
1da361f9ea
commit
5c45d1cf1b
@ -1009,7 +1009,7 @@ hash_bytes (void *v)
|
|||||||
if (!v)
|
if (!v)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bytes = vec_mem_size (v, hash_header_bytes (v));
|
bytes = vec_mem_size (v);
|
||||||
|
|
||||||
for (i = 0; i < hash_capacity (v); i++)
|
for (i = 0; i < hash_capacity (v); i++)
|
||||||
{
|
{
|
||||||
@ -1019,7 +1019,7 @@ hash_bytes (void *v)
|
|||||||
if (h->log2_pair_size > 0)
|
if (h->log2_pair_size > 0)
|
||||||
bytes += 1 << indirect_pair_get_log2_bytes (&p->indirect);
|
bytes += 1 << indirect_pair_get_log2_bytes (&p->indirect);
|
||||||
else
|
else
|
||||||
bytes += vec_mem_size (p->indirect.pairs, 0);
|
bytes += vec_mem_size (p->indirect.pairs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bytes;
|
return bytes;
|
||||||
|
@ -640,10 +640,10 @@ heap_bytes (void *v)
|
|||||||
bytes = sizeof (h[0]);
|
bytes = sizeof (h[0]);
|
||||||
bytes += vec_len (v) * sizeof (h->elt_bytes);
|
bytes += vec_len (v) * sizeof (h->elt_bytes);
|
||||||
for (b = 0; b < vec_len (h->free_lists); b++)
|
for (b = 0; b < vec_len (h->free_lists); b++)
|
||||||
bytes += vec_mem_size (h->free_lists[b], 0);
|
bytes += vec_mem_size (h->free_lists[b]);
|
||||||
bytes += vec_bytes (h->free_lists);
|
bytes += vec_bytes (h->free_lists);
|
||||||
bytes += vec_mem_size (h->elts, 0);
|
bytes += vec_mem_size (h->elts);
|
||||||
bytes += vec_mem_size (h->free_elts, 0);
|
bytes += vec_mem_size (h->free_elts);
|
||||||
bytes += vec_bytes (h->used_elt_bitmap);
|
bytes += vec_bytes (h->used_elt_bitmap);
|
||||||
|
|
||||||
return bytes;
|
return bytes;
|
||||||
|
@ -163,7 +163,7 @@ pool_header_bytes (void *v)
|
|||||||
#define _pool_var(v) _pool_##v
|
#define _pool_var(v) _pool_##v
|
||||||
|
|
||||||
/** Number of elements that can fit into pool with current allocation */
|
/** Number of elements that can fit into pool with current allocation */
|
||||||
#define pool_max_len(P) vec_max_elts (P, pool_aligned_header_bytes)
|
#define pool_max_len(P) vec_max_len (P)
|
||||||
|
|
||||||
/** Number of free elements in pool */
|
/** Number of free elements in pool */
|
||||||
#define pool_free_elts(P) \
|
#define pool_free_elts(P) \
|
||||||
|
@ -85,6 +85,14 @@ vec_header_bytes (uword header_bytes)
|
|||||||
return round_pow2 (header_bytes + sizeof (vec_header_t), VEC_HEADER_ROUND);
|
return round_pow2 (header_bytes + sizeof (vec_header_t), VEC_HEADER_ROUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
always_inline uword
|
||||||
|
vec_get_header_size (void *v)
|
||||||
|
{
|
||||||
|
uword header_size = _vec_find (v)->hdr_size * VEC_HEADER_ROUND;
|
||||||
|
ASSERT (header_size >= vec_header_bytes (0));
|
||||||
|
return header_size;
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Find a user vector header
|
/** \brief Find a user vector header
|
||||||
|
|
||||||
Finds the user header of a vector with unspecified alignment given
|
Finds the user header of a vector with unspecified alignment given
|
||||||
@ -167,16 +175,14 @@ u32 vec_len_not_inline (void *v);
|
|||||||
* Return size of memory allocated for the vector
|
* Return size of memory allocated for the vector
|
||||||
*
|
*
|
||||||
* @param v vector
|
* @param v vector
|
||||||
* @param b extra header bytes
|
|
||||||
* @return memory size allocated for the vector
|
* @return memory size allocated for the vector
|
||||||
*/
|
*/
|
||||||
#define vec_mem_size(v, b) \
|
|
||||||
({ \
|
always_inline uword
|
||||||
void *_vec_mem_v = (void *) (v); \
|
vec_mem_size (void *v)
|
||||||
uword _vec_mem_b = (b); \
|
{
|
||||||
_vec_mem_b = sizeof (vec_header_t) + _vec_round_size (_vec_mem_b); \
|
return v ? clib_mem_size (v - vec_get_header_size (v)) : 0;
|
||||||
_vec_mem_v ? clib_mem_size (_vec_mem_v - _vec_mem_b) : 0; \
|
}
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of elements that can fit into generic vector
|
* Number of elements that can fit into generic vector
|
||||||
@ -185,25 +191,26 @@ u32 vec_len_not_inline (void *v);
|
|||||||
* @param b extra header bytes
|
* @param b extra header bytes
|
||||||
* @return number of elements that can fit into vector
|
* @return number of elements that can fit into vector
|
||||||
*/
|
*/
|
||||||
#define vec_max_elts(v, b) \
|
|
||||||
(v ? (vec_mem_size (v, b) - vec_header_bytes (b)) / sizeof (v[0]) : 0)
|
|
||||||
|
|
||||||
/** \brief Total number of elements that can fit into vector. */
|
always_inline uword
|
||||||
#define vec_max_len(v) vec_max_elts (v, 0)
|
_vec_max_len (void *v, uword elt_size)
|
||||||
|
{
|
||||||
|
return v ? vec_mem_size (v) / elt_size : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Set vector length to a user-defined value */
|
#define vec_max_len(v) _vec_max_len (v, sizeof ((v)[0]))
|
||||||
#ifndef __COVERITY__ /* Coverity gets confused by ASSERT() */
|
|
||||||
#define vec_set_len(v, l) do { \
|
always_inline void
|
||||||
ASSERT(v); \
|
_vec_set_len (void *v, uword len, uword elt_size)
|
||||||
ASSERT((l) <= vec_max_len(v)); \
|
{
|
||||||
CLIB_MEM_POISON_LEN((void *)(v), _vec_len(v) * sizeof((v)[0]), (l) * sizeof((v)[0])); \
|
ASSERT (v);
|
||||||
_vec_len(v) = (l); \
|
ASSERT (len <= vec_max_len (v));
|
||||||
} while (0)
|
|
||||||
#else /* __COVERITY__ */
|
CLIB_MEM_POISON_LEN (v, _vec_len (v) * elt_size, len * elt_size);
|
||||||
#define vec_set_len(v, l) do { \
|
_vec_len (v) = len;
|
||||||
_vec_len(v) = (l); \
|
}
|
||||||
} while (0)
|
|
||||||
#endif /* __COVERITY__ */
|
#define vec_set_len(v, l) _vec_set_len ((void *) v, l, sizeof ((v)[0]))
|
||||||
|
|
||||||
/** \brief Reset vector length to zero
|
/** \brief Reset vector length to zero
|
||||||
NULL-pointer tolerant
|
NULL-pointer tolerant
|
||||||
|
Reference in New Issue
Block a user