Prefer pages_purge_forced() over memset().

This has the dual advantages of allowing for sparsely used large
allocations, and relying on the kernel to supply zeroed pages, which
tends to be very fast on modern systems.
This commit is contained in:
Jason Evans
2017-03-09 17:20:00 -08:00
parent 28078274c4
commit 26d23da6cd
2 changed files with 30 additions and 16 deletions

View File

@@ -759,8 +759,11 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
if (*zero) {
if (!extent_zeroed_get(extent)) {
memset(extent_addr_get(extent), 0,
extent_usize_get(extent));
if (pages_purge_forced(extent_base_get(extent),
extent_size_get(extent))) {
memset(extent_addr_get(extent), 0,
extent_usize_get(extent));
}
} else if (config_debug) {
size_t i;
size_t *p = (size_t *)(uintptr_t)
@@ -971,7 +974,11 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
extent_interior_register(tsdn, rtree_ctx, extent);
}
if (*zero && !extent_zeroed_get(extent)) {
memset(extent_addr_get(extent), 0, extent_usize_get(extent));
if (pages_purge_forced(extent_base_get(extent),
extent_size_get(extent))) {
memset(extent_addr_get(extent), 0,
extent_usize_get(extent));
}
}
/*
* Increment extent_grow_next, but take care to do so atomically and