Title: [254527] trunk/Source/bmalloc
Revision
254527
Author
[email protected]
Date
2020-01-14 12:51:31 -0800 (Tue, 14 Jan 2020)

Log Message

[bmalloc] Calculate LineMetadata for specific VM page size in compile time
https://bugs.webkit.org/show_bug.cgi?id=206044

Reviewed by Yusuke Suzuki.

LineMetadata is dependent only on VM page size. This patch enables the pre-calculation for
specific VM page sizes by compiler flags. The benefit is both runtime initialization speed
up and avoiding extra VM allocation on runtime.

First targets are 4k (Mac) and 16k (some iOS, PlayStation) VM page sizes.

* bmalloc/Algorithm.h:
(bmalloc::divideRoundingUp):
* bmalloc/BPlatform.h:
* bmalloc/HeapConstants.cpp:
(bmalloc::fillLineMetadata):
(bmalloc::computeLineMetadata):
(bmalloc::HeapConstants::initializeLineMetadata):
* bmalloc/HeapConstants.h:
(bmalloc::HeapConstants::smallLineCount const):
(bmalloc::HeapConstants::startOffset const):
(bmalloc::HeapConstants::objectCount const):
(bmalloc::HeapConstants::lineMetadata const):
(bmalloc::HeapConstants::startOffset): Deleted.
(bmalloc::HeapConstants::objectCount): Deleted.
(bmalloc::HeapConstants::lineMetadata): Deleted.
* bmalloc/LineMetadata.h:
* bmalloc/Sizes.h:
(bmalloc::Sizes::maskObjectSize):
(bmalloc::Sizes::logSizeClass):
(bmalloc::Sizes::logObjectSize):
(bmalloc::Sizes::sizeClass):
(bmalloc::Sizes::objectSize):
(bmalloc::Sizes::pageSize):
(bmalloc::Sizes::smallLineCount):

Modified Paths

Diff

Modified: trunk/Source/bmalloc/ChangeLog (254526 => 254527)


--- trunk/Source/bmalloc/ChangeLog	2020-01-14 20:46:52 UTC (rev 254526)
+++ trunk/Source/bmalloc/ChangeLog	2020-01-14 20:51:31 UTC (rev 254527)
@@ -1,3 +1,41 @@
+2020-01-14  Basuke Suzuki  <[email protected]>
+
+        [bmalloc] Calculate LineMetadata for specific VM page size in compile time
+        https://bugs.webkit.org/show_bug.cgi?id=206044
+
+        Reviewed by Yusuke Suzuki.
+
+        LineMetadata is dependent only on VM page size. This patch enables the pre-calculation for
+        specific VM page sizes by compiler flags. The benefit is both runtime initialization speed
+        up and avoiding extra VM allocation on runtime.
+
+        First targets are 4k (Mac) and 16k (some iOS, PlayStation) VM page sizes.
+
+        * bmalloc/Algorithm.h:
+        (bmalloc::divideRoundingUp):
+        * bmalloc/BPlatform.h:
+        * bmalloc/HeapConstants.cpp:
+        (bmalloc::fillLineMetadata):
+        (bmalloc::computeLineMetadata):
+        (bmalloc::HeapConstants::initializeLineMetadata):
+        * bmalloc/HeapConstants.h:
+        (bmalloc::HeapConstants::smallLineCount const):
+        (bmalloc::HeapConstants::startOffset const):
+        (bmalloc::HeapConstants::objectCount const):
+        (bmalloc::HeapConstants::lineMetadata const):
+        (bmalloc::HeapConstants::startOffset): Deleted.
+        (bmalloc::HeapConstants::objectCount): Deleted.
+        (bmalloc::HeapConstants::lineMetadata): Deleted.
+        * bmalloc/LineMetadata.h:
+        * bmalloc/Sizes.h:
+        (bmalloc::Sizes::maskObjectSize):
+        (bmalloc::Sizes::logSizeClass):
+        (bmalloc::Sizes::logObjectSize):
+        (bmalloc::Sizes::sizeClass):
+        (bmalloc::Sizes::objectSize):
+        (bmalloc::Sizes::pageSize):
+        (bmalloc::Sizes::smallLineCount):
+
 2020-01-14  David Kilzer  <[email protected]>
 
         Enable -Wconditional-uninitialized in bmalloc, WTF, _javascript_Core

