changeset 12338:a3ee61047501

8166898: G1SATBCardTableLoggingModRefBS::invalidate() incorrect with whole_heap == true Reviewed-by: tschatzl, kbarrett
author lmesnik
date Thu, 24 Nov 2016 16:48:22 +0300
parents a67614dce6cd
children dfece8d73930
files src/share/vm/gc/g1/g1SATBCardTableModRefBS.cpp src/share/vm/gc/g1/g1SATBCardTableModRefBS.hpp src/share/vm/gc/shared/cardTableModRefBS.cpp src/share/vm/gc/shared/cardTableModRefBS.hpp src/share/vm/gc/shared/cardTableRS.hpp src/share/vm/gc/shared/modRefBarrierSet.hpp
diffstat 6 files changed, 32 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc/g1/g1SATBCardTableModRefBS.cpp	Thu Nov 24 11:27:57 2016 +0100
+++ b/src/share/vm/gc/g1/g1SATBCardTableModRefBS.cpp	Thu Nov 24 16:48:22 2016 +0300
@@ -178,44 +178,37 @@
 }
 
 void
-G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr, bool whole_heap) {
+G1SATBCardTableLoggingModRefBS::invalidate(MemRegion mr) {
   volatile jbyte* byte = byte_for(mr.start());
   jbyte* last_byte = byte_for(mr.last());
   Thread* thr = Thread::current();
-  if (whole_heap) {
-    while (byte <= last_byte) {
-      *byte = dirty_card;
-      byte++;
-    }
-  } else {
     // skip all consecutive young cards
-    for (; byte <= last_byte && *byte == g1_young_gen; byte++);
+  for (; byte <= last_byte && *byte == g1_young_gen; byte++);
 
-    if (byte <= last_byte) {
-      OrderAccess::storeload();
-      // Enqueue if necessary.
-      if (thr->is_Java_thread()) {
-        JavaThread* jt = (JavaThread*)thr;
-        for (; byte <= last_byte; byte++) {
-          if (*byte == g1_young_gen) {
-            continue;
-          }
-          if (*byte != dirty_card) {
-            *byte = dirty_card;
-            jt->dirty_card_queue().enqueue(byte);
-          }
+  if (byte <= last_byte) {
+    OrderAccess::storeload();
+    // Enqueue if necessary.
+    if (thr->is_Java_thread()) {
+      JavaThread* jt = (JavaThread*)thr;
+      for (; byte <= last_byte; byte++) {
+        if (*byte == g1_young_gen) {
+          continue;
         }
-      } else {
-        MutexLockerEx x(Shared_DirtyCardQ_lock,
-                        Mutex::_no_safepoint_check_flag);
-        for (; byte <= last_byte; byte++) {
-          if (*byte == g1_young_gen) {
-            continue;
-          }
-          if (*byte != dirty_card) {
-            *byte = dirty_card;
-            _dcqs.shared_dirty_card_queue()->enqueue(byte);
-          }
+        if (*byte != dirty_card) {
+          *byte = dirty_card;
+          jt->dirty_card_queue().enqueue(byte);
+        }
+      }
+    } else {
+      MutexLockerEx x(Shared_DirtyCardQ_lock,
+                      Mutex::_no_safepoint_check_flag);
+      for (; byte <= last_byte; byte++) {
+        if (*byte == g1_young_gen) {
+          continue;
+        }
+        if (*byte != dirty_card) {
+          *byte = dirty_card;
+          _dcqs.shared_dirty_card_queue()->enqueue(byte);
         }
       }
     }
--- a/src/share/vm/gc/g1/g1SATBCardTableModRefBS.hpp	Thu Nov 24 11:27:57 2016 +0100
+++ b/src/share/vm/gc/g1/g1SATBCardTableModRefBS.hpp	Thu Nov 24 16:48:22 2016 +0300
@@ -152,7 +152,7 @@
 
   // NB: if you do a whole-heap invalidation, the "usual invariant" defined
   // above no longer applies.
-  void invalidate(MemRegion mr, bool whole_heap = false);
+  void invalidate(MemRegion mr);
 
   void write_region_work(MemRegion mr)    { invalidate(mr); }
   void write_ref_array_work(MemRegion mr) { invalidate(mr); }
--- a/src/share/vm/gc/shared/cardTableModRefBS.cpp	Thu Nov 24 11:27:57 2016 +0100
+++ b/src/share/vm/gc/shared/cardTableModRefBS.cpp	Thu Nov 24 16:48:22 2016 +0300
@@ -380,7 +380,7 @@
   }
 }
 
-void CardTableModRefBS::invalidate(MemRegion mr, bool whole_heap) {
+void CardTableModRefBS::invalidate(MemRegion mr) {
   assert((HeapWord*)align_size_down((uintptr_t)mr.start(), HeapWordSize) == mr.start(), "Unaligned start");
   assert((HeapWord*)align_size_up  ((uintptr_t)mr.end(),   HeapWordSize) == mr.end(),   "Unaligned end"  );
   for (int i = 0; i < _cur_covered_regions; i++) {
--- a/src/share/vm/gc/shared/cardTableModRefBS.hpp	Thu Nov 24 11:27:57 2016 +0100
+++ b/src/share/vm/gc/shared/cardTableModRefBS.hpp	Thu Nov 24 16:48:22 2016 +0300
@@ -260,7 +260,7 @@
   }
 
   // ModRefBS functions.
-  virtual void invalidate(MemRegion mr, bool whole_heap = false);
+  virtual void invalidate(MemRegion mr);
   void clear(MemRegion mr);
   void dirty(MemRegion mr);
 
--- a/src/share/vm/gc/shared/cardTableRS.hpp	Thu Nov 24 11:27:57 2016 +0100
+++ b/src/share/vm/gc/shared/cardTableRS.hpp	Thu Nov 24 16:48:22 2016 +0300
@@ -159,8 +159,8 @@
   void clear(MemRegion mr) { _ct_bs->clear(mr); }
   void clear_into_younger(Generation* old_gen);
 
-  void invalidate(MemRegion mr, bool whole_heap = false) {
-    _ct_bs->invalidate(mr, whole_heap);
+  void invalidate(MemRegion mr) {
+    _ct_bs->invalidate(mr);
   }
   void invalidate_or_clear(Generation* old_gen);
 
--- a/src/share/vm/gc/shared/modRefBarrierSet.hpp	Thu Nov 24 11:27:57 2016 +0100
+++ b/src/share/vm/gc/shared/modRefBarrierSet.hpp	Thu Nov 24 16:48:22 2016 +0300
@@ -86,10 +86,8 @@
     assert(false, "can't call");
   }
 
-  // Causes all refs in "mr" to be assumed to be modified.  If "whole_heap"
-  // is true, the caller asserts that the entire heap is being invalidated,
-  // which may admit an optimized implementation for some barriers.
-  virtual void invalidate(MemRegion mr, bool whole_heap = false) = 0;
+  // Causes all refs in "mr" to be assumed to be modified.
+  virtual void invalidate(MemRegion mr) = 0;
 
   // The caller guarantees that "mr" contains no references.  (Perhaps it's
   // objects have been moved elsewhere.)