REGRESSION(r249808): [GTK] Crash in JSC Config::permanentlyFreeze() on architecture...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Mar 2020 17:34:43 +0000 (17:34 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Mar 2020 17:34:43 +0000 (17:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=209236

Patch by Michael Catanzaro <mcatanzaro@gnome.org> on 2020-03-23
Reviewed by Mark Lam.

Source/JavaScriptCore:

* heap/MarkedBlock.h: Use new CeilingOnPageSize.
* runtime/JSCConfig.cpp:
(JSC::Config::permanentlyFreeze): Use pageSize instead of vmPageSize.
* runtime/JSCConfig.h: Use new CeilingOnPageSize.

Source/WTF:

Add new CeilingOnPageSize constants, for use in JSC, in order to centralize our compile-time
page size guessing into one place. Improve the implementation of pageSize() to
RELEASE_ASSERT() when CeilingOnPageSize is wrong, so we can detect and fix it if so. (It
will be even easier to detect if we change RELEASE_ASSERT_WITH_MESSAGE() to actually print
its message in release builds.) Change pageSize() to use sysconf(_SC_PAGESIZE), which is
specified by POSIX, instead of getpagesize(), which is nonstandard.

* wtf/PageBlock.cpp:
(WTF::systemPageSize):
(WTF::pageSize):
* wtf/PageBlock.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@258857 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/heap/MarkedBlock.h
Source/JavaScriptCore/runtime/JSCConfig.cpp
Source/JavaScriptCore/runtime/JSCConfig.h
Source/WTF/ChangeLog
Source/WTF/wtf/PageBlock.cpp
Source/WTF/wtf/PageBlock.h

index ad1d7c7..7a6d9f4 100644 (file)
@@ -1,3 +1,15 @@
+2020-03-23  Michael Catanzaro  <mcatanzaro@gnome.org>
+
+        REGRESSION(r249808): [GTK] Crash in JSC Config::permanentlyFreeze() on architecture ppc64el
+        https://bugs.webkit.org/show_bug.cgi?id=209236
+
+        Reviewed by Mark Lam.
+
+        * heap/MarkedBlock.h: Use new CeilingOnPageSize.
+        * runtime/JSCConfig.cpp:
+        (JSC::Config::permanentlyFreeze): Use pageSize instead of vmPageSize.
+        * runtime/JSCConfig.h: Use new CeilingOnPageSize.
+
 2020-03-22  Yusuke Suzuki  <ysuzuki@apple.com>
 
         Unreviewed, rename keepAlive to ensureStillAliveHere
index e804e1b..ad16a4b 100644 (file)
 #include "HeapCell.h"
 #include "IterationStatus.h"
 #include "WeakSet.h"
+#include <algorithm>
 #include <wtf/Atomics.h>
 #include <wtf/Bitmap.h>
-#include <wtf/HashFunctions.h>
 #include <wtf/CountingLock.h>
+#include <wtf/HashFunctions.h>
+#include <wtf/PageBlock.h>
 #include <wtf/StdLibExtras.h>
 
 namespace JSC {
@@ -70,11 +72,7 @@ public:
     static constexpr size_t atomSize = 16; // bytes
 
     // Block size must be at least as large as the system page size.
-#if CPU(PPC64) || CPU(PPC64LE) || CPU(PPC) || CPU(UNKNOWN)
-    static constexpr size_t blockSize = 64 * KB;
-#else
-    static constexpr size_t blockSize = 16 * KB;
-#endif
+    static constexpr size_t blockSize = std::max(16 * KB, CeilingOnPageSize);
 
     static constexpr size_t blockMask = ~(blockSize - 1); // blockSize must be a power of two.
 
index 79cc2b6..6fdb3ee 100644 (file)
@@ -53,9 +53,7 @@ void Config::enableRestrictedOptions()
     
 void Config::permanentlyFreeze()
 {
-#if PLATFORM(COCOA)
-    RELEASE_ASSERT(roundUpToMultipleOf(vmPageSize(), ConfigSizeToProtect) == ConfigSizeToProtect);
-#endif
+    RELEASE_ASSERT(roundUpToMultipleOf(pageSize(), ConfigSizeToProtect) == ConfigSizeToProtect);
 
     if (!g_jscConfig.isPermanentlyFrozen)
         g_jscConfig.isPermanentlyFrozen = true;
index 1ae53a5..aa9bfe6 100644 (file)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "OptionsList.h"
+#include <wtf/PageBlock.h>
 #include <wtf/StdLibExtras.h>
 
 namespace JSC {
@@ -34,11 +35,7 @@ class ExecutableAllocator;
 class FixedVMPoolExecutableAllocator;
 class VM;
 
-#if !OS(WINDOWS)
-constexpr size_t ConfigSizeToProtect = 16 * KB;
-#else
-constexpr size_t ConfigSizeToProtect = 4 * KB;
-#endif
+constexpr size_t ConfigSizeToProtect = CeilingOnPageSize;
 
 #if ENABLE(SEPARATED_WX_HEAP)
 using JITWriteSeparateHeapsFunction = void (*)(off_t, const void*, size_t);
index b6228fb..4944c14 100644 (file)
@@ -1,3 +1,22 @@
+2020-03-23  Michael Catanzaro  <mcatanzaro@gnome.org>
+
+        REGRESSION(r249808): [GTK] Crash in JSC Config::permanentlyFreeze() on architecture ppc64el
+        https://bugs.webkit.org/show_bug.cgi?id=209236
+
+        Reviewed by Mark Lam.
+
+        Add new CeilingOnPageSize constants, for use in JSC, in order to centralize our compile-time
+        page size guessing into one place. Improve the implementation of pageSize() to
+        RELEASE_ASSERT() when CeilingOnPageSize is wrong, so we can detect and fix it if so. (It
+        will be even easier to detect if we change RELEASE_ASSERT_WITH_MESSAGE() to actually print
+        its message in release builds.) Change pageSize() to use sysconf(_SC_PAGESIZE), which is
+        specified by POSIX, instead of getpagesize(), which is nonstandard.
+
+        * wtf/PageBlock.cpp:
+        (WTF::systemPageSize):
+        (WTF::pageSize):
+        * wtf/PageBlock.h:
+
 2020-03-23  Jacob Uphoff  <jacob_uphoff@apple.com>
 
         Unreviewed, reverting r258803.
index 37381b2..5d0acad 100644 (file)
@@ -44,7 +44,7 @@ static size_t s_pageMask;
 
 inline size_t systemPageSize()
 {
-    return getpagesize();
+    return sysconf(_SC_PAGESIZE);
 }
 
 #elif OS(WINDOWS)
@@ -62,9 +62,11 @@ inline size_t systemPageSize()
 
 size_t pageSize()
 {
-    if (!s_pageSize)
+    if (!s_pageSize) {
         s_pageSize = systemPageSize();
-    ASSERT(isPowerOfTwo(s_pageSize));
+        RELEASE_ASSERT(isPowerOfTwo(s_pageSize));
+        RELEASE_ASSERT_WITH_MESSAGE(s_pageSize <= CeilingOnPageSize, "CeilingOnPageSize is too low, raise it in PageBlock.h!");
+    }
     return s_pageSize;
 }
 
index b52c39e..cd85edf 100644 (file)
 
 #pragma once
 
+#include <wtf/StdLibExtras.h>
+
 namespace WTF {
 
+// We attempt to guess a value that is *AT LEAST* as large as the system's actual page size.
+// This is impossible to do correctly at build time, but JSC really needs it at build time, so
+// we have a RELEASE_ASSERT() inside WTF::pageSize to make sure it is set properly at runtime.
+// All of these values are going to be incorrect on systems configured to use larger than normal
+// page size, so on such systems it is expected that WebKit will crash until this value is changed
+// and recompiled. Sorry.
+//
+// macOS x86_64 uses 4 KiB, but Apple's aarch64 systems use 16 KiB. Use 16 KiB on all Apple systems
+// for consistency.
+//
+// Most Linux and Windows systems use a page size of 4 KiB.
+//
+// On Linux, Power systems normally use 64 KiB pages.
+//
+// aarch64 systems seem to be all over the place. Most Linux distros use 4 KiB, but RHEL uses
+// 64 KiB. (Apple uses 16 KiB.)
+//
+// Use 64 KiB for any unknown CPUs to be conservative.
+#if OS(DARWIN)
+constexpr size_t CeilingOnPageSize = 16 * KB;
+#elif OS(WINDOWS) || CPU(MIPS) || CPU(X86) || CPU(X86_64) || CPU(ARM)
+constexpr size_t CeilingOnPageSize = 4 * KB;
+#elif CPU(UNKNOWN) || CPU(PPC) || CPU(PPC64) || CPU(PPC64LE) || CPU(ARM64)
+constexpr size_t CeilingOnPageSize = 64 * KB;
+#else
+#error Must set CeilingOnPageSize in PageBlock.h when adding a new CPU architecture!
+#endif
+
 WTF_EXPORT_PRIVATE size_t pageSize();
 WTF_EXPORT_PRIVATE size_t pageMask();
 inline bool isPageAligned(void* address) { return !(reinterpret_cast<intptr_t>(address) & (pageSize() - 1)); }
@@ -80,6 +110,7 @@ inline PageBlock::PageBlock(void* base, size_t size, bool hasGuardPages)
 
 } // namespace WTF
 
+using WTF::CeilingOnPageSize;
 using WTF::pageSize;
 using WTF::isPageAligned;
 using WTF::isPowerOfTwo;