Modified: trunk/Source/bmalloc/bmalloc/Algorithm.h (254526 => 254527)


--- trunk/Source/bmalloc/bmalloc/Algorithm.h	2020-01-14 20:46:52 UTC (rev 254526)
+++ trunk/Source/bmalloc/bmalloc/Algorithm.h	2020-01-14 20:51:31 UTC (rev 254527)
@@ -129,7 +129,7 @@
         quotient += 1;
 }
 
-template<typename T> inline T divideRoundingUp(T numerator, T denominator)
+template<typename T> constexpr T divideRoundingUp(T numerator, T denominator)
 {
     return (numerator + denominator - 1) / denominator;
 }

Modified: trunk/Source/bmalloc/bmalloc/BPlatform.h (254526 => 254527)


--- trunk/Source/bmalloc/bmalloc/BPlatform.h	2020-01-14 20:46:52 UTC (rev 254526)
+++ trunk/Source/bmalloc/bmalloc/BPlatform.h	2020-01-14 20:51:31 UTC (rev 254527)
@@ -262,3 +262,11 @@
 #else
 #define BUSE_PARTIAL_SCAVENGE 0
 #endif
+
+#if !defined(BUSE_PRECOMPUTED_CONSTANTS_VMPAGE4K)
+#define BUSE_PRECOMPUTED_CONSTANTS_VMPAGE4K 1
+#endif
+
+#if !defined(BUSE_PRECOMPUTED_CONSTANTS_VMPAGE16K)
+#define BUSE_PRECOMPUTED_CONSTANTS_VMPAGE16K 1
+#endif

Modified: trunk/Source/bmalloc/bmalloc/HeapConstants.cpp (254526 => 254527)


--- trunk/Source/bmalloc/bmalloc/HeapConstants.cpp	2020-01-14 20:46:52 UTC (rev 254526)
+++ trunk/Source/bmalloc/bmalloc/HeapConstants.cpp	2020-01-14 20:51:31 UTC (rev 254527)
@@ -24,6 +24,7 @@
  */
 
 #include "HeapConstants.h"
+#include <algorithm>
 
 namespace bmalloc {
 
@@ -39,38 +40,73 @@
     initializePageMetadata();
 }
 
