Skip to content

Commit fd00ed7

Browse files
committed
8256298: Shenandoah: Enable concurrent stack processing
Reviewed-by: rkennke, shade
1 parent b07797c commit fd00ed7

19 files changed

+517
-208
lines changed

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@
2424

2525
#include "precompiled.hpp"
2626
#include "gc/shenandoah/shenandoahAsserts.hpp"
27+
#include "gc/shenandoah/shenandoahClosures.inline.hpp"
2728
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
2829
#include "gc/shenandoah/shenandoahBarrierSetClone.inline.hpp"
2930
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
3031
#include "gc/shenandoah/shenandoahBarrierSetNMethod.hpp"
31-
#include "gc/shenandoah/shenandoahCollectorPolicy.hpp"
32-
#include "gc/shenandoah/shenandoahConcurrentRoots.hpp"
3332
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
34-
#include "gc/shenandoah/heuristics/shenandoahHeuristics.hpp"
33+
#include "gc/shenandoah/shenandoahStackWatermark.hpp"
3534
#include "memory/iterator.inline.hpp"
3635
#include "runtime/interfaceSupport.inline.hpp"
3736
#ifdef COMPILER1
@@ -112,6 +111,10 @@ void ShenandoahBarrierSet::on_thread_attach(Thread *thread) {
112111
ShenandoahThreadLocalData::set_gc_state(thread, _heap->gc_state());
113112
ShenandoahThreadLocalData::initialize_gclab(thread);
114113
ShenandoahThreadLocalData::set_disarmed_value(thread, ShenandoahCodeRoots::disarmed_value());
114+
115+
JavaThread* const jt = thread->as_Java_thread();
116+
StackWatermark* const watermark = new ShenandoahStackWatermark(jt);
117+
StackWatermarkSet::add_watermark(jt, watermark);
115118
}
116119
}
117120

@@ -123,6 +126,16 @@ void ShenandoahBarrierSet::on_thread_detach(Thread *thread) {
123126
if (gclab != NULL) {
124127
gclab->retire();
125128
}
129+
130+
// SATB protocol requires to keep alive reacheable oops from roots at the beginning of GC
131+
ShenandoahHeap* const heap = ShenandoahHeap::heap();
132+
if (heap->is_concurrent_mark_in_progress()) {
133+
ShenandoahKeepAliveClosure oops;
134+
StackWatermarkSet::finish_processing(thread->as_Java_thread(), &oops, StackWatermarkKind::gc);
135+
} else if (heap->is_concurrent_weak_root_in_progress() && heap->is_evacuation_in_progress()) {
136+
ShenandoahContextEvacuateUpdateRootsClosure oops;
137+
StackWatermarkSet::finish_processing(thread->as_Java_thread(), &oops, StackWatermarkKind::gc);
138+
}
126139
}
127140
}
128141

@@ -131,4 +144,3 @@ void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
131144
clone_barrier(src);
132145
}
133146
}
134-

src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "oops/accessDecorators.hpp"
2929
#include "runtime/handshake.hpp"
3030

31+
class ShenandoahBarrierSet;
3132
class ShenandoahHeap;
3233
class ShenandoahMarkingContext;
3334
class ShenandoahHeapRegionSet;
@@ -57,6 +58,18 @@ class ShenandoahIsAliveSelector : public StackObj {
5758
inline BoolObjectClosure* is_alive_closure();
5859
};
5960

