From 04e4999c6fa2e9810634745a07f1e380f27b8e61 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Wed, 17 Mar 2021 13:24:57 -0700
Subject: [PATCH] reduce thread stack and heap usage for javascriptcore on musl

default sizes for musl are smaller compared to glibc, this matches
to musl defaults, avoid stack overflow crashes in jscore

This is based on Alpine Linux's patch based on suggestion from
https://bugs.webkit.org/show_bug.cgi?id=187485

Real solution would entail more as the suggestions to increase
stack size via -Wl,-z,stack-size=N does not work fully and also
setting DEFAULT_THREAD_STACK_SIZE_IN_KB alone is not enough either

This patch only changes behavior when using musl, the defaults for
glibc in OE remains same

Upstream-Status: Accepted
Signed-off-by: Khem Raj <raj.khem@gmail.com>

---
 Source/JavaScriptCore/runtime/OptionsList.h | 18 +++++++++++++++---
 Source/WTF/wtf/Threading.h                  |  4 ++++
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/Source/JavaScriptCore/runtime/OptionsList.h b/Source/JavaScriptCore/runtime/OptionsList.h
index bb6d2f1d..a6209742 100644
--- a/Source/JavaScriptCore/runtime/OptionsList.h
+++ b/Source/JavaScriptCore/runtime/OptionsList.h
@@ -71,6 +71,18 @@ JS_EXPORT_PRIVATE bool canUseJITCage();
 // On instantiation of the first VM instance, the Options will be write protected
 // and cannot be modified thereafter.
 
+#if OS(LINUX) && !defined(__GLIBC__)
+// non-glibc options on linux ( musl )
+constexpr unsigned jscMaxPerThreadStack = 128 * KB;
+constexpr unsigned jscSoftReservedZoneSize = 32 * KB;
+constexpr unsigned jscReservedZoneSize = 16 * KB;
+#else
+//default
+constexpr unsigned jscMaxPerThreadStack = 4 * MB;
+constexpr unsigned jscSoftReservedZoneSize = 128 * KB;
+constexpr unsigned jscReservedZoneSize = 64 * KB;
+#endif
+
 #define FOR_EACH_JSC_OPTION(v)                                          \
     v(Bool, useKernTCSM, defaultTCSMValue(), Normal, "Note: this needs to go before other options since they depend on this value.") \
     v(Bool, validateOptions, false, Normal, "crashes if mis-typed JSC options were passed to the VM") \
@@ -86,9 +98,9 @@ JS_EXPORT_PRIVATE bool canUseJITCage();
     \
     v(Bool, reportMustSucceedExecutableAllocations, false, Normal, nullptr) \
     \
-    v(Unsigned, maxPerThreadStackUsage, 5 * MB, Normal, "Max allowed stack usage by the VM") \
-    v(Unsigned, softReservedZoneSize, 128 * KB, Normal, "A buffer greater than reservedZoneSize that reserves space for stringifying exceptions.") \
-    v(Unsigned, reservedZoneSize, 64 * KB, Normal, "The amount of stack space we guarantee to our clients (and to interal VM code that does not call out to clients).") \
+    v(Unsigned, maxPerThreadStackUsage, jscMaxPerThreadStack, Normal, "Max allowed stack usage by the VM") \
+    v(Unsigned, softReservedZoneSize, jscSoftReservedZoneSize, Normal, "A buffer greater than reservedZoneSize that reserves space for stringifying exceptions.") \
+    v(Unsigned, reservedZoneSize, jscReservedZoneSize, Normal, "The amount of stack space we guarantee to our clients (and to interal VM code that does not call out to clients).") \
     \
     v(Bool, crashOnDisallowedVMEntry, ASSERT_ENABLED, Normal, "Forces a crash if we attempt to enter the VM when disallowed") \
     v(Bool, crashIfCantAllocateJITMemory, false, Normal, nullptr) \
diff --git a/Source/WTF/wtf/Threading.h b/Source/WTF/wtf/Threading.h
index 9495d6c1..190b3811 100644
--- a/Source/WTF/wtf/Threading.h
+++ b/Source/WTF/wtf/Threading.h
@@ -60,6 +60,10 @@
 #include <dispatch/dispatch.h>
 #endif
 
+#if OS(LINUX) && !defined(__GLIBC__)
+#define DEFAULT_THREAD_STACK_SIZE_IN_KB 128
+#endif
+
 namespace WTF {
 
 class AbstractLocker;
