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/sz.h"
|
||||||
#include "jemalloc/internal/ticker.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 *
|
JEMALLOC_ALWAYS_INLINE arena_t *
|
||||||
arena_choose_maybe_huge(tsd_t *tsd, arena_t *arena, size_t size) {
|
arena_choose_maybe_huge(tsd_t *tsd, arena_t *arena, size_t size) {
|
||||||
if (arena != NULL) {
|
if (arena != NULL) {
|
||||||
|
25
src/extent.c
25
src/extent.c
@ -1102,6 +1102,17 @@ extent_recycle_split(tsdn_t *tsdn, arena_t *arena,
|
|||||||
unreachable();
|
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
|
* Tries to satisfy the given allocation request by reusing one of the extents
|
||||||
* in the given extents_t.
|
* in the given extents_t.
|
||||||
@ -1141,7 +1152,9 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
|||||||
extent, growing_retained);
|
extent, growing_retained);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
extent_zeroed_set(extent, true);
|
if (!extent_need_manual_zero(arena)) {
|
||||||
|
extent_zeroed_set(extent, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extent_committed_get(extent)) {
|
if (extent_committed_get(extent)) {
|
||||||
@ -1164,7 +1177,8 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
|
|||||||
void *addr = extent_base_get(extent);
|
void *addr = extent_base_get(extent);
|
||||||
if (!extent_zeroed_get(extent)) {
|
if (!extent_zeroed_get(extent)) {
|
||||||
size_t size = extent_size_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);
|
memset(addr, 0, size);
|
||||||
}
|
}
|
||||||
} else if (config_debug) {
|
} else if (config_debug) {
|
||||||
@ -1391,7 +1405,9 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
|
|||||||
&arena->extents_retained, extent, true);
|
&arena->extents_retained, extent, true);
|
||||||
goto label_err;
|
goto label_err;
|
||||||
}
|
}
|
||||||
extent_zeroed_set(extent, true);
|
if (!extent_need_manual_zero(arena)) {
|
||||||
|
extent_zeroed_set(extent, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1425,7 +1441,8 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
|
|||||||
if (*zero && !extent_zeroed_get(extent)) {
|
if (*zero && !extent_zeroed_get(extent)) {
|
||||||
void *addr = extent_base_get(extent);
|
void *addr = extent_base_get(extent);
|
||||||
size_t size = extent_size_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);
|
memset(addr, 0, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user