src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp

Tue, 30 Sep 2014 09:44:36 +0200

author
tschatzl
date
Tue, 30 Sep 2014 09:44:36 +0200
changeset 7218
6948da6d7c13
parent 7049
eec72fa4b108
child 7535
7ae4e26cb1e0
permissions
-rw-r--r--

8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
Summary: Remove -XX:-G1DeferredRSUpdate functionality as it is racy. During evacuation failure handling, threads where evacuation failure handling occurred may try to add remembered sets to regions which remembered sets are currently being scanned. The iterator to handle the remembered set scan does not support addition of entries during scan and so may skip valid references.
Reviewed-by: iveresov, brutisso, mgerdin

ysr@777 1 /*
johnc@3466 2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1REMSET_INLINE_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1REMSET_INLINE_HPP
stefank@2314 27
stefank@2314 28 #include "gc_implementation/g1/g1RemSet.hpp"
tschatzl@6937 29 #include "gc_implementation/g1/heapRegion.hpp"
stefank@2314 30 #include "gc_implementation/g1/heapRegionRemSet.hpp"
stefank@2314 31 #include "oops/oop.inline.hpp"
stefank@2314 32
jmasa@3357 33 inline uint G1RemSet::n_workers() {
ysr@777 34 if (_g1->workers() != NULL) {
ysr@777 35 return _g1->workers()->total_workers();
ysr@777 36 } else {
ysr@777 37 return 1;
ysr@777 38 }
ysr@777 39 }
ysr@777 40
johnc@2216 41 template <class T>
johnc@2302 42 inline void G1RemSet::write_ref(HeapRegion* from, T* p) {
johnc@2302 43 par_write_ref(from, p, 0);
ysr@777 44 }
ysr@777 45
johnc@2216 46 template <class T>
johnc@2302 47 inline void G1RemSet::par_write_ref(HeapRegion* from, T* p, int tid) {
ysr@1280 48 oop obj = oopDesc::load_decode_heap_oop(p);
brutisso@7049 49 if (obj == NULL) {
brutisso@7049 50 return;
brutisso@7049 51 }
brutisso@7049 52
ysr@777 53 #ifdef ASSERT
ysr@777 54 // can't do because of races
ysr@777 55 // assert(obj == NULL || obj->is_oop(), "expected an oop");
ysr@777 56
ysr@777 57 // Do the safe subset of is_oop
ysr@777 58 #ifdef CHECK_UNHANDLED_OOPS
brutisso@7049 59 oopDesc* o = obj.obj();
ysr@777 60 #else
brutisso@7049 61 oopDesc* o = obj;
ysr@777 62 #endif // CHECK_UNHANDLED_OOPS
brutisso@7049 63 assert((intptr_t)o % MinObjAlignmentInBytes == 0, "not oop aligned");
brutisso@7049 64 assert(Universe::heap()->is_in_reserved(obj), "must be in heap");
ysr@777 65 #endif // ASSERT
johnc@2060 66
johnc@2060 67 assert(from == NULL || from->is_in_reserved(p), "p is not in from");
johnc@2060 68
ysr@777 69 HeapRegion* to = _g1->heap_region_containing(obj);
brutisso@7049 70 if (from != to) {
johnc@2302 71 assert(to->rem_set() != NULL, "Need per-region 'into' remsets.");
johnc@2302 72 to->rem_set()->add_reference(p, tid);
ysr@777 73 }
ysr@777 74 }
apetrusenko@1061 75
johnc@2216 76 template <class T>
johnc@2216 77 inline void UpdateRSOopClosure::do_oop_work(T* p) {
apetrusenko@1061 78 assert(_from != NULL, "from region must be non-NULL");
apetrusenko@1061 79 _rs->par_write_ref(_from, p, _worker_i);
apetrusenko@1061 80 }
johnc@2060 81
stefank@2314 82 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1REMSET_INLINE_HPP

mercurial