Arena: Add helper function arena_get_from_extent.

This commit is contained in:
David T. Goldblatt 2019-09-23 18:05:57 -07:00 committed by David Goldblatt
parent c97d255752
commit 3d84bd57f4
4 changed files with 20 additions and 29 deletions

View File

@ -8,6 +8,12 @@
#include "jemalloc/internal/sz.h" #include "jemalloc/internal/sz.h"
#include "jemalloc/internal/ticker.h" #include "jemalloc/internal/ticker.h"
static inline arena_t *
arena_get_from_extent(extent_t *extent) {
return (arena_t *)atomic_load_p(&arenas[extent_arena_ind_get(extent)],
ATOMIC_RELAXED);
}
JEMALLOC_ALWAYS_INLINE bool JEMALLOC_ALWAYS_INLINE bool
arena_has_default_hooks(arena_t *arena) { arena_has_default_hooks(arena_t *arena) {
return (extent_hooks_get(arena) == &extent_hooks_default); return (extent_hooks_get(arena) == &extent_hooks_default);

View File

@ -1565,8 +1565,7 @@ arena_prof_promote(tsdn_t *tsdn, void *ptr, size_t usize) {
extent_t *extent = rtree_extent_read(tsdn, &extents_rtree, rtree_ctx, extent_t *extent = rtree_extent_read(tsdn, &extents_rtree, rtree_ctx,
(uintptr_t)ptr, true); (uintptr_t)ptr, true);
arena_t *arena = atomic_load_p(&arenas[extent_arena_ind_get(extent)], arena_t *arena = arena_get_from_extent(extent);
ATOMIC_RELAXED);
szind_t szind = sz_size2index(usize); szind_t szind = sz_size2index(usize);
extent_szind_set(extent, szind); extent_szind_set(extent, szind);
@ -1731,8 +1730,7 @@ arena_dalloc_bin(tsdn_t *tsdn, arena_t *arena, extent_t *extent, void *ptr) {
void void
arena_dalloc_small(tsdn_t *tsdn, void *ptr) { arena_dalloc_small(tsdn_t *tsdn, void *ptr) {
extent_t *extent = iealloc(tsdn, ptr); extent_t *extent = iealloc(tsdn, ptr);
arena_t *arena = atomic_load_p(&arenas[extent_arena_ind_get(extent)], arena_t *arena = arena_get_from_extent(extent);
ATOMIC_RELAXED);
arena_dalloc_bin(tsdn, arena, extent, ptr); arena_dalloc_bin(tsdn, arena, extent, ptr);
arena_decay_tick(tsdn, arena); arena_decay_tick(tsdn, arena);
@ -1768,8 +1766,7 @@ arena_ralloc_no_move(tsdn_t *tsdn, void *ptr, size_t oldsize, size_t size,
goto done; goto done;
} }
arena_t *arena = atomic_load_p( arena_t *arena = arena_get_from_extent(extent);
&arenas[extent_arena_ind_get(extent)], ATOMIC_RELAXED);
arena_decay_tick(tsdn, arena); arena_decay_tick(tsdn, arena);
ret = false; ret = false;
} else if (oldsize >= SC_LARGE_MINCLASS } else if (oldsize >= SC_LARGE_MINCLASS

View File

@ -2612,8 +2612,7 @@ arenas_lookup_ctl(tsd_t *tsd, const size_t *mib,
if (extent == NULL) if (extent == NULL)
goto label_return; goto label_return;
arena = atomic_load_p(&arenas[extent_arena_ind_get(extent)], arena = arena_get_from_extent(extent);
ATOMIC_RELAXED);
if (arena == NULL) if (arena == NULL)
goto label_return; goto label_return;

View File

@ -94,8 +94,7 @@ large_dalloc_maybe_junk_t *JET_MUTABLE large_dalloc_maybe_junk =
static bool static bool
large_ralloc_no_move_shrink(tsdn_t *tsdn, extent_t *extent, size_t usize) { large_ralloc_no_move_shrink(tsdn_t *tsdn, extent_t *extent, size_t usize) {
arena_t *arena = atomic_load_p(&arenas[extent_arena_ind_get(extent)], arena_t *arena = arena_get_from_extent(extent);
ATOMIC_RELAXED);
size_t oldusize = extent_usize_get(extent); size_t oldusize = extent_usize_get(extent);
extent_hooks_t *extent_hooks = extent_hooks_get(arena); extent_hooks_t *extent_hooks = extent_hooks_get(arena);
size_t diff = extent_size_get(extent) - (usize + sz_large_pad); size_t diff = extent_size_get(extent) - (usize + sz_large_pad);
@ -131,8 +130,7 @@ large_ralloc_no_move_shrink(tsdn_t *tsdn, extent_t *extent, size_t usize) {
static bool static bool
large_ralloc_no_move_expand(tsdn_t *tsdn, extent_t *extent, size_t usize, large_ralloc_no_move_expand(tsdn_t *tsdn, extent_t *extent, size_t usize,
bool zero) { bool zero) {
arena_t *arena = atomic_load_p(&arenas[extent_arena_ind_get(extent)], arena_t *arena = arena_get_from_extent(extent);
ATOMIC_RELAXED);
size_t oldusize = extent_usize_get(extent); size_t oldusize = extent_usize_get(extent);
extent_hooks_t *extent_hooks = extent_hooks_get(arena); extent_hooks_t *extent_hooks = extent_hooks_get(arena);
size_t trailsize = usize - oldusize; size_t trailsize = usize - oldusize;
@ -232,18 +230,14 @@ large_ralloc_no_move(tsdn_t *tsdn, extent_t *extent, size_t usize_min,
/* Attempt to expand the allocation in-place. */ /* Attempt to expand the allocation in-place. */
if (!large_ralloc_no_move_expand(tsdn, extent, usize_max, if (!large_ralloc_no_move_expand(tsdn, extent, usize_max,
zero)) { zero)) {
arena_decay_tick(tsdn, arena_decay_tick(tsdn, arena_get_from_extent(extent));
atomic_load_p(&arenas[extent_arena_ind_get(extent)],
ATOMIC_RELAXED));
return false; return false;
} }
/* Try again, this time with usize_min. */ /* Try again, this time with usize_min. */
if (usize_min < usize_max && usize_min > oldusize && if (usize_min < usize_max && usize_min > oldusize &&
large_ralloc_no_move_expand(tsdn, extent, usize_min, large_ralloc_no_move_expand(tsdn, extent, usize_min,
zero)) { zero)) {
arena_decay_tick(tsdn, atomic_load_p( arena_decay_tick(tsdn, arena_get_from_extent(extent));
&arenas[extent_arena_ind_get(extent)],
ATOMIC_RELAXED));
return false; return false;
} }
} }
@ -253,17 +247,14 @@ large_ralloc_no_move(tsdn_t *tsdn, extent_t *extent, size_t usize_min,
* the new size. * the new size.
*/ */
if (oldusize >= usize_min && oldusize <= usize_max) { if (oldusize >= usize_min && oldusize <= usize_max) {
arena_decay_tick(tsdn, atomic_load_p( arena_decay_tick(tsdn, arena_get_from_extent(extent));
&arenas[extent_arena_ind_get(extent)], ATOMIC_RELAXED));
return false; return false;
} }
/* Attempt to shrink the allocation in-place. */ /* Attempt to shrink the allocation in-place. */
if (oldusize > usize_max) { if (oldusize > usize_max) {
if (!large_ralloc_no_move_shrink(tsdn, extent, usize_max)) { if (!large_ralloc_no_move_shrink(tsdn, extent, usize_max)) {
arena_decay_tick(tsdn, atomic_load_p( arena_decay_tick(tsdn, arena_get_from_extent(extent));
&arenas[extent_arena_ind_get(extent)],
ATOMIC_RELAXED));
return false; return false;
} }
} }
@ -357,20 +348,18 @@ large_dalloc_finish_impl(tsdn_t *tsdn, arena_t *arena, extent_t *extent) {
void void
large_dalloc_prep_junked_locked(tsdn_t *tsdn, extent_t *extent) { large_dalloc_prep_junked_locked(tsdn_t *tsdn, extent_t *extent) {
large_dalloc_prep_impl(tsdn, atomic_load_p( large_dalloc_prep_impl(tsdn, arena_get_from_extent(extent), extent,
&arenas[extent_arena_ind_get(extent)], ATOMIC_RELAXED), extent, true); true);
} }
void void
large_dalloc_finish(tsdn_t *tsdn, extent_t *extent) { large_dalloc_finish(tsdn_t *tsdn, extent_t *extent) {
large_dalloc_finish_impl(tsdn, atomic_load_p( large_dalloc_finish_impl(tsdn, arena_get_from_extent(extent), extent);
&arenas[extent_arena_ind_get(extent)], ATOMIC_RELAXED), extent);
} }
void void
large_dalloc(tsdn_t *tsdn, extent_t *extent) { large_dalloc(tsdn_t *tsdn, extent_t *extent) {
arena_t *arena = atomic_load_p( arena_t *arena = arena_get_from_extent(extent);
&arenas[extent_arena_ind_get(extent)], ATOMIC_RELAXED);
large_dalloc_prep_impl(tsdn, arena, extent, false); large_dalloc_prep_impl(tsdn, arena, extent, false);
large_dalloc_finish_impl(tsdn, arena, extent); large_dalloc_finish_impl(tsdn, arena, extent);
arena_decay_tick(tsdn, arena); arena_decay_tick(tsdn, arena);