Bug 1925181 - Properly set small alloc randomization on Android content processes as well r=jld

Differential Revision: https://phabricator.services.mozilla.com/D226135
This commit is contained in:
Alexandre Lissy
2024-10-21 06:05:44 +00:00
parent e16cc4f6b1
commit 57c41b8c56
4 changed files with 21 additions and 13 deletions

View File

@@ -805,9 +805,7 @@ void ContentChild::Init(mozilla::ipc::UntypedEndpoint&& aEndpoint,
})); }));
#endif #endif
// Bug 1925181: Unrelated to forkserver, the android content processes are #if defined(MOZ_MEMORY) && defined(DEBUG)
// created in a way that makes them not follow this option correctly
#if defined(MOZ_MEMORY) && defined(DEBUG) && !defined(ANDROID)
jemalloc_stats_t stats; jemalloc_stats_t stats;
jemalloc_stats(&stats); jemalloc_stats(&stats);
MOZ_ASSERT(!stats.opt_randomize_small, MOZ_ASSERT(!stats.opt_randomize_small,

View File

@@ -114,12 +114,9 @@ MALLOC_DECL(jemalloc_free_dirty_pages, void)
// after lowering the max dirty pages threshold to get RSS back to normal. // after lowering the max dirty pages threshold to get RSS back to normal.
MALLOC_DECL(jemalloc_free_excess_dirty_pages, void) MALLOC_DECL(jemalloc_free_excess_dirty_pages, void)
// Only used by ForkServer after forking new child processes.
// Change the value of opt_randomize_small to control small allocation // Change the value of opt_randomize_small to control small allocation
// randomization and maybe perform a reinitialization of the arena's PRNG. // randomization and maybe perform a reinitialization of the arena's PRNG.
# if defined(MOZ_ENABLE_FORKSERVER)
MALLOC_DECL(jemalloc_reset_small_alloc_randomization, void, bool) MALLOC_DECL(jemalloc_reset_small_alloc_randomization, void, bool)
# endif
// Opt in or out of a thread local arena (bool argument is whether to opt-in // Opt in or out of a thread local arena (bool argument is whether to opt-in
// (true) or out (false)). // (true) or out (false)).

View File

@@ -5188,7 +5188,6 @@ inline void MozJemalloc::moz_set_max_dirty_page_modifier(int32_t aModifier) {
gArenas.SetDefaultMaxDirtyPageModifier(aModifier); gArenas.SetDefaultMaxDirtyPageModifier(aModifier);
} }
#if defined(MOZ_ENABLE_FORKSERVER)
inline void MozJemalloc::jemalloc_reset_small_alloc_randomization( inline void MozJemalloc::jemalloc_reset_small_alloc_randomization(
bool aRandomizeSmall) { bool aRandomizeSmall) {
// When this process got forked by ForkServer then it inherited the existing // When this process got forked by ForkServer then it inherited the existing
@@ -5196,6 +5195,9 @@ inline void MozJemalloc::jemalloc_reset_small_alloc_randomization(
// been done but it may not reflect anymore the current set of options after // been done but it may not reflect anymore the current set of options after
// the fork(). // the fork().
// //
// Similar behavior is also present on Android where it is also required to
// perform this step.
//
// Content process will have randomization on small malloc disabled via the // Content process will have randomization on small malloc disabled via the
// MALLOC_OPTIONS environment variable set by parent process, missing this // MALLOC_OPTIONS environment variable set by parent process, missing this
// will lead to serious performance regressions because CPU prefetch will // will lead to serious performance regressions because CPU prefetch will
@@ -5203,11 +5205,11 @@ inline void MozJemalloc::jemalloc_reset_small_alloc_randomization(
// environment is not yet reset when the postfork child handler is being // environment is not yet reset when the postfork child handler is being
// called. // called.
// //
// This API is here to allow those forkserver-forked Content processes to // This API is here to allow those Content processes (spawned by ForkServer or
// notify jemalloc to turn off the randomization on small allocations and // Android service) to notify jemalloc to turn off the randomization on small
// perform the required reinitialization of already existing arena's PRNG. // allocations and perform the required reinitialization of already existing
// It is important to make sure that the PRNG state is properly re-initialized // arena's PRNG. It is important to make sure that the PRNG state is properly
// otherwise child processes would share all the same state. // re-initialized otherwise child processes would share all the same state.
{ {
AutoLock<StaticMutex> lock(gInitLock); AutoLock<StaticMutex> lock(gInitLock);
@@ -5219,7 +5221,6 @@ inline void MozJemalloc::jemalloc_reset_small_alloc_randomization(
arena->ResetSmallAllocRandomization(); arena->ResetSmallAllocRandomization();
} }
} }
#endif
#define MALLOC_DECL(name, return_type, ...) \ #define MALLOC_DECL(name, return_type, ...) \
inline return_type MozJemalloc::moz_arena_##name( \ inline return_type MozJemalloc::moz_arena_##name( \

View File

@@ -402,6 +402,12 @@ Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv* jenv, jclass jc,
SetGeckoProcessType(argv[--argc]); SetGeckoProcessType(argv[--argc]);
SetGeckoChildID(argv[--argc]); SetGeckoChildID(argv[--argc]);
#if defined(MOZ_MEMORY)
// XRE_IsContentProcess is not accessible here
jemalloc_reset_small_alloc_randomization(
/* aRandomizeSmall */ GetGeckoProcessType() !=
GeckoProcessType_Content);
#endif
gBootstrap->XRE_SetAndroidChildFds(jenv, jfds); gBootstrap->XRE_SetAndroidChildFds(jenv, jfds);
@@ -425,8 +431,14 @@ extern "C" APKOPEN_EXPORT mozglueresult ChildProcessInit(int argc,
if (argc < 2) { if (argc < 2) {
return FAILURE; return FAILURE;
} }
SetGeckoProcessType(argv[--argc]); SetGeckoProcessType(argv[--argc]);
SetGeckoChildID(argv[--argc]); SetGeckoChildID(argv[--argc]);
#if defined(MOZ_MEMORY)
// XRE_IsContentProcess is not accessible here
jemalloc_reset_small_alloc_randomization(
/* aRandomizeSmall */ GetGeckoProcessType() != GeckoProcessType_Content);
#endif
if (loadNSSLibs() != SUCCESS) { if (loadNSSLibs() != SUCCESS) {
return FAILURE; return FAILURE;