Skip to content

Commit 5ad1e22

Browse files
committed
8256658: Shenandoah: Deadlock between nmethod_entry_barrier and concurrent code root evacuator
Reviewed-by: rkennke
1 parent cc0ed40 commit 5ad1e22

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,9 @@ class ShenandoahEvacUpdateCodeCacheClosure : public NMethodClosure {
18511851
void do_nmethod(nmethod* n) {
18521852
ShenandoahNMethod* data = ShenandoahNMethod::gc_data(n);
18531853
ShenandoahReentrantLocker locker(data->lock());
1854+
// Setup EvacOOM scope below reentrant lock to avoid deadlock with
1855+
// nmethod_entry_barrier
1856+
ShenandoahEvacOOMScope oom;
18541857
data->oops_do(&_cl, true/*fix relocation*/);
18551858
_bs->disarm(n);
18561859
}
@@ -1887,20 +1890,23 @@ class ShenandoahConcurrentRootsEvacUpdateTask : public AbstractGangTask {
18871890

18881891
void work(uint worker_id) {
18891892
ShenandoahConcurrentWorkerSession worker_session(worker_id);
1890-
ShenandoahEvacOOMScope oom;
18911893
{
1892-
// vm_roots and weak_roots are OopStorage backed roots, concurrent iteration
1893-
// may race against OopStorage::release() calls.
1894-
ShenandoahEvacUpdateOopStorageRootsClosure cl;
1895-
_vm_roots.oops_do<ShenandoahEvacUpdateOopStorageRootsClosure>(&cl, worker_id);
1896-
}
1894+
ShenandoahEvacOOMScope oom;
1895+
{
1896+
// vm_roots and weak_roots are OopStorage backed roots, concurrent iteration
1897+
// may race against OopStorage::release() calls.
1898+
ShenandoahEvacUpdateOopStorageRootsClosure cl;
1899+
_vm_roots.oops_do<ShenandoahEvacUpdateOopStorageRootsClosure>(&cl, worker_id);
1900+
}
18971901

1898-
{
1899-
ShenandoahEvacuateUpdateRootsClosure<> cl;
1900-
CLDToOopClosure clds(&cl, ClassLoaderData::_claim_strong);
1901-
_cld_roots.cld_do(&clds, worker_id);
1902+
{
1903+
ShenandoahEvacuateUpdateRootsClosure<> cl;
1904+
CLDToOopClosure clds(&cl, ClassLoaderData::_claim_strong);
1905+
_cld_roots.cld_do(&clds, worker_id);
1906+
}
19021907
}
19031908

1909+
// Cannot setup ShenandoahEvacOOMScope here, due to potential deadlock with nmethod_entry_barrier.
19041910
if (_process_codecache) {
19051911
ShenandoahWorkerTimingsTracker timer(_phase, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
19061912
ShenandoahEvacUpdateCodeCacheClosure cl;

0 commit comments

Comments
 (0)