61+
class ShenandoahKeepAliveClosure : public OopClosure {
62+
private:
63+
ShenandoahBarrierSet* const _bs;
64+
public:
65+
inline ShenandoahKeepAliveClosure();
66+
inline void do_oop(oop* p);
67+
inline void do_oop(narrowOop* p);
68+
private:
69+
template <typename T>
70+
void do_oop_work(T* p);
71+
};
72+
6073
class ShenandoahUpdateRefsClosure: public OopClosure {
6174
private:
6275
ShenandoahHeap* _heap;
@@ -70,12 +83,12 @@ class ShenandoahUpdateRefsClosure: public OopClosure {
7083
};
7184

7285
template <DecoratorSet MO = MO_UNORDERED>
73-
class ShenandoahEvacuateUpdateRootsClosure: public BasicOopIterateClosure {
86+
class ShenandoahEvacuateUpdateMetadataClosure: public BasicOopIterateClosure {
7487
private:
75-
ShenandoahHeap* _heap;
76-
Thread* _thread;
88+
ShenandoahHeap* const _heap;
89+
Thread* const _thread;
7790
public:
78-
inline ShenandoahEvacuateUpdateRootsClosure();
91+
inline ShenandoahEvacuateUpdateMetadataClosure();
7992
inline void do_oop(oop* p);
8093
inline void do_oop(narrowOop* p);
8194

@@ -84,12 +97,24 @@ class ShenandoahEvacuateUpdateRootsClosure: public BasicOopIterateClosure {
8497
inline void do_oop_work(T* p);
8598
};
8699

87-
class ShenandoahEvacUpdateOopStorageRootsClosure : public BasicOopIterateClosure {
100+
// Context free version, cannot cache calling thread
101+
class ShenandoahEvacuateUpdateRootsClosure : public BasicOopIterateClosure {
88102
private:
89-
ShenandoahHeap* _heap;
90-
Thread* _thread;
103+
ShenandoahHeap* const _heap;
104+
public:
105+
inline ShenandoahEvacuateUpdateRootsClosure();
106+
inline void do_oop(oop* p);
107+
inline void do_oop(narrowOop* p);
108+
protected:
109+
template <typename T>
110+
inline void do_oop_work(T* p, Thread* thr);
111+
};
112+
113+
class ShenandoahContextEvacuateUpdateRootsClosure : public ShenandoahEvacuateUpdateRootsClosure {
114+
private:
115+
Thread* const _thread;
91116
public:
92-
inline ShenandoahEvacUpdateOopStorageRootsClosure();
117+
inline ShenandoahContextEvacuateUpdateRootsClosure();
93118
inline void do_oop(oop* p);
94119
inline void do_oop(narrowOop* p);
95120
};

src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626

2727
#include "gc/shared/barrierSetNMethod.hpp"
2828
#include "gc/shenandoah/shenandoahAsserts.hpp"
29+
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
2930
#include "gc/shenandoah/shenandoahClosures.hpp"
31+
#include "gc/shenandoah/shenandoahEvacOOMHandler.inline.hpp"
3032
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
3133
#include "gc/shenandoah/shenandoahNMethod.inline.hpp"
3234
#include "oops/compressedOops.inline.hpp"
@@ -64,6 +66,30 @@ BoolObjectClosure* ShenandoahIsAliveSelector::is_alive_closure() {
6466
reinterpret_cast<BoolObjectClosure*>(&_alive_cl);
6567
}
6668

69+
ShenandoahKeepAliveClosure::ShenandoahKeepAliveClosure() :
70+
_bs(static_cast<ShenandoahBarrierSet*>(BarrierSet::barrier_set())) {
71+
}
72+
73+
void ShenandoahKeepAliveClosure::do_oop(oop* p) {
74+
do_oop_work(p);
75+
}
76+
77+
void ShenandoahKeepAliveClosure::do_oop(narrowOop* p) {
78+
do_oop_work(p);
79+
}
80+
81+
template <typename T>
82+
void ShenandoahKeepAliveClosure::do_oop_work(T* p) {
83+
assert(ShenandoahHeap::heap()->is_concurrent_mark_in_progress(), "Only for concurrent marking phase");
84+
assert(!ShenandoahHeap::heap()->has_forwarded_objects(), "Not expected");
85+
86+
T o = RawAccess<>::oop_load(p);
87+
if (!CompressedOops::is_null(o)) {
88+
oop obj = CompressedOops::decode_not_null(o);
89+
_bs->enqueue(obj);
90+
}
91+
}
92+
6793
ShenandoahUpdateRefsClosure::ShenandoahUpdateRefsClosure() :
6894
_heap(ShenandoahHeap::heap()) {
6995
}
@@ -81,16 +107,17 @@ void ShenandoahUpdateRefsClosure::do_oop(oop* p) { do_oop_work(p); }
81107
void ShenandoahUpdateRefsClosure::do_oop(narrowOop* p) { do_oop_work(p); }
82108

83109
template <DecoratorSet MO>
84-
ShenandoahEvacuateUpdateRootsClosure<MO>::ShenandoahEvacuateUpdateRootsClosure() :
110+
ShenandoahEvacuateUpdateMetadataClosure<MO>::ShenandoahEvacuateUpdateMetadataClosure() :
85111
_heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
86112
}
87113

88114
template <DecoratorSet MO>
89115
template <class T>
90-
void ShenandoahEvacuateUpdateRootsClosure<MO>::do_oop_work(T* p) {
116+
void ShenandoahEvacuateUpdateMetadataClosure<MO>::do_oop_work(T* p) {
91117
assert(_heap->is_concurrent_weak_root_in_progress() ||
92118
_heap->is_concurrent_strong_root_in_progress(),
93119
"Only do this in root processing phase");
120+
assert(_thread == Thread::current(), "Wrong thread");
94121

95122
T o = RawAccess<>::oop_load(p);
96123
if (! CompressedOops::is_null(o)) {
@@ -107,41 +134,64 @@ void ShenandoahEvacuateUpdateRootsClosure<MO>::do_oop_work(T* p) {
107134
}
108135
}
109136
template <DecoratorSet MO>
110-
void ShenandoahEvacuateUpdateRootsClosure<MO>::do_oop(oop* p) {
137+
void ShenandoahEvacuateUpdateMetadataClosure<MO>::do_oop(oop* p) {
111138
do_oop_work(p);
112139
}
113140

114141
template <DecoratorSet MO>
115-
void ShenandoahEvacuateUpdateRootsClosure<MO>::do_oop(narrowOop* p) {
142+
void ShenandoahEvacuateUpdateMetadataClosure<MO>::do_oop(narrowOop* p) {
116143
do_oop_work(p);
117144
}
118145

119-
ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
120-
_heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
146+
ShenandoahEvacuateUpdateRootsClosure::ShenandoahEvacuateUpdateRootsClosure() :
147+
_heap(ShenandoahHeap::heap()) {
121148
}
122149

123-
void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
150+
template <typename T>
151+
void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p, Thread* t) {
124152
assert(_heap->is_concurrent_weak_root_in_progress() ||
125153
_heap->is_concurrent_strong_root_in_progress(),
126154
"Only do this in root processing phase");
155+
assert(t == Thread::current(), "Wrong thread");
127156

128-
oop obj = RawAccess<>::oop_load(p);
129-
if (! CompressedOops::is_null(obj)) {
157+
T o = RawAccess<>::oop_load(p);
158+
if (!CompressedOops::is_null(o)) {
159+
oop obj = CompressedOops::decode_not_null(o);
130160
if (_heap->in_collection_set(obj)) {
131161
assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
132162
shenandoah_assert_marked(p, obj);
133163
oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
134164
if (resolved == obj) {
135-
resolved = _heap->evacuate_object(obj, _thread);
165+
resolved = _heap->evacuate_object(obj, t);
136166
}
137-
138-
Atomic::cmpxchg(p, obj, resolved);
167+
_heap->cas_oop(resolved, p, o);
139168
}
140169
}
141170
}
142171

143-
void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
144-
ShouldNotReachHere();
172+
void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) {
173+
ShenandoahEvacOOMScope scope;
174+
do_oop_work(p, Thread::current());
175+
}
176+
177+
void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
178+
ShenandoahEvacOOMScope scope;
179+
do_oop_work(p, Thread::current());
180+
}
181+
182+
ShenandoahContextEvacuateUpdateRootsClosure::ShenandoahContextEvacuateUpdateRootsClosure() :
183+
ShenandoahEvacuateUpdateRootsClosure(),
184+
_thread(Thread::current()) {
185+
}
186+
187+
void ShenandoahContextEvacuateUpdateRootsClosure::do_oop(oop* p) {
188+
ShenandoahEvacOOMScope scope;
189+
do_oop_work(p, _thread);
190+
}
191+
192+
void ShenandoahContextEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
193+
ShenandoahEvacOOMScope scope;
194+
do_oop_work(p, _thread);
145195
}
146196

147197
template <bool CONCURRENT, typename IsAlive, typename KeepAlive>

0 commit comments

Comments
 (0)