From 0f552ed673b26b733a290bcac4c4d8ff4d0344e1 Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Mon, 13 Jan 2020 16:18:32 -0800 Subject: [PATCH] Don't purge huge extents when decay is off. --- include/jemalloc/internal/arena_inlines_b.h | 6 ++++++ src/extent.c | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) 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);