-void HeapConstants::initializeLineMetadata()
+template <class C>
+constexpr void fillLineMetadata(C& container, size_t VMPageSize)
 {
-    size_t sizeClassCount = bmalloc::sizeClass(smallLineSize);
-    m_smallLineMetadata.grow(sizeClassCount * smallLineCount());
+    constexpr size_t clsCount = sizeClass(smallLineSize);
+    size_t lineCount = smallLineCount(VMPageSize);
 
-    for (size_t sizeClass = 0; sizeClass < sizeClassCount; ++sizeClass) {
-        size_t size = objectSize(sizeClass);
-        LineMetadata* pageMetadata = &m_smallLineMetadata[sizeClass * smallLineCount()];
-
+    for (size_t cls = 0; cls < clsCount; ++cls) {
+        size_t size = objectSize(cls);
+        size_t baseIndex = cls * lineCount;
         size_t object = 0;
-        size_t line = 0;
-        while (object < m_vmPageSizePhysical) {
-            line = object / smallLineSize;
+        while (object < VMPageSize) {
+            size_t line = object / smallLineSize;
             size_t leftover = object % smallLineSize;
 
-            size_t objectCount;
-            size_t remainder;
-            divideRoundingUp(smallLineSize - leftover, size, objectCount, remainder);
+            auto objectCount = divideRoundingUp(smallLineSize - leftover, size);
 
-            pageMetadata[line] = { static_cast<unsigned char>(leftover), static_cast<unsigned char>(objectCount) };
-
             object += objectCount * size;
-        }
 
-        // Don't allow the last object in a page to escape the page.
-        if (object > m_vmPageSizePhysical) {
-            BASSERT(pageMetadata[line].objectCount);
-            --pageMetadata[line].objectCount;
+            // Don't allow the last object in a page to escape the page.
+            if (object > VMPageSize) {
+                BASSERT(objectCount);
+                --objectCount;
+            }
+
+            container[baseIndex + line] = { static_cast<unsigned char>(leftover), static_cast<unsigned char>(objectCount) };
         }
     }
 }
 
+template <size_t VMPageSize>
+constexpr auto computeLineMetadata()
+{
+    std::array<LineMetadata, sizeClass(smallLineSize) * smallLineCount(VMPageSize)> result;
+    fillLineMetadata(result, VMPageSize);
+    return result;
+}
+
+#if BUSE(PRECOMPUTED_CONSTANTS_VMPAGE4K)
+constexpr auto kPrecalcuratedLineMetadata4k = computeLineMetadata<4 * kB>();
+#endif
+
+#if BUSE(PRECOMPUTED_CONSTANTS_VMPAGE16K)
+constexpr auto kPrecalcuratedLineMetadata16k = computeLineMetadata<16 * kB>();
+#endif
+
+void HeapConstants::initializeLineMetadata()
+{
+#if BUSE(PRECOMPUTED_CONSTANTS_VMPAGE4K)
+    if (m_vmPageSizePhysical == 4 * kB) {
+        m_smallLineMetadata = &kPrecalcuratedLineMetadata4k[0];
+        return;
+    }
+#endif
+
+#if BUSE(PRECOMPUTED_CONSTANTS_VMPAGE16K)
+    if (m_vmPageSizePhysical == 16 * kB) {
+        m_smallLineMetadata = &kPrecalcuratedLineMetadata16k[0];
+        return;
+    }
+#endif
+
+    size_t sizeClassCount = bmalloc::sizeClass(smallLineSize);
+    m_smallLineMetadataStorage.grow(sizeClassCount * smallLineCount());
+    fillLineMetadata(m_smallLineMetadataStorage, m_vmPageSizePhysical);
+    m_smallLineMetadata = &m_smallLineMetadataStorage[0];
+}
+
 void HeapConstants::initializePageMetadata()
 {
     auto computePageSize = [&](size_t sizeClass) {

Modified: trunk/Source/bmalloc/bmalloc/HeapConstants.h (254526 => 254527)


--- trunk/Source/bmalloc/bmalloc/HeapConstants.h	2020-01-14 20:46:52 UTC (rev 254526)
+++ trunk/Source/bmalloc/bmalloc/HeapConstants.h	2020-01-14 20:51:31 UTC (rev 254527)
@@ -41,21 +41,22 @@
     ~HeapConstants() = delete;
 
     inline size_t pageClass(size_t sizeClass) const { return m_pageClasses[sizeClass]; }
-    inline size_t smallLineCount() const { return m_vmPageSizePhysical / smallLineSize; }
-    inline unsigned char startOffset(size_t sizeClass, size_t lineNumber) { return lineMetadata(sizeClass, lineNumber).startOffset; }
-    inline unsigned char objectCount(size_t sizeClass, size_t lineNumber) { return lineMetadata(sizeClass, lineNumber).objectCount; }
+    inline size_t smallLineCount() const { return bmalloc::smallLineCount(m_vmPageSizePhysical); }
+    inline unsigned char startOffset(size_t sizeClass, size_t lineNumber) const { return lineMetadata(sizeClass, lineNumber).startOffset; }
+    inline unsigned char objectCount(size_t sizeClass, size_t lineNumber) const { return lineMetadata(sizeClass, lineNumber).objectCount; }
 
 private:
     void initializeLineMetadata();
     void initializePageMetadata();
 
-    inline LineMetadata& lineMetadata(size_t sizeClass, size_t lineNumber)
+    inline const LineMetadata& lineMetadata(size_t sizeClass, size_t lineNumber) const
     {
         return m_smallLineMetadata[sizeClass * smallLineCount() + lineNumber];
     }
 
     size_t m_vmPageSizePhysical;
-    Vector<LineMetadata> m_smallLineMetadata;
+    const LineMetadata* m_smallLineMetadata { };
+    Vector<LineMetadata> m_smallLineMetadataStorage;
     std::array<size_t, sizeClassCount> m_pageClasses;
 };
 DECLARE_STATIC_PER_PROCESS_STORAGE(HeapConstants);

Modified: trunk/Source/bmalloc/bmalloc/LineMetadata.h (254526 => 254527)


--- trunk/Source/bmalloc/bmalloc/LineMetadata.h	2020-01-14 20:46:52 UTC (rev 254526)
+++ trunk/Source/bmalloc/bmalloc/LineMetadata.h	2020-01-14 20:51:31 UTC (rev 254527)
@@ -30,8 +30,8 @@
 namespace bmalloc {
 
 struct LineMetadata {
-    unsigned char startOffset;
-    unsigned char objectCount;
+    unsigned char startOffset { };
+    unsigned char objectCount { };
 };
 
 static_assert(

Modified: trunk/Source/bmalloc/bmalloc/Sizes.h (254526 => 254527)


--- trunk/Source/bmalloc/bmalloc/Sizes.h	2020-01-14 20:46:52 UTC (rev 254526)
+++ trunk/Source/bmalloc/bmalloc/Sizes.h	2020-01-14 20:51:31 UTC (rev 254527)
@@ -80,7 +80,7 @@
     return mask((size - 1) / alignment, maskSizeClassCount - 1);
 }
 
-inline size_t maskObjectSize(size_t maskSizeClass)
+constexpr size_t maskObjectSize(size_t maskSizeClass)
 {
     return (maskSizeClass + 1) * alignment;
 }
@@ -89,7 +89,7 @@
 
 static constexpr size_t logSizeClassCount = (log2(smallMax) - log2(maskSizeClassMax)) * logWasteFactor;
 
-inline size_t logSizeClass(size_t size)
+constexpr size_t logSizeClass(size_t size)
 {
     size_t base = log2(size - 1) - log2(maskSizeClassMax);
     size_t offset = (size - 1 - (maskSizeClassMax << base));
@@ -96,7 +96,7 @@
     return base * logWasteFactor + offset / (logAlignmentMin << base);
 }
 
-inline size_t logObjectSize(size_t logSizeClass)
+constexpr size_t logObjectSize(size_t logSizeClass)
 {
     size_t base = logSizeClass / logWasteFactor;
     size_t offset = logSizeClass % logWasteFactor;
@@ -105,7 +105,7 @@
 
 static constexpr size_t sizeClassCount = maskSizeClassCount + logSizeClassCount;
 
-inline size_t sizeClass(size_t size)
+constexpr size_t sizeClass(size_t size)
 {
     if (size <= maskSizeClassMax)
         return maskSizeClass(size);
@@ -112,7 +112,7 @@
     return maskSizeClassCount + logSizeClass(size);
 }
 
-inline size_t objectSize(size_t sizeClass)
+constexpr size_t objectSize(size_t sizeClass)
 {
     if (sizeClass < maskSizeClassCount)
         return maskObjectSize(sizeClass);
@@ -119,10 +119,16 @@
     return logObjectSize(sizeClass - maskSizeClassCount);
 }
 
-inline size_t pageSize(size_t pageClass)
+constexpr size_t pageSize(size_t pageClass)
 {
     return (pageClass + 1) * smallPageSize;
 }
+
+constexpr size_t smallLineCount(size_t vmPageSize)
+{
+    return vmPageSize / smallLineSize;
+}
+
 } // namespace Sizes
 
 using namespace Sizes;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to