From 56cc56b69214bf3dbcd64ad83aa63fe22be20d62 Mon Sep 17 00:00:00 2001 From: David Goldblatt Date: Fri, 13 Dec 2019 13:52:34 -0800 Subject: [PATCH] Break extent split dependence on arena. --- include/jemalloc/internal/extent2.h | 6 +++--- src/extent2.c | 29 +++++++++++++++-------------- src/large.c | 2 +- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/include/jemalloc/internal/extent2.h b/include/jemalloc/internal/extent2.h index eda31cd1..9e1f0d62 100644 --- a/include/jemalloc/internal/extent2.h +++ b/include/jemalloc/internal/extent2.h @@ -53,9 +53,9 @@ bool extent_purge_lazy_wrapper(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, edata_t *edata, size_t offset, size_t length); bool extent_purge_forced_wrapper(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, edata_t *edata, size_t offset, size_t length); -edata_t *extent_split_wrapper(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, - edata_t *edata, size_t size_a, szind_t szind_a, bool slab_a, - size_t size_b, szind_t szind_b, bool slab_b); +edata_t *extent_split_wrapper(tsdn_t *tsdn, edata_cache_t *edata_cache, + ehooks_t *ehooks, edata_t *edata, size_t size_a, szind_t szind_a, + bool slab_a, size_t size_b, szind_t szind_b, bool slab_b); bool extent_merge_wrapper(tsdn_t *tsdn, ehooks_t *ehooks, edata_cache_t *edata_cache, edata_t *a, edata_t *b); diff --git a/src/extent2.c b/src/extent2.c index c1dfa99d..e4218c59 100644 --- a/src/extent2.c +++ b/src/extent2.c @@ -26,7 +26,7 @@ static bool extent_purge_lazy_impl(tsdn_t *tsdn, arena_t *arena, static bool extent_purge_forced_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, edata_t *edata, size_t offset, size_t length, bool growing_retained); -static edata_t *extent_split_impl(tsdn_t *tsdn, arena_t *arena, +static edata_t *extent_split_impl(tsdn_t *tsdn, edata_cache_t *edata_cache, ehooks_t *ehooks, edata_t *edata, size_t size_a, szind_t szind_a, bool slab_a, size_t size_b, szind_t szind_b, bool slab_b, bool growing_retained); @@ -659,9 +659,9 @@ extent_split_interior(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, /* Split the lead. */ if (leadsize != 0) { *lead = *edata; - *edata = extent_split_impl(tsdn, arena, ehooks, *lead, - leadsize, SC_NSIZES, false, esize + trailsize, szind, slab, - growing_retained); + *edata = extent_split_impl(tsdn, &arena->edata_cache, ehooks, + *lead, leadsize, SC_NSIZES, false, esize + trailsize, szind, + slab, growing_retained); if (*edata == NULL) { *to_leak = *lead; *lead = NULL; @@ -671,8 +671,9 @@ extent_split_interior(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, /* Split the trail. */ if (trailsize != 0) { - *trail = extent_split_impl(tsdn, arena, ehooks, *edata, esize, - szind, slab, trailsize, SC_NSIZES, false, growing_retained); + *trail = extent_split_impl(tsdn, &arena->edata_cache, ehooks, + *edata, esize, szind, slab, trailsize, SC_NSIZES, false, + growing_retained); if (*trail == NULL) { *to_leak = *edata; *to_salvage = *lead; @@ -1410,7 +1411,7 @@ extent_purge_forced_wrapper(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, * and returns the trail (except in case of error). */ static edata_t * -extent_split_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, +extent_split_impl(tsdn_t *tsdn, edata_cache_t *edata_cache, ehooks_t *ehooks, edata_t *edata, size_t size_a, szind_t szind_a, bool slab_a, size_t size_b, szind_t szind_b, bool slab_b, bool growing_retained) { assert(edata_size_get(edata) == size_a + size_b); @@ -1421,12 +1422,12 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, return NULL; } - edata_t *trail = edata_cache_get(tsdn, &arena->edata_cache); + edata_t *trail = edata_cache_get(tsdn, edata_cache); if (trail == NULL) { goto label_error_a; } - edata_init(trail, arena_ind_get(arena), + edata_init(trail, ehooks_ind_get(ehooks), (void *)((uintptr_t)edata_base_get(edata) + size_a), size_b, slab_b, szind_b, edata_sn_get(edata), edata_state_get(edata), edata_zeroed_get(edata), edata_committed_get(edata), @@ -1438,7 +1439,7 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, { edata_t lead; - edata_init(&lead, arena_ind_get(arena), + edata_init(&lead, ehooks_ind_get(ehooks), edata_addr_get(edata), size_a, slab_a, szind_a, edata_sn_get(edata), edata_state_get(edata), edata_zeroed_get(edata), @@ -1480,17 +1481,17 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, label_error_c: extent_unlock_edata2(tsdn, edata, trail); label_error_b: - edata_cache_put(tsdn, &arena->edata_cache, trail); + edata_cache_put(tsdn, edata_cache, trail); label_error_a: return NULL; } edata_t * -extent_split_wrapper(tsdn_t *tsdn, arena_t *arena, ehooks_t *ehooks, +extent_split_wrapper(tsdn_t *tsdn, edata_cache_t *edata_cache, ehooks_t *ehooks, edata_t *edata, size_t size_a, szind_t szind_a, bool slab_a, size_t size_b, szind_t szind_b, bool slab_b) { - return extent_split_impl(tsdn, arena, ehooks, edata, size_a, szind_a, - slab_a, size_b, szind_b, slab_b, false); + return extent_split_impl(tsdn, edata_cache, ehooks, edata, size_a, + szind_a, slab_a, size_b, szind_b, slab_b, false); } static bool diff --git a/src/large.c b/src/large.c index 4af586db..f91fb749 100644 --- a/src/large.c +++ b/src/large.c @@ -104,7 +104,7 @@ large_ralloc_no_move_shrink(tsdn_t *tsdn, edata_t *edata, size_t usize) { /* Split excess pages. */ if (diff != 0) { - edata_t *trail = extent_split_wrapper(tsdn, arena, + edata_t *trail = extent_split_wrapper(tsdn, &arena->edata_cache, ehooks, edata, usize + sz_large_pad, sz_size2index(usize), false, diff, SC_NSIZES, false); if (trail == NULL) {