8164948: Initializing stores of HeapRegions are not ordered with regards to their use in G1ConcurrentMark

Add a storestore barrier before publishing newly initialized HeapRegion instances, and place a loadload barrier before use of members.

Reviewed-by: sjohanss, sangheki
This commit is contained in:
Thomas Schatzl 2016-09-13 11:32:45 +02:00
parent e3245f1900
commit c719b0171c
2 changed files with 3 additions and 1 deletions

@ -1904,7 +1904,8 @@ G1ConcurrentMark::claim_region(uint worker_id) {
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;

@ -123,6 +123,7 @@ void HeapRegionManager::make_regions_available(uint start, uint num_regions) {
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);
}