Large virtual memory region allocation requires MMAP_NORESERVE in Linux
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Sep 2017 10:31:29 +0000 (10:31 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Sep 2017 10:31:29 +0000 (10:31 +0000)
https://bugs.webkit.org/show_bug.cgi?id=176211

Reviewed by Geoffrey Garen.

In Linux, we cannot allocate very large memory region without MMAP_NORESERVE.
Linux kernel needs to reserve swap area for allocated memory region. If the
swap area is exhausted, kernel fails to allocate the memory region with ENOMEM.

This patch adds MMAP_NORESERVE to mmap flags in Linux. By adding this flag,
mmap does not need to reserve swap area for the reserved memory region.
This allows us to reserve very large memory region that is necessary for Gigacage.

* bmalloc/BPlatform.h:
* bmalloc/VMAllocate.h:
(bmalloc::tryVMAllocate):

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

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/BPlatform.h
Source/bmalloc/bmalloc/VMAllocate.h

index e0443ee..d920720 100644 (file)
@@ -1,3 +1,22 @@
+2017-09-03  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        Large virtual memory region allocation requires MMAP_NORESERVE in Linux
+        https://bugs.webkit.org/show_bug.cgi?id=176211
+
+        Reviewed by Geoffrey Garen.
+
+        In Linux, we cannot allocate very large memory region without MMAP_NORESERVE.
+        Linux kernel needs to reserve swap area for allocated memory region. If the
+        swap area is exhausted, kernel fails to allocate the memory region with ENOMEM.
+
+        This patch adds MMAP_NORESERVE to mmap flags in Linux. By adding this flag,
+        mmap does not need to reserve swap area for the reserved memory region.
+        This allows us to reserve very large memory region that is necessary for Gigacage.
+
+        * bmalloc/BPlatform.h:
+        * bmalloc/VMAllocate.h:
+        (bmalloc::tryVMAllocate):
+
 2017-08-22  Filip Pizlo  <fpizlo@apple.com>
 
         Strings need to be in some kind of gigacage
index e44bcb3..84f31b2 100644 (file)
 #define BOS_UNIX 1
 #endif
 
+#ifdef __linux__
+#define BOS_LINUX 1
+#endif
+
 #if defined(WIN32) || defined(_WIN32)
 #define BOS_WINDOWS 1
 #endif
index 819dc95..af7b6b0 100644 (file)
@@ -44,8 +44,13 @@ namespace bmalloc {
 
 #if BOS(DARWIN)
 #define BMALLOC_VM_TAG VM_MAKE_TAG(VM_MEMORY_TCMALLOC)
+#define BMALLOC_NORESERVE 0
+#elif BOS(LINUX)
+#define BMALLOC_VM_TAG -1
+#define BMALLOC_NORESERVE MAP_NORESERVE
 #else
 #define BMALLOC_VM_TAG -1
+#define BMALLOC_NORESERVE 0
 #endif
 
 inline size_t vmPageSize()
@@ -116,7 +121,7 @@ inline void vmValidatePhysical(void* p, size_t vmSize)
 inline void* tryVMAllocate(size_t vmSize)
 {
     vmValidate(vmSize);
-    void* result = mmap(0, vmSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, BMALLOC_VM_TAG, 0);
+    void* result = mmap(0, vmSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | BMALLOC_NORESERVE, BMALLOC_VM_TAG, 0);
     if (result == MAP_FAILED) {
         logVMFailure();
         return nullptr;