mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-08-25 16:43:33 +03:00
Fix extent_alloc_cache[_locked]() to support decommitted allocation.
Fix extent_alloc_cache[_locked]() to support decommitted allocation, and use this ability in arena_stash_dirty(), so that decommitted extents are not needlessly committed during purging. In practice this does not happen on any currently supported systems, because both extent merging and decommit must be implemented; all supported systems implement one xor the other.
This commit is contained in:
parent
4f7d8c2dee
commit
8dd5ea87ca
4 changed files with 19 additions and 20 deletions
11
src/arena.c
11
src/arena.c
|
|
@ -49,11 +49,12 @@ arena_extent_cache_alloc_locked(tsdn_t *tsdn, arena_t *arena,
|
|||
extent_hooks_t **r_extent_hooks, void *new_addr, size_t usize, size_t pad,
|
||||
size_t alignment, bool *zero, bool slab)
|
||||
{
|
||||
bool commit = true;
|
||||
|
||||
malloc_mutex_assert_owner(tsdn, &arena->lock);
|
||||
|
||||
return (extent_alloc_cache(tsdn, arena, r_extent_hooks, new_addr, usize,
|
||||
pad, alignment, zero, slab));
|
||||
pad, alignment, zero, &commit, slab));
|
||||
}
|
||||
|
||||
extent_t *
|
||||
|
|
@ -681,7 +682,7 @@ arena_stash_dirty(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
|||
for (extent = qr_next(&arena->extents_dirty, qr_link); extent !=
|
||||
&arena->extents_dirty; extent = next) {
|
||||
size_t npages;
|
||||
bool zero;
|
||||
bool zero, commit;
|
||||
UNUSED extent_t *textent;
|
||||
|
||||
npages = extent_size_get(extent) >> LG_PAGE;
|
||||
|
|
@ -691,9 +692,10 @@ arena_stash_dirty(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
|||
next = qr_next(extent, qr_link);
|
||||
/* Allocate. */
|
||||
zero = false;
|
||||
commit = false;
|
||||
textent = extent_alloc_cache_locked(tsdn, arena, r_extent_hooks,
|
||||
extent_base_get(extent), extent_size_get(extent), 0, PAGE,
|
||||
&zero, false);
|
||||
&zero, &commit, false);
|
||||
assert(textent == extent);
|
||||
assert(zero == extent_zeroed_get(extent));
|
||||
extent_ring_remove(extent);
|
||||
|
|
@ -943,9 +945,8 @@ arena_slab_alloc(tsdn_t *tsdn, arena_t *arena, szind_t binind,
|
|||
extent_t *slab;
|
||||
arena_slab_data_t *slab_data;
|
||||
extent_hooks_t *extent_hooks = EXTENT_HOOKS_INITIALIZER;
|
||||
bool zero;
|
||||
bool zero = false;
|
||||
|
||||
zero = false;
|
||||
slab = arena_extent_cache_alloc_locked(tsdn, arena, &extent_hooks, NULL,
|
||||
bin_info->slab_size, 0, PAGE, &zero, true);
|
||||
if (slab == NULL) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue