Title: [244233] trunk/Source
Revision
244233
Author
sbar...@apple.com
Date
2019-04-12 16:26:43 -0700 (Fri, 12 Apr 2019)

Log Message

Sometimes we need to user fewer CPUs in our threading calculations
https://bugs.webkit.org/show_bug.cgi?id=196794
<rdar://problem/49389497>

Reviewed by Yusuke Suzuki.

Source/_javascript_Core:

* _javascript_Core.xcodeproj/project.pbxproj:
* Sources.txt:
* assembler/CPU.cpp: Added.
(JSC::isKernTCSMAvailable):
(JSC::enableKernTCSM):
(JSC::kernTCSMAwareNumberOfProcessorCores):
* assembler/CPU.h:
(JSC::isKernTCSMAvailable):
(JSC::enableKernTCSM):
(JSC::kernTCSMAwareNumberOfProcessorCores):
* heap/MachineStackMarker.h:
(JSC::MachineThreads::addCurrentThread):
* runtime/JSLock.cpp:
(JSC::JSLock::didAcquireLock):
* runtime/Options.cpp:
(JSC::computeNumberOfWorkerThreads):
(JSC::computePriorityDeltaOfWorkerThreads):
* wasm/WasmWorklist.cpp:
(JSC::Wasm::Worklist::Worklist):

Source/WebKit:

* WebProcess/com.apple.WebProcess.sb.in:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (244232 => 244233)


--- trunk/Source/_javascript_Core/ChangeLog	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/ChangeLog	2019-04-12 23:26:43 UTC (rev 244233)
@@ -1,3 +1,31 @@
+2019-04-12  Saam barati  <sbar...@apple.com>
+
+        Sometimes we need to user fewer CPUs in our threading calculations
+        https://bugs.webkit.org/show_bug.cgi?id=196794
+        <rdar://problem/49389497>
+
+        Reviewed by Yusuke Suzuki.
+
+        * _javascript_Core.xcodeproj/project.pbxproj:
+        * Sources.txt:
+        * assembler/CPU.cpp: Added.
+        (JSC::isKernTCSMAvailable):
+        (JSC::enableKernTCSM):
+        (JSC::kernTCSMAwareNumberOfProcessorCores):
+        * assembler/CPU.h:
+        (JSC::isKernTCSMAvailable):
+        (JSC::enableKernTCSM):
+        (JSC::kernTCSMAwareNumberOfProcessorCores):
+        * heap/MachineStackMarker.h:
+        (JSC::MachineThreads::addCurrentThread):
+        * runtime/JSLock.cpp:
+        (JSC::JSLock::didAcquireLock):
+        * runtime/Options.cpp:
+        (JSC::computeNumberOfWorkerThreads):
+        (JSC::computePriorityDeltaOfWorkerThreads):
+        * wasm/WasmWorklist.cpp:
+        (JSC::Wasm::Worklist::Worklist):
+
 2019-04-12  Robin Morisset  <rmoris...@apple.com>
 
         Use padding at end of ArrayBuffer

Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (244232 => 244233)


--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2019-04-12 23:26:43 UTC (rev 244233)
@@ -3392,6 +3392,7 @@
 		521131F61F82BF11007CCEEE /* PolyProtoAccessChain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolyProtoAccessChain.h; sourceTree = "<group>"; };
 		521322431ECBCE8200F65615 /* WebAssemblyFunctionBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebAssemblyFunctionBase.cpp; path = js/WebAssemblyFunctionBase.cpp; sourceTree = "<group>"; };
 		521322441ECBCE8200F65615 /* WebAssemblyFunctionBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebAssemblyFunctionBase.h; path = js/WebAssemblyFunctionBase.h; sourceTree = "<group>"; };
+		52335628225EB8E900268BD2 /* CPU.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CPU.cpp; sourceTree = "<group>"; };
 		523FD88C225566C3003B3DCC /* WebAssemblyFunctionHeapCellType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WebAssemblyFunctionHeapCellType.h; path = js/WebAssemblyFunctionHeapCellType.h; sourceTree = "<group>"; };
 		523FD88D225566C4003B3DCC /* WebAssemblyFunctionHeapCellType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WebAssemblyFunctionHeapCellType.cpp; path = js/WebAssemblyFunctionHeapCellType.cpp; sourceTree = "<group>"; };
 		524E9D7122092B4500A6BEEE /* AirAllocateRegistersAndStackAndGenerateCode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AirAllocateRegistersAndStackAndGenerateCode.cpp; path = b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp; sourceTree = "<group>"; };
@@ -7798,6 +7799,7 @@
 				43C392AA1C3BEB0000241F53 /* AssemblerCommon.h */,
 				86E116B00FE75AC800B512BC /* CodeLocation.h */,
 				0F30D7BF1D95D62F0053089D /* CPU.h */,
