diff --git a/common.gypi b/common.gypi index 94fae065189043..36bfa41701aef3 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.26', + 'v8_embedder_string': '-node.27', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn index 988c907d964a25..f6860561cad2bd 100644 --- a/deps/v8/BUILD.gn +++ b/deps/v8/BUILD.gn @@ -82,6 +82,17 @@ declare_args() { # Sets -dENABLE_HUGEPAGE v8_enable_hugepage = false + # Sets -dV8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION. + # + # This flag speeds up the performance of fork/execve on Linux systems for + # embedders which use it (like Node.js). It works by marking the pages that + # V8 allocates as MADV_DONTFORK. Without MADV_DONTFORK, the Linux kernel + # spends a long time manipulating page mappings on fork and exec which the + # child process doesn't generally need to access. + # + # See v8:7381 for more details. + v8_enable_private_mapping_fork_optimization = false + # Sets -dENABLE_HANDLE_ZAPPING. v8_enable_handle_zapping = !is_on_release_branch || is_debug @@ -862,6 +873,9 @@ config("features") { if (v8_enable_hugepage) { defines += [ "ENABLE_HUGEPAGE" ] } + if (v8_enable_private_mapping_fork_optimization) { + defines += [ "V8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION" ] + } if (v8_enable_object_print) { defines += [ "OBJECT_PRINT" ] } diff --git a/deps/v8/src/base/platform/platform-posix.cc b/deps/v8/src/base/platform/platform-posix.cc index 664ed301c87baa..517cbfccab6843 100644 --- a/deps/v8/src/base/platform/platform-posix.cc +++ b/deps/v8/src/base/platform/platform-posix.cc @@ -174,6 +174,12 @@ void* Allocate(void* hint, size_t size, OS::MemoryPermission access, int flags = GetFlagsForMemoryPermission(access, page_type); void* result = mmap(hint, size, prot, flags, kMmapFd, kMmapFdOffset); if (result == MAP_FAILED) return nullptr; + +#if V8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION + // This is advisory, so we ignore errors. + madvise(result, size, MADV_DONTFORK); +#endif + #if ENABLE_HUGEPAGE if (result != nullptr && size >= kHugePageSize) { const uintptr_t huge_start = diff --git a/tools/v8_gypfiles/features.gypi b/tools/v8_gypfiles/features.gypi index 82c95b4d6db5ee..3c94b0bca4c383 100644 --- a/tools/v8_gypfiles/features.gypi +++ b/tools/v8_gypfiles/features.gypi @@ -68,6 +68,20 @@ }, { 'v8_enable_system_instrumentation': 0, }], + ['OS=="linux"', { + # Sets -dV8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION. + # + # This flag speeds up the performance of fork/execve on Linux systems for + # embedders which use it (like Node.js). It works by marking the pages that + # V8 allocates as MADV_DONTFORK. Without MADV_DONTFORK, the Linux kernel + # spends a long time manipulating page mappings on fork and exec which the + # child process doesn't generally need to access. + # + # See v8:7381 for more details. + 'v8_enable_private_mapping_fork_optimization': 1, + }, { + 'v8_enable_private_mapping_fork_optimization': 0, + }], ], 'is_debug%': 0, @@ -310,6 +324,9 @@ ['v8_enable_hugepage==1', { 'defines': ['ENABLE_HUGEPAGE',], }], + ['v8_enable_private_mapping_fork_optimization==1', { + 'defines': ['V8_ENABLE_PRIVATE_MAPPING_FORK_OPTIMIZATION'], + }], ['v8_enable_vtunejit==1', { 'defines': ['ENABLE_VTUNE_JIT_INTERFACE',], }],