Source/bmalloc:
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 7 Apr 2018 00:00:34 +0000 (00:00 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 7 Apr 2018 00:00:34 +0000 (00:00 +0000)
bmalloc virtual allocation API should not treat memory it vends as dirty with respect to how it drives the scavenger
https://bugs.webkit.org/show_bug.cgi?id=184342

Reviewed by Mark Lam.

Currently, the only user of this API is Wasm. Ideally, Wasm would tell
us exactly which page is dirtied. We should really do that at some point:
https://bugs.webkit.org/show_bug.cgi?id=184207

However, until we do that, it's better to treat none of the virtual memory
we vend as dirty, versus what we do now, which is treat it all as dirty.
This dirty memory tracking helps drive the scavenger, so on iOS, having the
scavenger think its under memory pressure because of memory it can't free isn't
useful.

* bmalloc/bmalloc.cpp:
(bmalloc::api::tryLargeZeroedMemalignVirtual):
(bmalloc::api::freeLargeVirtual):
* bmalloc/bmalloc.h:

Source/WTF:
bmalloc's tryLargeZeroedMemalignVirtual shouldn't treat the entire virtual size as dirty towards its footprint
https://bugs.webkit.org/show_bug.cgi?id=184207

Reviewed by Mark Lam.

* wtf/Gigacage.cpp:
(Gigacage::freeVirtualPages):

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

Source/WTF/ChangeLog
Source/WTF/wtf/Gigacage.cpp
Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/bmalloc.cpp
Source/bmalloc/bmalloc/bmalloc.h

index 3e3860b..7d112ba 100644 (file)
@@ -1,3 +1,13 @@
+2018-04-06  Saam Barati  <sbarati@apple.com>
+
+        bmalloc's tryLargeZeroedMemalignVirtual shouldn't treat the entire virtual size as dirty towards its footprint
+        https://bugs.webkit.org/show_bug.cgi?id=184207
+
+        Reviewed by Mark Lam.
+
+        * wtf/Gigacage.cpp:
+        (Gigacage::freeVirtualPages):
+
 2018-04-05  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [WTF] Remove StaticLock
index 2dd45de..9a831b6 100644 (file)
@@ -108,12 +108,12 @@ void* tryAllocateZeroedVirtualPages(Kind kind, size_t size)
     return result;
 }
 
-void freeVirtualPages(Kind kind, void* basePtr, size_t)
+void freeVirtualPages(Kind kind, void* basePtr, size_t size)
 {
     if (!basePtr)
         return;
     RELEASE_ASSERT(isCaged(kind, basePtr));
-    bmalloc::api::freeLargeVirtual(basePtr, bmalloc::heapKind(kind));
+    bmalloc::api::freeLargeVirtual(basePtr, size, bmalloc::heapKind(kind));
     WTF::compilerFence();
 }
 
index 812ca62..094d65e 100644 (file)
@@ -1,3 +1,25 @@
+2018-04-06  Saam Barati  <sbarati@apple.com>
+
+        bmalloc virtual allocation API should not treat memory it vends as dirty with respect to how it drives the scavenger
+        https://bugs.webkit.org/show_bug.cgi?id=184342
+
+        Reviewed by Mark Lam.
+
+        Currently, the only user of this API is Wasm. Ideally, Wasm would tell
+        us exactly which page is dirtied. We should really do that at some point:
+        https://bugs.webkit.org/show_bug.cgi?id=184207
+        
+        However, until we do that, it's better to treat none of the virtual memory
+        we vend as dirty, versus what we do now, which is treat it all as dirty.
+        This dirty memory tracking helps drive the scavenger, so on iOS, having the
+        scavenger think its under memory pressure because of memory it can't free isn't
+        useful.
+
+        * bmalloc/bmalloc.cpp:
+        (bmalloc::api::tryLargeZeroedMemalignVirtual):
+        (bmalloc::api::freeLargeVirtual):
+        * bmalloc/bmalloc.h:
+
 2018-04-05  Saam Barati  <sbarati@apple.com>
 
         IsoHeapImpl not IsoHeapImplBase should add itself to AllIsoHeaps
index 9147439..30dd767 100644 (file)
@@ -54,6 +54,13 @@ void* tryLargeZeroedMemalignVirtual(size_t alignment, size_t size, HeapKind kind
     {
         std::lock_guard<Mutex> lock(Heap::mutex());
         result = heap.tryAllocateLarge(lock, alignment, size);
+        if (result) {
+            // Don't track this as dirty memory that dictates how we drive the scavenger.
+            // FIXME: We should make it so that users of this API inform bmalloc which
+            // pages they dirty:
+            // https://bugs.webkit.org/show_bug.cgi?id=184207
+            heap.externalDecommit(lock, result, size);
+        }
     }
 
     if (result)
@@ -61,11 +68,13 @@ void* tryLargeZeroedMemalignVirtual(size_t alignment, size_t size, HeapKind kind
     return result;
 }
 
-void freeLargeVirtual(void* object, HeapKind kind)
+void freeLargeVirtual(void* object, size_t size, HeapKind kind)
 {
     kind = mapToActiveHeapKind(kind);
     Heap& heap = PerProcess<PerHeapKind<Heap>>::get()->at(kind);
     std::lock_guard<Mutex> lock(Heap::mutex());
+    // Balance out the externalDecommit when we allocated the zeroed virtual memory.
+    heap.externalCommit(lock, object, size);
     heap.deallocateLarge(lock, object);
 }
 
index 796b24e..5321c8e 100644 (file)
@@ -82,7 +82,7 @@ inline void free(void* object, HeapKind kind = HeapKind::Primary)
 
 BEXPORT void freeOutOfLine(void* object, HeapKind kind = HeapKind::Primary);
 
-BEXPORT void freeLargeVirtual(void* object, HeapKind kind = HeapKind::Primary);
+BEXPORT void freeLargeVirtual(void* object, size_t, HeapKind kind = HeapKind::Primary);
 
 inline void scavengeThisThread()
 {