Move delay_coalesce from the eset to the ecache.

This commit is contained in:
David Goldblatt 2019-12-12 16:33:19 -08:00 committed by David Goldblatt
parent bb70df8e5b
commit 98eb40e563
5 changed files with 22 additions and 22 deletions

View File

@ -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;

View File

@ -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 */

View File

@ -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;
}

View File

@ -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) {
/*

View File

@ -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) {