< prev index next >

src/hotspot/share/gc/z/zPageAllocator.cpp

Print this page

        

@@ -118,10 +118,11 @@
     _min_capacity(min_capacity),
     _max_capacity(max_capacity),
     _max_reserve(max_reserve),
     _current_max_capacity(max_capacity),
     _capacity(0),
+    _claimed(0),
     _used(0),
     _used_high(0),
     _used_low(0),
     _allocated(0),
     _reclaimed(0),

@@ -253,12 +254,13 @@
 }
 
 size_t ZPageAllocator::unused() const {
   const ssize_t capacity = (ssize_t)Atomic::load(&_capacity);
   const ssize_t used = (ssize_t)Atomic::load(&_used);
+  const ssize_t claimed = (ssize_t)Atomic::load(&_claimed);
   const ssize_t max_reserve = (ssize_t)_max_reserve;
-  const ssize_t unused = capacity - used - max_reserve;
+  const ssize_t unused = capacity - used - claimed - max_reserve;
   return unused > 0 ? (size_t)unused : 0;
 }
 
 size_t ZPageAllocator::allocated() const {
   return _allocated;

@@ -298,46 +300,40 @@
     // Update atomically since we have concurrent readers
     Atomic::store(&_current_max_capacity, _capacity);
   }
 }
 
-void ZPageAllocator::increase_used(size_t size, bool allocation, bool relocation) {
-  if (allocation) {
-    if (relocation) {
-      // Allocating a page for the purpose of relocation has a
-      // negative contribution to the number of reclaimed bytes.
-      _reclaimed -= size;
-    }
-    _allocated += size;
+void ZPageAllocator::increase_used(size_t size, bool relocation) {
+  if (relocation) {
+    // Allocating a page for the purpose of relocation has a
+    // negative contribution to the number of reclaimed bytes.
+    _reclaimed -= size;
   }
+  _allocated += size;
 
   // Update atomically since we have concurrent readers
-  Atomic::add(&_used, size);
-
-  if (_used > _used_high) {
-    _used_high = _used;
+  const size_t used = Atomic::add(&_used, size);
+  if (used > _used_high) {
+    _used_high = used;
   }
 }
 
-void ZPageAllocator::decrease_used(size_t size, bool free, bool reclaimed) {
-  if (free) {
-    // Only pages explicitly released with the reclaimed flag set
-    // counts as reclaimed bytes. This flag is true when we release
-    // a page after relocation, and is false when we release a page
-    // to undo an allocation.
-    if (reclaimed) {
-      _reclaimed += size;
-    } else {
-      _allocated -= size;
-    }
+void ZPageAllocator::decrease_used(size_t size, bool reclaimed) {
+  // Only pages explicitly released with the reclaimed flag set
+  // counts as reclaimed bytes. This flag is true when we release
+  // a page after relocation, and is false when we release a page
+  // to undo an allocation.
+  if (reclaimed) {
+    _reclaimed += size;
+  } else {
+    _allocated -= size;
   }
 
   // Update atomically since we have concurrent readers
-  Atomic::sub(&_used, size);
-
-  if (_used < _used_low) {
-    _used_low = _used;
+  const size_t used = Atomic::sub(&_used, size);
+  if (used < _used_low) {
+    _used_low = used;
   }
 }
 
 bool ZPageAllocator::commit_page(ZPage* page) {
   // Commit physical memory

@@ -374,22 +370,22 @@
   // Delete page safely
   _safe_delete(page);
 }
 
 bool ZPageAllocator::is_alloc_allowed(size_t size, bool no_reserve) const {
-  size_t available = _current_max_capacity - _used;
+  size_t available = _current_max_capacity - _used - _claimed;
 
   if (no_reserve) {
     // The reserve should not be considered available
     available -= MIN2(available, _max_reserve);
   }
 
   return available >= size;
 }
 
 bool ZPageAllocator::is_alloc_allowed_from_cache(size_t size, bool no_reserve) const {
-  size_t available = _capacity - _used;
+  size_t available = _capacity - _used - _claimed;
 
   if (no_reserve) {
     // The reserve should not be considered available
     available -= MIN2(available, _max_reserve);
   } else if (_capacity != _current_max_capacity) {

@@ -444,15 +440,15 @@
       return false;
     }
   }
 
   // Updated used statistics
-  increase_used(size, true /* allocation */, flags.relocation());
+  increase_used(size, flags.relocation());
 
   // Send event
-  event.commit(type, size, flags.non_blocking(), flags.no_reserve(),
-               _used, _current_max_capacity - _used, _capacity - _used);
+  event.commit(type, size, flags.non_blocking(), flags.no_reserve(), _used,
+               _current_max_capacity - _used - _claimed, _capacity - _used - _claimed);
 
   // Success
   return true;
 }
 

@@ -630,11 +626,11 @@
 
   ZLocker<ZLock> locker(&_lock);
 
   // Adjust capacity and used to reflect the failed capacity increase
   const size_t remaining = allocation->size() - freed;
-  decrease_used(remaining, false /* free */, false /* reclaimed */);
+  decrease_used(remaining, false /* reclaimed */);
   decrease_capacity(remaining, true /* set_max_capacity */);
 }
 
 ZPage* ZPageAllocator::alloc_page(uint8_t type, size_t size, ZAllocationFlags flags) {
 retry:

@@ -699,11 +695,11 @@
 
 void ZPageAllocator::free_page(ZPage* page, bool reclaimed) {
   ZLocker<ZLock> locker(&_lock);
 
   // Update used statistics
-  decrease_used(page->size(), true /* free */, reclaimed);
+  decrease_used(page->size(), reclaimed);
 
   // Set time when last used
   page->set_last_used();
 
   // Cache page

@@ -741,12 +737,12 @@
     if (flushed == 0) {
       // Nothing flushed
       return 0;
     }
 
-    // Adjust used to reflect that these pages are no longer available
-    increase_used(flushed, false /* allocation */, false /* relocation */);
+    // Record flushed pages as claimed
+    Atomic::add(&_claimed, flushed);
   }
 
   // Unmap, uncommit, and destroy flushed pages
   ZListRemoveIterator<ZPage> iter(&pages);
   for (ZPage* page; iter.next(&page);) {

@@ -757,12 +753,12 @@
 
   {
     SuspendibleThreadSetJoiner joiner(!ZVerifyViews);
     ZLocker<ZLock> locker(&_lock);
 
-    // Adjust used and capacity to reflect the uncommit
-    decrease_used(flushed, false /* free */, false /* reclaimed */);
+    // Adjust claimed and capacity to reflect the uncommit
+    Atomic::sub(&_claimed, flushed);
     decrease_capacity(flushed, false /* set_max_capacity */);
   }
 
   return flushed;
 }
< prev index next >