Emap: Move in alloc_ctx lookup functionality.

This commit is contained in:
David Goldblatt 2020-02-05 18:58:19 -08:00 committed by David Goldblatt
parent 65a54d7714
commit f7d9c6c42d
4 changed files with 44 additions and 37 deletions

View File

@ -197,10 +197,4 @@ struct arena_tdata_s {
ticker_t decay_ticker; ticker_t decay_ticker;
}; };
/* Used to pass rtree lookup context down the path. */
struct alloc_ctx_s {
szind_t szind;
bool slab;
};
#endif /* JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H */ #endif /* JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H */

View File

@ -12,7 +12,6 @@
typedef struct arena_decay_s arena_decay_t; typedef struct arena_decay_s arena_decay_t;
typedef struct arena_s arena_t; typedef struct arena_s arena_t;
typedef struct arena_tdata_s arena_tdata_t; typedef struct arena_tdata_s arena_tdata_t;
typedef struct alloc_ctx_s alloc_ctx_t;
typedef enum { typedef enum {
percpu_arena_mode_names_base = 0, /* Used for options processing. */ percpu_arena_mode_names_base = 0, /* Used for options processing. */

View File

@ -11,6 +11,13 @@ struct emap_s {
mutex_pool_t mtx_pool; mutex_pool_t mtx_pool;
}; };
/* Used to pass rtree lookup context down the path. */
typedef struct alloc_ctx_t alloc_ctx_t;
struct alloc_ctx_t {
szind_t szind;
bool slab;
};
extern emap_t emap_global; extern emap_t emap_global;
bool emap_init(emap_t *emap); bool emap_init(emap_t *emap);
@ -127,4 +134,15 @@ emap_lookup(tsdn_t *tsdn, emap_t *emap, const void *ptr) {
true); true);
} }
/* Fills in alloc_ctx with the info in the map. */
JEMALLOC_ALWAYS_INLINE void
emap_alloc_info_lookup(tsdn_t *tsdn, emap_t *emap, void *ptr,
alloc_ctx_t *alloc_ctx) {
rtree_ctx_t rtree_ctx_fallback;
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
rtree_szind_slab_read(tsdn, &emap->rtree, rtree_ctx, (uintptr_t)ptr,
true, &alloc_ctx->szind, &alloc_ctx->slab);
}
#endif /* JEMALLOC_INTERNAL_EMAP_H */ #endif /* JEMALLOC_INTERNAL_EMAP_H */

View File

@ -2568,9 +2568,7 @@ ifree(tsd_t *tsd, void *ptr, tcache_t *tcache, bool slow_path) {
assert(malloc_initialized() || IS_INITIALIZER); assert(malloc_initialized() || IS_INITIALIZER);
alloc_ctx_t alloc_ctx; alloc_ctx_t alloc_ctx;
rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsd); emap_alloc_info_lookup(tsd_tsdn(tsd), &emap_global, ptr, &alloc_ctx);
rtree_szind_slab_read(tsd_tsdn(tsd), &emap_global.rtree, rtree_ctx,
(uintptr_t)ptr, true, &alloc_ctx.szind, &alloc_ctx.slab);
assert(alloc_ctx.szind != SC_NSIZES); assert(alloc_ctx.szind != SC_NSIZES);
size_t usize = sz_index2size(alloc_ctx.szind); size_t usize = sz_index2size(alloc_ctx.szind);
@ -2601,57 +2599,55 @@ isfree(tsd_t *tsd, void *ptr, size_t usize, tcache_t *tcache, bool slow_path) {
assert(ptr != NULL); assert(ptr != NULL);
assert(malloc_initialized() || IS_INITIALIZER); assert(malloc_initialized() || IS_INITIALIZER);
alloc_ctx_t alloc_ctx, *ctx; alloc_ctx_t alloc_ctx;
if (!config_prof) { if (!config_prof) {
/* Means usize will be used to determine szind. */ alloc_ctx.szind = sz_size2index(usize);
ctx = NULL; alloc_ctx.slab = (alloc_ctx.szind < SC_NBINS);
} else { } else {
if (likely(!prof_sample_aligned(ptr))) { if (likely(!prof_sample_aligned(ptr))) {
ctx = &alloc_ctx;
/* /*
* When the ptr is not page aligned, it was not sampled. * When the ptr is not page aligned, it was not sampled.
* usize can be trusted to determine szind and slab. * usize can be trusted to determine szind and slab.
*/ */
ctx->szind = sz_size2index(usize); alloc_ctx.szind = sz_size2index(usize);
if (config_cache_oblivious) { if (config_cache_oblivious) {
ctx->slab = (ctx->szind < SC_NBINS); alloc_ctx.slab = (alloc_ctx.szind < SC_NBINS);
} else { } else {
/* Non page aligned must be slab allocated. */ /* Non page aligned must be slab allocated. */
ctx->slab = true; alloc_ctx.slab = true;
} }
if (config_debug) { if (config_debug) {
alloc_ctx_t dbg_ctx; alloc_ctx_t dbg_ctx;
rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsd); emap_alloc_info_lookup(tsd_tsdn(tsd),
rtree_szind_slab_read(tsd_tsdn(tsd), &emap_global, ptr, &dbg_ctx);
&emap_global.rtree, rtree_ctx, assert(dbg_ctx.szind == alloc_ctx.szind);
(uintptr_t)ptr, true, &dbg_ctx.szind, assert(dbg_ctx.slab == alloc_ctx.slab);
&dbg_ctx.slab);
assert(dbg_ctx.szind == ctx->szind);
assert(dbg_ctx.slab == ctx->slab);
} }
} else if (opt_prof) { } else if (opt_prof) {
ctx = &alloc_ctx; emap_alloc_info_lookup(tsd_tsdn(tsd), &emap_global,
rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsd); ptr, &alloc_ctx);
rtree_szind_slab_read(tsd_tsdn(tsd), &emap_global.rtree,
rtree_ctx, (uintptr_t)ptr, true, &ctx->szind, if (config_opt_safety_checks) {
&ctx->slab); /* Small alloc may have !slab (sampled). */
/* Small alloc may have !slab (sampled). */ if (alloc_ctx.szind != sz_size2index(usize)) {
bool sz_correct = (ctx->szind == sz_size2index(usize)); safety_check_fail_sized_dealloc(true);
if (config_opt_safety_checks && !sz_correct) { }
safety_check_fail_sized_dealloc(true);
} }
} else { } else {
ctx = NULL; alloc_ctx.szind = sz_size2index(usize);
alloc_ctx.slab = (alloc_ctx.szind < SC_NBINS);
} }
} }
if (config_prof && opt_prof) { if (config_prof && opt_prof) {
prof_free(tsd, ptr, usize, ctx); prof_free(tsd, ptr, usize, &alloc_ctx);
} }
if (likely(!slow_path)) { if (likely(!slow_path)) {
isdalloct(tsd_tsdn(tsd), ptr, usize, tcache, ctx, false); isdalloct(tsd_tsdn(tsd), ptr, usize, tcache, &alloc_ctx,
false);
} else { } else {
isdalloct(tsd_tsdn(tsd), ptr, usize, tcache, ctx, true); isdalloct(tsd_tsdn(tsd), ptr, usize, tcache, &alloc_ctx,
true);
} }
thread_dalloc_event(tsd, usize); thread_dalloc_event(tsd, usize);
} }