Only read arena index from extent on the tcache flush path.
Add exten_arena_ind_get() to avoid loading the actual arena ptr in case we just need to check arena matching.
This commit is contained in:
parent
441335d924
commit
7241bf5b74
@ -35,18 +35,19 @@ extent_unlock2(tsdn_t *tsdn, extent_t *extent1, extent_t *extent2) {
|
|||||||
(uintptr_t)extent2);
|
(uintptr_t)extent2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline arena_t *
|
static inline unsigned
|
||||||
extent_arena_get(const extent_t *extent) {
|
extent_arena_ind_get(const extent_t *extent) {
|
||||||
unsigned arena_ind = (unsigned)((extent->e_bits &
|
unsigned arena_ind = (unsigned)((extent->e_bits &
|
||||||
EXTENT_BITS_ARENA_MASK) >> EXTENT_BITS_ARENA_SHIFT);
|
EXTENT_BITS_ARENA_MASK) >> EXTENT_BITS_ARENA_SHIFT);
|
||||||
/*
|
|
||||||
* The following check is omitted because we should never actually read
|
|
||||||
* a NULL arena pointer.
|
|
||||||
*/
|
|
||||||
if (false && arena_ind >= MALLOCX_ARENA_LIMIT) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
assert(arena_ind < MALLOCX_ARENA_LIMIT);
|
assert(arena_ind < MALLOCX_ARENA_LIMIT);
|
||||||
|
|
||||||
|
return arena_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline arena_t *
|
||||||
|
extent_arena_get(const extent_t *extent) {
|
||||||
|
unsigned arena_ind = extent_arena_ind_get(extent);
|
||||||
|
|
||||||
return (arena_t *)atomic_load_p(&arenas[arena_ind], ATOMIC_ACQUIRE);
|
return (arena_t *)atomic_load_p(&arenas[arena_ind], ATOMIC_ACQUIRE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
14
src/tcache.c
14
src/tcache.c
@ -120,7 +120,9 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin,
|
|||||||
while (nflush > 0) {
|
while (nflush > 0) {
|
||||||
/* Lock the arena bin associated with the first object. */
|
/* Lock the arena bin associated with the first object. */
|
||||||
extent_t *extent = item_extent[0];
|
extent_t *extent = item_extent[0];
|
||||||
arena_t *bin_arena = extent_arena_get(extent);
|
unsigned bin_arena_ind = extent_arena_ind_get(extent);
|
||||||
|
arena_t *bin_arena = arena_get(tsd_tsdn(tsd), bin_arena_ind,
|
||||||
|
false);
|
||||||
unsigned binshard = extent_binshard_get(extent);
|
unsigned binshard = extent_binshard_get(extent);
|
||||||
assert(binshard < bin_infos[binind].n_shards);
|
assert(binshard < bin_infos[binind].n_shards);
|
||||||
bin_t *bin = &bin_arena->bins[binind].bin_shards[binshard];
|
bin_t *bin = &bin_arena->bins[binind].bin_shards[binshard];
|
||||||
@ -146,7 +148,7 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin,
|
|||||||
extent = item_extent[i];
|
extent = item_extent[i];
|
||||||
assert(ptr != NULL && extent != NULL);
|
assert(ptr != NULL && extent != NULL);
|
||||||
|
|
||||||
if (extent_arena_get(extent) == bin_arena
|
if (extent_arena_ind_get(extent) == bin_arena_ind
|
||||||
&& extent_binshard_get(extent) == binshard) {
|
&& extent_binshard_get(extent) == binshard) {
|
||||||
arena_dalloc_bin_junked_locked(tsd_tsdn(tsd),
|
arena_dalloc_bin_junked_locked(tsd_tsdn(tsd),
|
||||||
bin_arena, bin, binind, extent, ptr);
|
bin_arena, bin, binind, extent, ptr);
|
||||||
@ -208,7 +210,9 @@ tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
|
|||||||
while (nflush > 0) {
|
while (nflush > 0) {
|
||||||
/* Lock the arena associated with the first object. */
|
/* Lock the arena associated with the first object. */
|
||||||
extent_t *extent = item_extent[0];
|
extent_t *extent = item_extent[0];
|
||||||
arena_t *locked_arena = extent_arena_get(extent);
|
unsigned locked_arena_ind = extent_arena_ind_get(extent);
|
||||||
|
arena_t *locked_arena = arena_get(tsd_tsdn(tsd),
|
||||||
|
locked_arena_ind, false);
|
||||||
bool idump;
|
bool idump;
|
||||||
|
|
||||||
if (config_prof) {
|
if (config_prof) {
|
||||||
@ -223,7 +227,7 @@ tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
|
|||||||
void *ptr = *(tbin->avail - 1 - i);
|
void *ptr = *(tbin->avail - 1 - i);
|
||||||
assert(ptr != NULL);
|
assert(ptr != NULL);
|
||||||
extent = item_extent[i];
|
extent = item_extent[i];
|
||||||
if (extent_arena_get(extent) == locked_arena) {
|
if (extent_arena_ind_get(extent) == locked_arena_ind) {
|
||||||
large_dalloc_prep_junked_locked(tsd_tsdn(tsd),
|
large_dalloc_prep_junked_locked(tsd_tsdn(tsd),
|
||||||
extent);
|
extent);
|
||||||
}
|
}
|
||||||
@ -253,7 +257,7 @@ tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
|
|||||||
extent = item_extent[i];
|
extent = item_extent[i];
|
||||||
assert(ptr != NULL && extent != NULL);
|
assert(ptr != NULL && extent != NULL);
|
||||||
|
|
||||||
if (extent_arena_get(extent) == locked_arena) {
|
if (extent_arena_ind_get(extent) == locked_arena_ind) {
|
||||||
large_dalloc_finish(tsd_tsdn(tsd), extent);
|
large_dalloc_finish(tsd_tsdn(tsd), extent);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user