diff --git a/include/jemalloc/internal/arena_inlines_b.h b/include/jemalloc/internal/arena_inlines_b.h index a310eb29..844e045d 100644 --- a/include/jemalloc/internal/arena_inlines_b.h +++ b/include/jemalloc/internal/arena_inlines_b.h @@ -103,6 +103,12 @@ arena_prof_info_set(tsd_t *tsd, edata_t *edata, prof_tctx_t *tctx) { large_prof_info_set(edata, tctx); } +JEMALLOC_ALWAYS_INLINE bool +arena_may_force_decay(arena_t *arena) { + return !(arena_dirty_decay_ms_get(arena) == -1 + || arena_muzzy_decay_ms_get(arena) == -1); +} + JEMALLOC_ALWAYS_INLINE void arena_decay_ticks(tsdn_t *tsdn, arena_t *arena, unsigned nticks) { tsd_t *tsd; diff --git a/src/extent.c b/src/extent.c index 9779c38b..07c0bd21 100644 --- a/src/extent.c +++ b/src/extent.c @@ -1226,7 +1226,8 @@ extent_record(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, ecache_t *ecache, &arena->edata_cache, ehooks, rtree_ctx, ecache, edata, &coalesced, growing_retained); } while (coalesced); - if (edata_size_get(edata) >= oversize_threshold) { + if (edata_size_get(edata) >= oversize_threshold && + arena_may_force_decay(arena)) { /* Shortcut to purge the oversize extent eagerly. */ malloc_mutex_unlock(tsdn, &ecache->mtx); arena_decay_extent(tsdn, arena, ehooks, edata);