+				52335628225EB8E900268BD2 /* CPU.cpp */,
 				0F37308E1C0CD68500052BFA /* DisallowMacroScratchRegisterUsage.h */,
 				0FF4275615914A20004CB9FF /* LinkBuffer.cpp */,
 				86D3B3C110159D7F002865E7 /* LinkBuffer.h */,

Modified: trunk/Source/_javascript_Core/Sources.txt (244232 => 244233)


--- trunk/Source/_javascript_Core/Sources.txt	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/Sources.txt	2019-04-12 23:26:43 UTC (rev 244233)
@@ -43,6 +43,7 @@
 API/OpaqueJSString.cpp
 
 assembler/AbstractMacroAssembler.cpp
+assembler/CPU.cpp
 assembler/LinkBuffer.cpp
 assembler/MacroAssembler.cpp
 assembler/MacroAssemblerARM64.cpp

Added: trunk/Source/_javascript_Core/assembler/CPU.cpp (0 => 244233)


--- trunk/Source/_javascript_Core/assembler/CPU.cpp	                        (rev 0)
+++ trunk/Source/_javascript_Core/assembler/CPU.cpp	2019-04-12 23:26:43 UTC (rev 244233)
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "CPU.h"
+
+#if (CPU(X86) || CPU(X86_64)) && OS(DARWIN)
+#include <sys/sysctl.h>
+#endif
+
+namespace JSC {
+
+#if (CPU(X86) || CPU(X86_64)) && OS(DARWIN)
+bool isKernTCSMAvailable()
+{
+    uint32_t val = 0;
+    size_t valSize = sizeof(val);
+    int rc = sysctlbyname("kern.tcsm_available", &val, &valSize, NULL, 0);
+    if (rc < 0)
+        return false;
+    return !!val;
+}
+
+bool enableKernTCSM()
+{
+    uint32_t val = 1;
+    int rc = sysctlbyname("kern.tcsm_enable", NULL, 0, &val, sizeof(val));
+    if (rc < 0)
+        return false;
+    return true;
+}
+
+int kernTCSMAwareNumberOfProcessorCores()
+{
+    static std::once_flag onceFlag;
+    static int result;
+    std::call_once(onceFlag, [] {
+        result = WTF::numberOfProcessorCores();
+        if (result <= 1)
+            return;
+        if (isKernTCSMAvailable())
+            --result;
+    });
+    return result;
+}
+#endif // #if (CPU(X86) || CPU(X86_64)) && OS(DARWIN)
+
+} // namespace JSC

Modified: trunk/Source/_javascript_Core/assembler/CPU.h (244232 => 244233)


--- trunk/Source/_javascript_Core/assembler/CPU.h	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/assembler/CPU.h	2019-04-12 23:26:43 UTC (rev 244233)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "Options.h"
+#include <wtf/NumberOfCores.h>
 
 namespace JSC {
 
@@ -131,5 +132,15 @@
     return optimizeForX86();
 }
 
+#if (CPU(X86) || CPU(X86_64)) && OS(DARWIN)
+bool isKernTCSMAvailable();
+bool enableKernTCSM();
+int kernTCSMAwareNumberOfProcessorCores();
+#else
+ALWAYS_INLINE bool isKernTCSMAvailable() { return false; }
+ALWAYS_INLINE bool enableKernTCSM() { return false; }
+ALWAYS_INLINE int kernTCSMAwareNumberOfProcessorCores() { return WTF::numberOfProcessorCores(); }
+#endif
+
 } // namespace JSC
 

Modified: trunk/Source/_javascript_Core/heap/MachineStackMarker.h (244232 => 244233)


--- trunk/Source/_javascript_Core/heap/MachineStackMarker.h	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/heap/MachineStackMarker.h	2019-04-12 23:26:43 UTC (rev 244233)
@@ -48,7 +48,7 @@
     void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, CurrentThreadState*, Thread*);
 
     // Only needs to be called by clients that can use the same heap from multiple threads.
-    void addCurrentThread() { m_threadGroup->addCurrentThread(); }
+    bool addCurrentThread() { return m_threadGroup->addCurrentThread() == ThreadGroupAddResult::NewlyAdded; }
 
     WordLock& getLock() { return m_threadGroup->getLock(); }
     const ListHashSet<Ref<Thread>>& threads(const AbstractLocker& locker) const { return m_threadGroup->threads(locker); }

Modified: trunk/Source/_javascript_Core/runtime/JSLock.cpp (244232 => 244233)


--- trunk/Source/_javascript_Core/runtime/JSLock.cpp	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/runtime/JSLock.cpp	2019-04-12 23:26:43 UTC (rev 244233)
@@ -148,7 +148,11 @@
     void* p = currentStackPointer();
     m_vm->setStackPointerAtVMEntry(p);
 
