From 98eb40e563bd2c42bfd5d7275584a4aa69a2b3b7 Mon Sep 17 00:00:00 2001 From: David Goldblatt Date: Thu, 12 Dec 2019 16:33:19 -0800 Subject: [PATCH] Move delay_coalesce from the eset to the ecache. --- include/jemalloc/internal/ecache.h | 5 +++++ include/jemalloc/internal/eset.h | 11 +++-------- src/ecache.c | 3 ++- src/eset.c | 12 +++++------- src/extent2.c | 13 +++++++------ 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/include/jemalloc/internal/ecache.h b/include/jemalloc/internal/ecache.h index 70857203..05388b62 100644 --- a/include/jemalloc/internal/ecache.h +++ b/include/jemalloc/internal/ecache.h @@ -8,6 +8,11 @@ typedef struct ecache_s ecache_t; struct ecache_s { malloc_mutex_t mtx; eset_t eset; + /* + * If true, delay coalescing until eviction; otherwise coalesce during + * deallocation. + */ + bool delay_coalesce; }; typedef struct ecache_grow_s ecache_grow_t; diff --git a/include/jemalloc/internal/eset.h b/include/jemalloc/internal/eset.h index bbc6b5cd..7a1055c2 100644 --- a/include/jemalloc/internal/eset.h +++ b/include/jemalloc/internal/eset.h @@ -32,15 +32,9 @@ struct eset_s { /* All stored extents must be in the same state. */ extent_state_t state; - - /* - * If true, delay coalescing until eviction; otherwise coalesce during - * deallocation. - */ - bool delay_coalesce; }; -void eset_init(eset_t *eset, extent_state_t state, bool delay_coalesce); +void eset_init(eset_t *eset, extent_state_t state); extent_state_t eset_state_get(const eset_t *eset); size_t eset_npages_get(eset_t *eset); @@ -55,6 +49,7 @@ void eset_remove(eset_t *eset, edata_t *edata); * Select an extent from this eset of the given size and alignment. Returns * null if no such item could be found. */ -edata_t *eset_fit(eset_t *eset, size_t esize, size_t alignment); +edata_t *eset_fit(eset_t *eset, size_t esize, size_t alignment, + bool delay_coalesce); #endif /* JEMALLOC_INTERNAL_ESET_H */ diff --git a/src/ecache.c b/src/ecache.c index 7155de35..d5ed2356 100644 --- a/src/ecache.c +++ b/src/ecache.c @@ -8,7 +8,8 @@ ecache_init(tsdn_t *tsdn, ecache_t *ecache, extent_state_t state, malloc_mutex_rank_exclusive)) { return true; } - eset_init(&ecache->eset, state, delay_coalesce); + ecache->delay_coalesce = delay_coalesce; + eset_init(&ecache->eset, state); return false; } diff --git a/src/eset.c b/src/eset.c index e71868c8..9d3dedae 100644 --- a/src/eset.c +++ b/src/eset.c @@ -9,8 +9,7 @@ const bitmap_info_t eset_bitmap_info = BITMAP_INFO_INITIALIZER(SC_NPSIZES+1); void -eset_init(eset_t *eset, extent_state_t state, - bool delay_coalesce) { +eset_init(eset_t *eset, extent_state_t state) { for (unsigned i = 0; i < SC_NPSIZES + 1; i++) { edata_heap_new(&eset->heaps[i]); } @@ -18,7 +17,6 @@ eset_init(eset_t *eset, extent_state_t state, edata_list_init(&eset->lru); atomic_store_zu(&eset->npages, 0, ATOMIC_RELAXED); eset->state = state; - eset->delay_coalesce = delay_coalesce; } extent_state_t @@ -163,7 +161,7 @@ eset_fit_alignment(eset_t *eset, size_t min_size, size_t max_size, * large enough. */ static edata_t * -eset_first_fit(eset_t *eset, size_t size) { +eset_first_fit(eset_t *eset, size_t size, bool delay_coalesce) { edata_t *ret = NULL; pszind_t pind = sz_psz2ind(sz_psz_quantize_ceil(size)); @@ -191,7 +189,7 @@ eset_first_fit(eset_t *eset, size_t size) { * * Only do check for dirty eset (delay_coalesce). */ - if (eset->delay_coalesce && + if (delay_coalesce && (sz_pind2sz(i) >> opt_lg_extent_max_active_fit) > size) { break; } @@ -208,14 +206,14 @@ eset_first_fit(eset_t *eset, size_t size) { } edata_t * -eset_fit(eset_t *eset, size_t esize, size_t alignment) { +eset_fit(eset_t *eset, size_t esize, size_t alignment, bool delay_coalesce) { size_t max_size = esize + PAGE_CEILING(alignment) - PAGE; /* Beware size_t wrap-around. */ if (max_size < esize) { return NULL; } - edata_t *edata = eset_first_fit(eset, max_size); + edata_t *edata = eset_first_fit(eset, max_size, delay_coalesce); if (alignment > PAGE && edata == NULL) { /* diff --git a/src/extent2.c b/src/extent2.c index 3b47e070..96d4a112 100644 --- a/src/extent2.c +++ b/src/extent2.c @@ -235,7 +235,7 @@ extents_evict(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, ecache_t *ecache, goto label_return; } eset_remove(&ecache->eset, edata); - if (!ecache->eset.delay_coalesce) { + if (!ecache->delay_coalesce) { break; } /* Try to coalesce. */ @@ -563,7 +563,8 @@ extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, extent_unlock_edata(tsdn, unlock_edata); } } else { - edata = eset_fit(&ecache->eset, esize, alignment); + edata = eset_fit(&ecache->eset, esize, alignment, + ecache->delay_coalesce); } if (edata == NULL) { malloc_mutex_unlock(tsdn, &ecache->mtx); @@ -1127,7 +1128,7 @@ extent_try_coalesce_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, if (can_coalesce && !extent_coalesce(tsdn, arena, ehooks, ecache, edata, next, true, growing_retained)) { - if (ecache->eset.delay_coalesce) { + if (ecache->delay_coalesce) { /* Do minimal coalescing. */ *coalesced = true; return edata; @@ -1148,7 +1149,7 @@ extent_try_coalesce_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, ehooks, ecache, edata, prev, false, growing_retained)) { edata = prev; - if (ecache->eset.delay_coalesce) { + if (ecache->delay_coalesce) { /* Do minimal coalescing. */ *coalesced = true; return edata; @@ -1158,7 +1159,7 @@ extent_try_coalesce_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, } } while (again); - if (ecache->eset.delay_coalesce) { + if (ecache->delay_coalesce) { *coalesced = false; } return edata; @@ -1205,7 +1206,7 @@ extent_record(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, ecache_t *ecache, assert(rtree_edata_read(tsdn, &extents_rtree, rtree_ctx, (uintptr_t)edata_base_get(edata), true) == edata); - if (!ecache->eset.delay_coalesce) { + if (!ecache->delay_coalesce) { edata = extent_try_coalesce(tsdn, arena, ehooks, rtree_ctx, ecache, edata, NULL, growing_retained); } else if (edata_size_get(edata) >= SC_LARGE_MINCLASS) {