Avoid potential issues on extent zero-out.
When custom extent_hooks or transparent huge pages are in use, the purging semantics may change, which means we may not get zeroed pages on repopulating. Fixing the issue by manually memset for such cases.
This commit is contained in:
parent
0ecd5addb1
commit
f459454afe
@ -8,6 +8,11 @@
|
||||
#include "jemalloc/internal/sz.h"
|
||||
#include "jemalloc/internal/ticker.h"
|
||||
|
||||
JEMALLOC_ALWAYS_INLINE bool
|
||||
arena_has_default_hooks(arena_t *arena) {
|
||||
return (extent_hooks_get(arena) == &extent_hooks_default);
|
||||
}
|
||||
|
||||
JEMALLOC_ALWAYS_INLINE arena_t *
|
||||
arena_choose_maybe_huge(tsd_t *tsd, arena_t *arena, size_t size) {
|
||||
if (arena != NULL) {
|
||||
|
21
src/extent.c
21
src/extent.c
@ -1102,6 +1102,17 @@ extent_recycle_split(tsdn_t *tsdn, arena_t *arena,
|
||||
unreachable();
|
||||
}
|
||||
|
||||
static bool
|
||||
extent_need_manual_zero(arena_t *arena) {
|
||||
/*
|
||||
* Need to manually zero the extent on repopulating if either; 1) non
|
||||
* default extent hooks installed (in which case the purge semantics may
|
||||
* change); or 2) transparent huge pages enabled.
|
||||
*/
|
||||
return (!arena_has_default_hooks(arena) ||
|
||||
(opt_thp == thp_mode_always));
|
||||
}
|
||||
|
||||
/*
|
||||
* Tries to satisfy the given allocation request by reusing one of the extents
|
||||
* in the given extents_t.
|
||||
@ -1141,8 +1152,10 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
||||
extent, growing_retained);
|
||||
return NULL;
|
||||
}
|
||||
if (!extent_need_manual_zero(arena)) {
|
||||
extent_zeroed_set(extent, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (extent_committed_get(extent)) {
|
||||
*commit = true;
|
||||
@ -1164,7 +1177,8 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
||||
void *addr = extent_base_get(extent);
|
||||
if (!extent_zeroed_get(extent)) {
|
||||
size_t size = extent_size_get(extent);
|
||||
if (pages_purge_forced(addr, size)) {
|
||||
if (extent_need_manual_zero(arena) ||
|
||||
pages_purge_forced(addr, size)) {
|
||||
memset(addr, 0, size);
|
||||
}
|
||||
} else if (config_debug) {
|
||||
@ -1391,8 +1405,10 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
|
||||
&arena->extents_retained, extent, true);
|
||||
goto label_err;
|
||||
}
|
||||
if (!extent_need_manual_zero(arena)) {
|
||||
extent_zeroed_set(extent, true);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Increment extent_grow_next if doing so wouldn't exceed the allowed
|
||||
@ -1425,7 +1441,8 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
|
||||
if (*zero && !extent_zeroed_get(extent)) {
|
||||
void *addr = extent_base_get(extent);
|
||||
size_t size = extent_size_get(extent);
|
||||
if (pages_purge_forced(addr, size)) {
|
||||
if (extent_need_manual_zero(arena) ||
|
||||
pages_purge_forced(addr, size)) {
|
||||
memset(addr, 0, size);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user