From 53369ab5645b9bb26846adc7a4b7a0535caa8978 Mon Sep 17 00:00:00 2001 From: Aurel Feer Date: Mon, 11 Apr 2022 18:27:16 +0200 Subject: [PATCH] alloc and free many small buffers --- lib/mm/mm.c | 7 ++++++- usr/mallocator/main.c | 42 +++++++++++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/lib/mm/mm.c b/lib/mm/mm.c index d470880..bf033bf 100644 --- a/lib/mm/mm.c +++ b/lib/mm/mm.c @@ -34,7 +34,7 @@ struct mm_root_node { mm_leaf_node_t *leafs[MM_LEAF_COUNT]; }; STATIC_ASSERT(sizeof(struct mm_root_node) <= MM_BLOCK_SIZE, "struct mm_root_node too big"); - +static size_t number_of_bytes_allocated = 0; errval_t mm_init(struct mm *mm, enum objtype objtype, slab_refill_func_t slab_refill_func, @@ -120,6 +120,11 @@ errval_t mm_add(struct mm *mm, struct capref cap) errval_t mm_alloc_aligned(struct mm *mm, size_t size, size_t alignment, struct capref *retcap) { errval_t err; + + //TODO afeer: remove this after evaluation + number_of_bytes_allocated += size; + // debug_printf("[mm] number_of_bytes_allocated: %x\n", number_of_bytes_allocated); + if ((alignment & (alignment - 1)) != 0) { return MM_ERR_BAD_ALIGNMENT; } diff --git a/usr/mallocator/main.c b/usr/mallocator/main.c index 4a7f459..bc03868 100644 --- a/usr/mallocator/main.c +++ b/usr/mallocator/main.c @@ -18,16 +18,44 @@ #include #include -int main(int argc, char *argv[]) -{ - //allocate a 256 byte buffer - // char * small_buf = malloc(256); - // small_buf[0] = 'a'; +#define NUM_SMALL_BUFFERS 128 + +static void test_large_buffer(void) { //allocate a 256 MiB buffer + debug_printf("allocating 256MiB buffer\n"); char * big_buf = malloc(1<<28); big_buf[0] = 'a'; - for (int i = 0; i < (1 << 16); i += 4096) { - debug_printf("%x\n", i); + + //only write to a small part of the large buffer + for (int i = 0; i < (1 << 16); i += (1 << 12)) { big_buf[i] = 'b'; } + + debug_printf("freeing 256MiB buffer\n"); + free(big_buf); +} + +static void test_many_buffers(void) { + + char* buffers[NUM_SMALL_BUFFERS]; + + for (int i = 0; i < NUM_SMALL_BUFFERS; ++i) { + buffers[i] = malloc(4 * BASE_PAGE_SIZE); + } + + //free the buffers in a different order + for (int i = NUM_SMALL_BUFFERS - 1; i >= NUM_SMALL_BUFFERS / 2; --i) { + free(buffers[i]); + } + for (int i = 0; i < NUM_SMALL_BUFFERS / 2; ++i) { + free(buffers[i]); + } +} + +int main(int argc, char *argv[]) +{ + test_large_buffer(); + test_many_buffers(); + + debug_printf("i am done!\n"); } \ No newline at end of file