diff options
author | Qi Wang <interwq@gwu.edu> | 2017-11-15 22:48:55 (GMT) |
---|---|---|
committer | Qi Wang <interwq@gmail.com> | 2017-11-16 23:32:02 (GMT) |
commit | 3e64dae802b9f7cd4f860b0d29126cd727d5166b (patch) | |
tree | 79d81bc54c273bcccf647c80f0c6122be7535fff /src | |
parent | eb1b08daaea57d16ce720d97847d94cee2f867cc (diff) | |
download | jemalloc-3e64dae802b9f7cd4f860b0d29126cd727d5166b.zip jemalloc-3e64dae802b9f7cd4f860b0d29126cd727d5166b.tar.gz jemalloc-3e64dae802b9f7cd4f860b0d29126cd727d5166b.tar.bz2 |
Eagerly coalesce large extents.
Coalescing is a small price to pay for large allocations since they happen less
frequently. This reduces fragmentation while also potentially improving
locality.
Diffstat (limited to 'src')
-rw-r--r-- | src/extent.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/extent.c b/src/extent.c index 8b00ec9..23b6401 100644 --- a/src/extent.c +++ b/src/extent.c @@ -1586,8 +1586,22 @@ extent_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, if (!extents->delay_coalesce) { extent = extent_try_coalesce(tsdn, arena, r_extent_hooks, rtree_ctx, extents, extent, NULL, growing_retained); + } else if (extent_size_get(extent) >= LARGE_MINCLASS) { + /* Always coalesce large extents eagerly. */ + bool coalesced; + size_t prev_size; + do { + prev_size = extent_size_get(extent); + assert(extent_state_get(extent) == extent_state_active); + extent = extent_try_coalesce(tsdn, arena, + r_extent_hooks, rtree_ctx, extents, extent, + &coalesced, growing_retained); + if (coalesced) { + extent_list_remove(&extents->lru, extent); + } + } while (coalesced && + extent_size_get(extent) >= prev_size + LARGE_MINCLASS); } - extent_deactivate_locked(tsdn, arena, extents, extent, false); malloc_mutex_unlock(tsdn, &extents->mtx); |