vppinfra: fixed pool from heap
Immediate benefit is ability to use hugepage backed memory. Type: improvement Change-Id: Ibcae961aa09ea92d3e931a40bedbc6346a4b2039 Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
@ -40,92 +40,36 @@
|
|||||||
__clib_export void
|
__clib_export void
|
||||||
_pool_init_fixed (void **pool_ptr, u32 elt_size, u32 max_elts)
|
_pool_init_fixed (void **pool_ptr, u32 elt_size, u32 max_elts)
|
||||||
{
|
{
|
||||||
u8 *mmap_base;
|
uword *b;
|
||||||
u64 vector_size;
|
pool_header_t *ph;
|
||||||
u64 free_index_size;
|
|
||||||
u64 total_size;
|
|
||||||
u64 page_size;
|
|
||||||
pool_header_t *fh;
|
|
||||||
vec_header_t *vh;
|
|
||||||
u8 *v;
|
u8 *v;
|
||||||
u32 *fi;
|
|
||||||
u32 i;
|
u32 i;
|
||||||
u32 set_bits;
|
|
||||||
|
|
||||||
ASSERT (elt_size);
|
ASSERT (elt_size);
|
||||||
ASSERT (max_elts);
|
ASSERT (max_elts);
|
||||||
|
|
||||||
vector_size =
|
v = vec_resize_allocate_memory (0, max_elts, elt_size * max_elts,
|
||||||
vec_header_bytes (pool_aligned_header_bytes) + (u64) elt_size * max_elts;
|
sizeof (pool_header_t),
|
||||||
free_index_size = vec_header_bytes (0) + sizeof (u32) * max_elts;
|
CLIB_CACHE_LINE_BYTES, VEC_NUMA_UNSPECIFIED);
|
||||||
|
|
||||||
/* Round up to a cache line boundary */
|
ph = pool_header (v);
|
||||||
vector_size = (vector_size + CLIB_CACHE_LINE_BYTES - 1)
|
ph->max_elts = max_elts;
|
||||||
& ~(CLIB_CACHE_LINE_BYTES - 1);
|
|
||||||
|
|
||||||
free_index_size = (free_index_size + CLIB_CACHE_LINE_BYTES - 1)
|
|
||||||
& ~(CLIB_CACHE_LINE_BYTES - 1);
|
|
||||||
|
|
||||||
total_size = vector_size + free_index_size;
|
|
||||||
|
|
||||||
/* Round up to an even number of pages */
|
|
||||||
page_size = clib_mem_get_page_size ();
|
|
||||||
total_size = (total_size + page_size - 1) & ~(page_size - 1);
|
|
||||||
|
|
||||||
/* mmap demand zero memory */
|
|
||||||
|
|
||||||
mmap_base = mmap (0, total_size, PROT_READ | PROT_WRITE,
|
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
|
||||||
|
|
||||||
if (mmap_base == MAP_FAILED)
|
|
||||||
{
|
|
||||||
clib_unix_warning ("mmap");
|
|
||||||
*pool_ptr = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* First comes the pool header */
|
|
||||||
fh = (pool_header_t *) mmap_base;
|
|
||||||
/* Find the user vector pointer */
|
|
||||||
v = (u8 *) (mmap_base + vec_header_bytes (pool_aligned_header_bytes));
|
|
||||||
/* Finally, the vector header */
|
|
||||||
vh = _vec_find (v);
|
|
||||||
|
|
||||||
fh->free_bitmap = 0; /* No free elts (yet) */
|
|
||||||
fh->max_elts = max_elts;
|
|
||||||
fh->mmap_base = mmap_base;
|
|
||||||
fh->mmap_size = total_size;
|
|
||||||
|
|
||||||
vh->len = max_elts;
|
|
||||||
|
|
||||||
/* Build the free-index vector */
|
/* Build the free-index vector */
|
||||||
vh = (vec_header_t *) ((u8 *) fh + vector_size);
|
vec_validate_aligned (ph->free_indices, max_elts - 1, CLIB_CACHE_LINE_BYTES);
|
||||||
vh->len = max_elts;
|
for (i = 0; i < max_elts; i++)
|
||||||
fi = (u32 *) (vh + 1);
|
ph->free_indices[i] = (max_elts - 1) - i;
|
||||||
|
|
||||||
fh->free_indices = fi;
|
|
||||||
|
|
||||||
/* Set the entire free bitmap */
|
/* Set the entire free bitmap */
|
||||||
clib_bitmap_alloc (fh->free_bitmap, max_elts);
|
clib_bitmap_alloc (ph->free_bitmap, max_elts);
|
||||||
clib_memset (fh->free_bitmap, 0xff,
|
|
||||||
vec_len (fh->free_bitmap) * sizeof (uword));
|
|
||||||
|
|
||||||
/* Clear any extraneous set bits */
|
for (b = ph->free_bitmap, i = max_elts; i >= uword_bits;
|
||||||
set_bits = vec_len (fh->free_bitmap) * BITS (uword);
|
i -= uword_bits, b++)
|
||||||
|
b[0] = ~0ULL;
|
||||||
|
|
||||||
for (i = max_elts; i < set_bits; i++)
|
if (i)
|
||||||
fh->free_bitmap = clib_bitmap_set (fh->free_bitmap, i, 0);
|
b[0] = pow2_mask (i);
|
||||||
|
|
||||||
/* Create the initial free vector */
|
|
||||||
for (i = 0; i < max_elts; i++)
|
|
||||||
fi[i] = (max_elts - 1) - i;
|
|
||||||
|
|
||||||
*pool_ptr = v;
|
*pool_ptr = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* fd.io coding-style-patch-verification: ON
|
|
||||||
*
|
|
||||||
* Local Variables:
|
|
||||||
* eval: (c-set-style "gnu")
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
@ -61,10 +61,6 @@ typedef struct
|
|||||||
/** Maximum size of the pool, in elements */
|
/** Maximum size of the pool, in elements */
|
||||||
u32 max_elts;
|
u32 max_elts;
|
||||||
|
|
||||||
/** mmap segment info: base + length */
|
|
||||||
u8 *mmap_base;
|
|
||||||
u64 mmap_size;
|
|
||||||
|
|
||||||
} pool_header_t;
|
} pool_header_t;
|
||||||
|
|
||||||
/** Align pool header so that pointers are naturally aligned. */
|
/** Align pool header so that pointers are naturally aligned. */
|
||||||
@ -430,19 +426,8 @@ _pool_free (void *v)
|
|||||||
return v;
|
return v;
|
||||||
clib_bitmap_free (p->free_bitmap);
|
clib_bitmap_free (p->free_bitmap);
|
||||||
|
|
||||||
if (p->max_elts)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
rv = munmap (p->mmap_base, p->mmap_size);
|
|
||||||
if (rv)
|
|
||||||
clib_unix_warning ("munmap");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vec_free (p->free_indices);
|
vec_free (p->free_indices);
|
||||||
vec_free_h (v, pool_aligned_header_bytes);
|
vec_free_h (v, pool_aligned_header_bytes);
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user