- Revision
- 255325
- Author
- [email protected]
- Date
- 2020-01-28 16:40:24 -0800 (Tue, 28 Jan 2020)
Log Message
Cherry-pick r254527. rdar://problem/58945571
[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):
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@254527 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Modified Paths
Diff
Modified: branches/safari-609-branch/Source/bmalloc/ChangeLog (255324 => 255325)
--- branches/safari-609-branch/Source/bmalloc/ChangeLog 2020-01-29 00:40:18 UTC (rev 255324)
+++ branches/safari-609-branch/Source/bmalloc/ChangeLog 2020-01-29 00:40:24 UTC (rev 255325)
@@ -1,5 +1,86 @@
2020-01-28 Russell Epstein <[email protected]>
+ Cherry-pick r254527. rdar://problem/58945571
+
+ [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):
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@254527 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 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-28 Russell Epstein <[email protected]>
+
Cherry-pick r254303. rdar://problem/58945571
[bmalloc] Extract constants from Heap and share it among Heaps.
Modified: branches/safari-609-branch/Source/bmalloc/bmalloc/Algorithm.h (255324 => 255325)
--- branches/safari-609-branch/Source/bmalloc/bmalloc/Algorithm.h 2020-01-29 00:40:18 UTC (rev 255324)
+++ branches/safari-609-branch/Source/bmalloc/bmalloc/Algorithm.h 2020-01-29 00:40:24 UTC (rev 255325)
@@ -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: branches/safari-609-branch/Source/bmalloc/bmalloc/BPlatform.h (255324 => 255325)
--- branches/safari-609-branch/Source/bmalloc/bmalloc/BPlatform.h 2020-01-29 00:40:18 UTC (rev 255324)
+++ branches/safari-609-branch/Source/bmalloc/bmalloc/BPlatform.h 2020-01-29 00:40:24 UTC (rev 255325)
@@ -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: branches/safari-609-branch/Source/bmalloc/bmalloc/HeapConstants.cpp (255324 => 255325)
--- branches/safari-609-branch/Source/bmalloc/bmalloc/HeapConstants.cpp 2020-01-29 00:40:18 UTC (rev 255324)
+++ branches/safari-609-branch/Source/bmalloc/bmalloc/HeapConstants.cpp 2020-01-29 00:40:24 UTC (rev 255325)
@@ -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: branches/safari-609-branch/Source/bmalloc/bmalloc/HeapConstants.h (255324 => 255325)
--- branches/safari-609-branch/Source/bmalloc/bmalloc/HeapConstants.h 2020-01-29 00:40:18 UTC (rev 255324)
+++ branches/safari-609-branch/Source/bmalloc/bmalloc/HeapConstants.h 2020-01-29 00:40:24 UTC (rev 255325)
@@ -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: branches/safari-609-branch/Source/bmalloc/bmalloc/LineMetadata.h (255324 => 255325)
--- branches/safari-609-branch/Source/bmalloc/bmalloc/LineMetadata.h 2020-01-29 00:40:18 UTC (rev 255324)
+++ branches/safari-609-branch/Source/bmalloc/bmalloc/LineMetadata.h 2020-01-29 00:40:24 UTC (rev 255325)
@@ -30,8 +30,8 @@
namespace bmalloc {
struct LineMetadata {
- unsigned char startOffset;
- unsigned char objectCount;
+ unsigned char startOffset { };
+ unsigned char objectCount { };
};
static_assert(
Modified: branches/safari-609-branch/Source/bmalloc/bmalloc/Sizes.h (255324 => 255325)
--- branches/safari-609-branch/Source/bmalloc/bmalloc/Sizes.h 2020-01-29 00:40:18 UTC (rev 255324)
+++ branches/safari-609-branch/Source/bmalloc/bmalloc/Sizes.h 2020-01-29 00:40:24 UTC (rev 255325)
@@ -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;