Skip to content

Commit ece9bdf

Browse files
committedSep 13, 2023
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

-1
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

-1
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

-1
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

+1-1
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

+22-3
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

+4-1
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

+4-7
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

+3-5
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

+1-3
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

+1-1
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);

‎src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ template <typename IsAlive, typename KeepAlive>
172172
void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAlive* keep_alive) {
173173
CodeBlobToOopClosure update_blobs(keep_alive, CodeBlobToOopClosure::FixRelocations);
174174
ShenandoahCodeBlobAndDisarmClosure blobs_and_disarm_Cl(keep_alive);
175-
CodeBlobToOopClosure* codes_cl = (ClassUnloading && ShenandoahNMethodBarrier) ?
175+
CodeBlobToOopClosure* codes_cl = ShenandoahCodeRoots::use_nmethod_barriers_for_mark() ?
176176
static_cast<CodeBlobToOopClosure*>(&blobs_and_disarm_Cl) :
177177
static_cast<CodeBlobToOopClosure*>(&update_blobs);
178178

‎src/hotspot/share/gc/shenandoah/shenandoahSTWMark.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,13 @@ ShenandoahSTWMark::ShenandoahSTWMark(bool full_gc) :
8989
}
9090

9191
void ShenandoahSTWMark::mark() {
92-
// Weak reference processing
9392
ShenandoahHeap* const heap = ShenandoahHeap::heap();
93+
94+
// Arm all nmethods. Even though this is STW mark, some marking code
95+
// piggybacks on nmethod barriers for special instances.
96+
ShenandoahCodeRoots::arm_nmethods_for_mark();
97+
98+
// Weak reference processing
9499
ShenandoahReferenceProcessor* rp = heap->ref_processor();
95100
rp->reset_thread_locals();
96101
rp->set_soft_reference_policy(heap->soft_ref_policy()->should_clear_all_soft_refs());
@@ -120,6 +125,9 @@ void ShenandoahSTWMark::mark() {
120125
heap->mark_complete_marking_context();
121126
end_mark();
122127

128+
// Mark is finished, can disarm the nmethods now.
129+
ShenandoahCodeRoots::disarm_nmethods();
130+
123131
assert(task_queues()->is_empty(), "Should be empty");
124132
TASKQUEUE_STATS_ONLY(task_queues()->print_taskqueue_stats());
125133
TASKQUEUE_STATS_ONLY(task_queues()->reset_taskqueue_stats());

‎src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp

-3
Original file line numberDiff line numberDiff line change
@@ -352,9 +352,6 @@
352352
product(bool, ShenandoahLoadRefBarrier, true, DIAGNOSTIC, \
353353
"Turn on/off load-reference barriers in Shenandoah") \
354354
\
355-
product(bool, ShenandoahNMethodBarrier, true, DIAGNOSTIC, \
356-
"Turn on/off NMethod entry barriers in Shenandoah") \
357-
\
358355
product(bool, ShenandoahStackWatermarkBarrier, true, DIAGNOSTIC, \
359356
"Turn on/off stack watermark barriers in Shenandoah") \
360357
\

‎test/hotspot/jtreg/gc/shenandoah/options/TestSelectiveBarrierFlags.java

-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ public static void main(String[] args) throws Exception {
5454
new String[] { "ShenandoahSATBBarrier", "ShenandoahIUBarrier" },
5555
new String[] { "ShenandoahCASBarrier" },
5656
new String[] { "ShenandoahCloneBarrier" },
57-
new String[] { "ShenandoahNMethodBarrier" },
5857
new String[] { "ShenandoahStackWatermarkBarrier" }
5958
};
6059

‎test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierDisable.java

-2
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,13 @@ public static void main(String[] args) throws Exception {
4242
"ShenandoahSATBBarrier",
4343
"ShenandoahCASBarrier",
4444
"ShenandoahCloneBarrier",
45-
"ShenandoahNMethodBarrier",
4645
"ShenandoahStackWatermarkBarrier",
4746
};
4847
String[] iu = {
4948
"ShenandoahLoadRefBarrier",
5049
"ShenandoahIUBarrier",
5150
"ShenandoahCASBarrier",
5251
"ShenandoahCloneBarrier",
53-
"ShenandoahNMethodBarrier",
5452
"ShenandoahStackWatermarkBarrier",
5553
};
5654

0 commit comments

Comments
 (0)
Please sign in to comment.