summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2017-04-19 23:14:54 (GMT)
committerJason Evans <jasone@canonware.com>2017-04-20 04:05:12 (GMT)
commitfed9a880c811fc56f7563efcb0a70c6ffe401c5f (patch)
treebcd6dc02648a36684d40d9eb1789fc00570f1d35 /src
parentacf4c8ae33539a219711791c3556016b853b7d09 (diff)
downloadjemalloc-fed9a880c811fc56f7563efcb0a70c6ffe401c5f.zip
jemalloc-fed9a880c811fc56f7563efcb0a70c6ffe401c5f.tar.gz
jemalloc-fed9a880c811fc56f7563efcb0a70c6ffe401c5f.tar.bz2
Trim before commit in extent_recycle().
This avoids creating clean committed pages as a side effect of aligned allocation. For configurations that decommit memory, purged pages are decommitted, and decommitted extents cannot be coalesced with committed extents. Unless the clean committed pages happen to be selected during allocation, they cause unnecessary permanent extent fragmentation. This resolves #766.
Diffstat (limited to 'src')
-rw-r--r--src/extent.c8
-rw-r--r--src/extent_mmap.c4
2 files changed, 9 insertions, 3 deletions
diff --git a/src/extent.c b/src/extent.c
index 6b7da3f..d08ccdb 100644
--- a/src/extent.c
+++ b/src/extent.c
@@ -829,12 +829,16 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
rtree_ctx_t rtree_ctx_fallback;
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
+ bool committed = false;
extent_t *extent = extent_recycle_extract(tsdn, arena, r_extent_hooks,
rtree_ctx, extents, false, new_addr, size, pad, alignment, slab,
- zero, commit);
+ zero, &committed);
if (extent == NULL) {
return NULL;
}
+ if (committed) {
+ *commit = true;
+ }
extent = extent_recycle_split(tsdn, arena, r_extent_hooks, rtree_ctx,
extents, new_addr, size, pad, alignment, slab, szind, extent);
@@ -996,7 +1000,7 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
assert(new_addr == NULL || leadsize == 0);
assert(alloc_size >= leadsize + esize);
size_t trailsize = alloc_size - leadsize - esize;
- if (extent_zeroed_get(extent)) {
+ if (extent_zeroed_get(extent) && extent_committed_get(extent)) {
*zero = true;
}
if (extent_committed_get(extent)) {
diff --git a/src/extent_mmap.c b/src/extent_mmap.c
index b186275..be09937 100644
--- a/src/extent_mmap.c
+++ b/src/extent_mmap.c
@@ -15,7 +15,9 @@ extent_alloc_mmap(void *new_addr, size_t size, size_t alignment, bool *zero,
return NULL;
}
assert(ret != NULL);
- *zero = true;
+ if (*commit) {
+ *zero = true;
+ }
return ret;
}