Skip to content

Commit ece9bdf

Browse files
committed
8299614: Shenandoah: STW mark should keep nmethod/oops referenced from stack chunk alive
Reviewed-by: rkennke, zgu
1 parent a36f5a5 commit ece9bdf

15 files changed

+46
-32
lines changed

src/hotspot/share/gc/shenandoah/mode/shenandoahIUMode.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ void ShenandoahIUMode::initialize_flags() const {
6060
SHENANDOAH_CHECK_FLAG_SET(ShenandoahIUBarrier);
6161
SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
6262
SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
63-
SHENANDOAH_CHECK_FLAG_SET(ShenandoahNMethodBarrier);
6463
SHENANDOAH_CHECK_FLAG_SET(ShenandoahStackWatermarkBarrier);
6564
}
6665

src/hotspot/share/gc/shenandoah/mode/shenandoahPassiveMode.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ void ShenandoahPassiveMode::initialize_flags() const {
5050
SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahIUBarrier);
5151
SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahCASBarrier);
5252
SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahCloneBarrier);
53-
SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahNMethodBarrier);
5453
SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahStackWatermarkBarrier);
5554

5655
// Final configuration checks

src/hotspot/share/gc/shenandoah/mode/shenandoahSATBMode.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ void ShenandoahSATBMode::initialize_flags() const {
4848
SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
4949
SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
5050
SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
51-
SHENANDOAH_CHECK_FLAG_SET(ShenandoahNMethodBarrier);
5251
SHENANDOAH_CHECK_FLAG_SET(ShenandoahStackWatermarkBarrier);
5352
}
5453

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ ShenandoahBarrierSet::ShenandoahBarrierSet(ShenandoahHeap* heap) :
4545
BarrierSet(make_barrier_set_assembler<ShenandoahBarrierSetAssembler>(),
4646
make_barrier_set_c1<ShenandoahBarrierSetC1>(),
4747
make_barrier_set_c2<ShenandoahBarrierSetC2>(),
48-
ShenandoahNMethodBarrier ? new ShenandoahBarrierSetNMethod(heap) : nullptr,
48+
new ShenandoahBarrierSetNMethod(heap),
4949
new ShenandoahBarrierSetStackChunk(),
5050
BarrierSet::FakeRtti(BarrierSet::ShenandoahBarrierSet)),
5151
_heap(heap),

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,20 @@ void ShenandoahParallelCodeHeapIterator::parallel_blobs_do(CodeBlobClosure* f) {
104104
ShenandoahNMethodTable* ShenandoahCodeRoots::_nmethod_table;
105105
int ShenandoahCodeRoots::_disarmed_value = 1;
106106

107+
bool ShenandoahCodeRoots::use_nmethod_barriers_for_mark() {
108+
// Continuations need nmethod barriers for scanning stack chunk nmethods.
109+
if (Continuations::enabled()) return true;
110+
111+
// Concurrent class unloading needs nmethod barriers.
112+
// When a nmethod is about to be executed, we need to make sure that all its
113+
// metadata are marked. The alternative is to remark thread roots at final mark
114+
// pause, which would cause latency issues.
115+
if (ShenandoahHeap::heap()->unload_classes()) return true;
116+
117+
// Otherwise, we can go without nmethod barriers.
118+
return false;
119+
}
120+
107121
void ShenandoahCodeRoots::initialize() {
108122
_nmethod_table = new ShenandoahNMethodTable();
109123
}
@@ -118,8 +132,13 @@ void ShenandoahCodeRoots::unregister_nmethod(nmethod* nm) {
118132
_nmethod_table->unregister_nmethod(nm);
119133
}
120134

121-
void ShenandoahCodeRoots::arm_nmethods() {
122-
assert(BarrierSet::barrier_set()->barrier_set_nmethod() != nullptr, "Sanity");
135+
void ShenandoahCodeRoots::arm_nmethods_for_mark() {
136+
if (use_nmethod_barriers_for_mark()) {
137+
BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
138+
}
139+
}
140+
141+
void ShenandoahCodeRoots::arm_nmethods_for_evac() {
123142
BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
124143
}
125144

@@ -163,7 +182,7 @@ class ShenandoahDisarmNMethodsTask : public WorkerTask {
163182
};
164183

165184
void ShenandoahCodeRoots::disarm_nmethods() {
166-
if (ShenandoahNMethodBarrier) {
185+
if (use_nmethod_barriers_for_mark()) {
167186
ShenandoahDisarmNMethodsTask task;
168187
ShenandoahHeap::heap()->workers()->run_task(&task);
169188
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,14 @@ class ShenandoahCodeRoots : public AllStatic {
9797
// Concurrent nmethod unloading support
9898
static void unlink(WorkerThreads* workers, bool unloading_occurred);
9999
static void purge();
100-
static void arm_nmethods();
100+
static void arm_nmethods_for_mark();
101+
static void arm_nmethods_for_evac();
101102
static void disarm_nmethods();
102103
static int disarmed_value() { return _disarmed_value; }
103104
static int* disarmed_value_address() { return &_disarmed_value; }
104105

106+
static bool use_nmethod_barriers_for_mark();
107+
105108
private:
106109
static ShenandoahNMethodTable* _nmethod_table;
107110
static int _disarmed_value;

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -545,12 +545,9 @@ void ShenandoahConcurrentGC::op_init_mark() {
545545

546546
// Make above changes visible to worker threads
547547
OrderAccess::fence();
548-
// Arm nmethods for concurrent marking. When a nmethod is about to be executed,
549-
// we need to make sure that all its metadata are marked. alternative is to remark
550-
// thread roots at final mark pause, but it can be potential latency killer.
551-
if (heap->unload_classes()) {
552-
ShenandoahCodeRoots::arm_nmethods();
553-
}
548+
549+
// Arm nmethods for concurrent mark
550+
ShenandoahCodeRoots::arm_nmethods_for_mark();
554551

555552
ShenandoahStackWatermark::change_epoch_id();
556553
if (ShenandoahPacing) {
@@ -603,7 +600,7 @@ void ShenandoahConcurrentGC::op_final_mark() {
603600
}
604601

605602
// Arm nmethods/stack for concurrent processing
606-
ShenandoahCodeRoots::arm_nmethods();
603+
ShenandoahCodeRoots::arm_nmethods_for_evac();
607604
ShenandoahStackWatermark::change_epoch_id();
608605

609606
if (ShenandoahPacing) {

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,9 @@ void ShenandoahDegenGC::op_degenerated() {
181181
assert(!heap->cancelled_gc(), "STW reference update can not OOM");
182182
}
183183

184-
if (ClassUnloading) {
185-
// Disarm nmethods that armed in concurrent cycle.
186-
// In above case, update roots should disarm them
187-
ShenandoahCodeRoots::disarm_nmethods();
188-
}
184+
// Disarm nmethods that armed in concurrent cycle.
185+
// In above case, update roots should disarm them
186+
ShenandoahCodeRoots::disarm_nmethods();
189187

190188
op_cleanup_complete();
191189
break;

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,7 @@ void ShenandoahNMethod::heal_nmethod_metadata(ShenandoahNMethod* nmethod_data) {
8080

8181
void ShenandoahNMethod::disarm_nmethod(nmethod* nm) {
8282
BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod();
83-
assert(bs != nullptr || !ShenandoahNMethodBarrier,
84-
"Must have nmethod barrier for concurrent GC");
85-
if (bs != nullptr && bs->is_armed(nm)) {
83+
if (bs->is_armed(nm)) {
8684
bs->disarm(nm);
8785
}
8886
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTi
206206
void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
207207
CodeBlobToOopClosure code_blob_cl(oops, CodeBlobToOopClosure::FixRelocations);
208208
ShenandoahCodeBlobAndDisarmClosure blobs_and_disarm_Cl(oops);
209-
CodeBlobToOopClosure* adjust_code_closure = (ClassUnloading && ShenandoahNMethodBarrier) ?
209+
CodeBlobToOopClosure* adjust_code_closure = ShenandoahCodeRoots::use_nmethod_barriers_for_mark() ?
210210
static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) :
211211
static_cast<CodeBlobToOopClosure*>(&code_blob_cl);
212212
CLDToOopClosure adjust_cld_closure(oops, ClassLoaderData::_claim_strong);

0 commit comments

Comments
 (0)