-    m_vm->heap.machineThreads().addCurrentThread();
+    if (m_vm->heap.machineThreads().addCurrentThread()) {
+        if (isKernTCSMAvailable())
+            enableKernTCSM();
+    }
+
 #if ENABLE(WEBASSEMBLY)
     if (Wasm::isSupported())
         Wasm::startTrackingCurrentThread();

Modified: trunk/Source/_javascript_Core/runtime/Options.cpp (244232 => 244233)


--- trunk/Source/_javascript_Core/runtime/Options.cpp	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/runtime/Options.cpp	2019-04-12 23:26:43 UTC (rev 244233)
@@ -205,7 +205,7 @@
 
 static unsigned computeNumberOfWorkerThreads(int maxNumberOfWorkerThreads, int minimum = 1)
 {
-    int cpusToUse = std::min(WTF::numberOfProcessorCores(), maxNumberOfWorkerThreads);
+    int cpusToUse = std::min(kernTCSMAwareNumberOfProcessorCores(), maxNumberOfWorkerThreads);
 
     // Be paranoid, it is the OS we're dealing with, after all.
     ASSERT(cpusToUse >= 1);
@@ -214,7 +214,7 @@
 
 static int32_t computePriorityDeltaOfWorkerThreads(int32_t twoCorePriorityDelta, int32_t multiCorePriorityDelta)
 {
-    if (WTF::numberOfProcessorCores() <= 2)
+    if (kernTCSMAwareNumberOfProcessorCores() <= 2)
         return twoCorePriorityDelta;
 
     return multiCorePriorityDelta;

Modified: trunk/Source/_javascript_Core/wasm/WasmWorklist.cpp (244232 => 244233)


--- trunk/Source/_javascript_Core/wasm/WasmWorklist.cpp	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/_javascript_Core/wasm/WasmWorklist.cpp	2019-04-12 23:26:43 UTC (rev 244233)
@@ -28,10 +28,9 @@
 
 #if ENABLE(WEBASSEMBLY)
 
+#include "CPU.h"
 #include "WasmPlan.h"
 
-#include <wtf/NumberOfCores.h>
-
 namespace JSC { namespace Wasm {
 
 namespace WasmWorklistInternal {
@@ -207,7 +206,7 @@
     : m_lock(Box<Lock>::create())
     , m_planEnqueued(AutomaticThreadCondition::create())
 {
-    unsigned numberOfCompilationThreads = Options::useConcurrentJIT() ? WTF::numberOfProcessorCores() : 1;
+    unsigned numberOfCompilationThreads = Options::useConcurrentJIT() ? kernTCSMAwareNumberOfProcessorCores() : 1;
     m_threads.reserveCapacity(numberOfCompilationThreads);
     LockHolder locker(*m_lock);
     for (unsigned i = 0; i < numberOfCompilationThreads; i++)

Modified: trunk/Source/WebKit/ChangeLog (244232 => 244233)


--- trunk/Source/WebKit/ChangeLog	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/WebKit/ChangeLog	2019-04-12 23:26:43 UTC (rev 244233)
@@ -1,3 +1,13 @@
+2019-04-12  Saam barati  <sbar...@apple.com>
+
+        Sometimes we need to user fewer CPUs in our threading calculations
+        https://bugs.webkit.org/show_bug.cgi?id=196794
+        <rdar://problem/49389497>
+
+        Reviewed by Yusuke Suzuki.
+
+        * WebProcess/com.apple.WebProcess.sb.in:
+
 2019-04-12  Devin Rousso  <drou...@apple.com>
 
         WebDriver: evaluating _javascript_ shouldn't fail if a dialog is shown

Modified: trunk/Source/WebKit/WebProcess/com.apple.WebProcess.sb.in (244232 => 244233)


--- trunk/Source/WebKit/WebProcess/com.apple.WebProcess.sb.in	2019-04-12 22:44:21 UTC (rev 244232)
+++ trunk/Source/WebKit/WebProcess/com.apple.WebProcess.sb.in	2019-04-12 23:26:43 UTC (rev 244233)
@@ -172,6 +172,8 @@
         "kern.version"
         "machdep.cpu.brand_string"
         "security.mac.sandbox.sentinel"
+        "kern.tcsm_enable"
+        "kern.tcsm_available"
         "vm.footprint_suspend")
     (sysctl-name-regex #"^hw.(active|avail)cpu")
     (sysctl-name-regex #"^hw.(busfrequency|cachelinesize|cpufrequency(|_max)|pagesize|tbfrequency)(|_compat)")
@@ -182,6 +184,10 @@
     (sysctl-name-regex #"^net.routetable")
 )
 
+(allow sysctl-write
+    (sysctl-name
+        "kern.tcsm_enable"))
+
 (deny iokit-get-properties)
 (allow iokit-get-properties
     (iokit-property "AAPL,LCD-PowerState-ON") ;; <rdar://problem/47738015>
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to