This patch builds on previous commit #a58f446482edc5b4e2991c7ee9b20e42431d10c1 to further refine malloc pool allocations to correctly handle more scenarios involving various size, alignment combinations.
This patch also greatly enhances tst-small-malloc unit test to cover more allocation scenarios. Signed-off-by: Waldemar Kozaczuk <[email protected]> --- core/mempool.cc | 13 +++++++--- tests/tst-small-malloc.cc | 52 ++++++++++++++++++++++++++++++--------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/core/mempool.cc b/core/mempool.cc index deb7a0bb..23dc67da 100644 --- a/core/mempool.cc +++ b/core/mempool.cc @@ -1547,14 +1547,19 @@ static inline void* std_malloc(size_t size, size_t alignment) return libc_error_ptr<void *>(ENOMEM); void *ret; size_t minimum_size = std::max(size, memory::pool::min_object_size); - if (size <= memory::pool::max_object_size && alignment <= minimum_size && smp_allocator) { - size = minimum_size; - unsigned n = ilog2_roundup(size); + if (minimum_size <= memory::pool::max_object_size && alignment <= minimum_size && smp_allocator) { + unsigned n = ilog2_roundup(minimum_size); ret = memory::malloc_pools[n].alloc(); ret = translate_mem_area(mmu::mem_area::main, mmu::mem_area::mempool, ret); trace_memory_malloc_mempool(ret, size, 1 << n, alignment); - } else if (size <= mmu::page_size && alignment <= mmu::page_size) { + } else if (alignment <= memory::pool::max_object_size && minimum_size <= alignment && smp_allocator) { + unsigned n = ilog2_roundup(alignment); + ret = memory::malloc_pools[n].alloc(); + ret = translate_mem_area(mmu::mem_area::main, mmu::mem_area::mempool, + ret); + trace_memory_malloc_mempool(ret, size, 1 << n, alignment); + } else if (minimum_size <= mmu::page_size && alignment <= mmu::page_size) { ret = mmu::translate_mem_area(mmu::mem_area::main, mmu::mem_area::page, memory::alloc_page()); trace_memory_malloc_page(ret, size, mmu::page_size, alignment); diff --git a/tests/tst-small-malloc.cc b/tests/tst-small-malloc.cc index b0c97c03..7c826fa7 100644 --- a/tests/tst-small-malloc.cc +++ b/tests/tst-small-malloc.cc @@ -9,6 +9,18 @@ #include <cassert> #include <osv/trace-count.hh> +void test_malloc(size_t size) { + void *addr = malloc(size); + assert(addr); + free(addr); +} + +void test_aligned_alloc(size_t alignment, size_t size) { + void *addr = aligned_alloc(alignment, size); + assert(addr); + free(addr); +} + int main() { tracepoint_counter *memory_malloc_mempool_counter = nullptr, *memory_malloc_page_counter = nullptr; @@ -27,19 +39,35 @@ int main() { auto memory_malloc_mempool_counter_now = memory_malloc_mempool_counter->read(); auto memory_malloc_page_counter_now = memory_malloc_page_counter->read(); - const int allocation_count = 1024; + const int allocation_count = 256; for( int i = 0; i < allocation_count; i++) { - void *addr = malloc(7); - assert(addr); - free(addr); + // Expects malloc_pool allocations + test_malloc(3); + test_malloc(4); + test_malloc(6); + test_malloc(7); + test_malloc(8); + test_malloc(9); + test_malloc(15); + test_malloc(16); + test_malloc(17); + test_malloc(32); + test_malloc(1024); - addr = malloc(17); - assert(addr); - free(addr); + // Expects malloc_pool allocations + test_aligned_alloc(16, 5); + test_aligned_alloc(16, 19); + test_aligned_alloc(32, 17); + test_aligned_alloc(1024, 255); + + // Expects full page allocations + test_malloc(1025); + test_aligned_alloc(2048, 1027); } - // Verify all allocations above were handled by malloc_pool - assert(memory_malloc_mempool_counter->read() - memory_malloc_mempool_counter_now >= 2 * allocation_count); - // Verify that NO allocations were handled by alloc_page - assert(memory_malloc_page_counter->read() - memory_malloc_page_counter_now == 0); -} \ No newline at end of file + // Verify correct number of allocations above were handled by malloc_pool + assert(memory_malloc_mempool_counter->read() - memory_malloc_mempool_counter_now >= 15 * allocation_count); + + // Verify correct number of allocations were handled by alloc_page + assert(memory_malloc_page_counter->read() - memory_malloc_page_counter_now == 2 * allocation_count); +} -- 2.19.1 -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
