Hi Fidaullah,
Thanks for the fix,
Anatoly, I noticed a couple of other things while testing this.
1. Consider:
elt_size = pg_sz - MALLOC_ELEM_OVERHEAD
rte_malloc(align=0) which is converted to align = 1.
Obviously, such an element fits into one page, however:
alloc_sz = RTE_ALIGN_CEIL(1 + pg_sz +
(MALLOC_ELEM_OVERHEAD - MALLOC_ELEM_OVERHEAD),
pg_sz) == 2 * pg_sz.
This can unnecessarily hit an allocation limit from the system or EAL.
I suggest, in both places:
alloc_sz = RTE_ALIGN_CEIL(RTE_ALIGN_CEIL(elt_size, align) +
MALLOC_ELEM_OVERHEAD, pg_sz);
This would be symmetric with malloc_elem_can_hold().
2. Alignment calculation depends on whether we allocated new pages or not:
malloc_heap_alloc_on_heap_id(align = 0) ->
heap_alloc(align = 1) ->
find_suitable_element(align = RTE_CACHE_LINE_ROUNDUP(align))
malloc_heap_alloc_on_heap_id(align = 0) ->
alloc_more_mem_on_socket(align = 1) ->
try_expand_heap() -> ... ->
alloc_pages_on_heap(align = 1) ->
find_suitable_element(align = 1)