8164948: Initializing stores of HeapRegions are not ordered with regards to their use in G1ConcurrentMark
authortschatzl
Tue, 13 Sep 2016 11:32:45 +0200
changeset 41081 286019ba662d
parent 41080 5502eb75f1ad
child 41083 552f8d49cf88
child 41084 fc5db29fa08e
child 41086 06b10263e509
8164948: Initializing stores of HeapRegions are not ordered with regards to their use in G1ConcurrentMark Summary: Add a storestore barrier before publishing newly initialized HeapRegion instances, and place a loadload barrier before use of members. Reviewed-by: sjohanss, sangheki
hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp
hotspot/src/share/vm/gc/g1/heapRegionManager.cpp
--- a/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp	Mon Sep 12 18:59:13 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp	Tue Sep 13 11:32:45 2016 +0200
@@ -1904,7 +1904,8 @@
     assert(_g1h->is_in_g1_reserved(finger), "invariant");
 
     HeapRegion* curr_region = _g1h->heap_region_containing(finger);
-
+    // Make sure that the reads below do not float before loading curr_region.
+    OrderAccess::loadload();
     // Above heap_region_containing may return NULL as we always scan claim
     // until the end of the heap. In this case, just jump to the next region.
     HeapWord* end = curr_region != NULL ? curr_region->end() : finger + HeapRegion::GrainWords;
--- a/hotspot/src/share/vm/gc/g1/heapRegionManager.cpp	Mon Sep 12 18:59:13 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/heapRegionManager.cpp	Tue Sep 13 11:32:45 2016 +0200
@@ -123,6 +123,7 @@
   for (uint i = start; i < start + num_regions; i++) {
     if (_regions.get_by_index(i) == NULL) {
       HeapRegion* new_hr = new_heap_region(i);
+      OrderAccess::storestore();
       _regions.set_by_index(i, new_hr);
       _allocated_heapregions_length = MAX2(_allocated_heapregions_length, i + 1);
     }