From 2c839e70901b84a98a5ce09999c0ee982bb50360 Mon Sep 17 00:00:00 2001 From: Daan Date: Wed, 28 May 2025 16:37:02 -0700 Subject: [PATCH] fix statistics for tracking the freed size of huge pages --- src/arena.c | 11 ++++++++++- src/free.c | 5 +---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/arena.c b/src/arena.c index 06fb9cb8..e040f220 100644 --- a/src/arena.c +++ b/src/arena.c @@ -807,18 +807,27 @@ void _mi_arenas_page_free(mi_page_t* page, mi_tld_t* stats_tld /* can be NULL */ mi_assert_internal(mi_page_is_abandoned(page)); mi_assert_internal(page->next==NULL && page->prev==NULL); + // statistics + const size_t block_size = mi_page_block_size(page); if (stats_tld != NULL) { mi_tld_stat_decrease(stats_tld, page_bins[_mi_page_bin(page)], 1); mi_tld_stat_decrease(stats_tld, pages, 1); + if (block_size > MI_LARGE_MAX_OBJ_SIZE) { + mi_tld_stat_decrease(stats_tld, malloc_huge, block_size); + } } else { mi_os_stat_decrease(page_bins[_mi_page_bin(page)], 1); mi_os_stat_decrease(pages, 1); + if (block_size > MI_LARGE_MAX_OBJ_SIZE) { + mi_os_stat_decrease(malloc_huge, block_size); + } } + // assertions #if MI_DEBUG>1 if (page->memid.memkind==MI_MEM_ARENA && !mi_page_is_full(page)) { - size_t bin = _mi_bin(mi_page_block_size(page)); + size_t bin = _mi_bin(block_size); size_t slice_index; size_t slice_count; mi_arena_t* arena = mi_page_arena(page, &slice_index, &slice_count); diff --git a/src/free.c b/src/free.c index 55996e39..e8ebeba8 100644 --- a/src/free.c +++ b/src/free.c @@ -543,10 +543,7 @@ void mi_stat_free(const mi_page_t* page, const mi_block_t* block) { mi_heap_stat_decrease(heap, malloc_bins[_mi_bin(bsize)], 1); #endif } - else { - const size_t bpsize = mi_page_block_size(page); // match stat in page.c:mi_huge_page_alloc - mi_heap_stat_decrease(heap, malloc_huge, bpsize); - } + // huge pages sizes are tracked in `arena.c:_mi_arenas_page_free` } #else void mi_stat_free(const mi_page_t* page, const mi_block_t* block) {