Skip to content

Commit 549c6c2

Browse files
committedJun 28, 2022
8287818: Shenandoah: adapt nmethod arming from Loom
Reviewed-by: shade
1 parent aa43824 commit 549c6c2

5 files changed

+12
-48
lines changed
 

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

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2021, Red Hat, Inc. All rights reserved.
2+
* Copyright (c) 2013, 2022, Red Hat, Inc. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
2323
*/
2424

2525
#include "precompiled.hpp"
26-
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
26+
#include "gc/shared/barrierSetNMethod.hpp"
2727
#include "gc/shenandoah/shenandoahBarrierSetClone.inline.hpp"
2828
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
2929
#include "gc/shenandoah/shenandoahBarrierSetNMethod.hpp"
@@ -99,7 +99,11 @@ void ShenandoahBarrierSet::on_thread_attach(Thread *thread) {
9999
if (thread->is_Java_thread()) {
100100
ShenandoahThreadLocalData::set_gc_state(thread, _heap->gc_state());
101101
ShenandoahThreadLocalData::initialize_gclab(thread);
102-
ShenandoahThreadLocalData::set_disarmed_value(thread, ShenandoahCodeRoots::disarmed_value());
102+
103+
BarrierSetNMethod* bs_nm = barrier_set_nmethod();
104+
if (bs_nm != NULL) {
105+
thread->set_nmethod_disarm_value(bs_nm->disarmed_value());
106+
}
103107

104108
if (ShenandoahStackWatermarkBarrier) {
105109
JavaThread* const jt = JavaThread::cast(thread);

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

-12
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,3 @@ bool ShenandoahBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
7070
ShenandoahNMethod::disarm_nmethod(nm);
7171
return true;
7272
}
73-
74-
int ShenandoahBarrierSetNMethod::disarmed_value() const {
75-
return ShenandoahCodeRoots::disarmed_value();
76-
}
77-
78-
ByteSize ShenandoahBarrierSetNMethod::thread_disarmed_offset() const {
79-
return ShenandoahThreadLocalData::disarmed_value_offset();
80-
}
81-
82-
int* ShenandoahBarrierSetNMethod::disarmed_value_address() const {
83-
return ShenandoahCodeRoots::disarmed_value_address();
84-
}

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

+2-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, Red Hat, Inc. All rights reserved.
2+
* Copyright (c) 2019, 2022, Red Hat, Inc. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -35,16 +35,11 @@ class ShenandoahBarrierSetNMethod : public BarrierSetNMethod {
3535
private:
3636
ShenandoahHeap* _heap;
3737

38-
protected:
39-
virtual int disarmed_value() const;
40-
virtual bool nmethod_entry_barrier(nmethod* nm);
41-
4238
public:
4339
ShenandoahBarrierSetNMethod(ShenandoahHeap* heap) : _heap(heap) {
4440
}
4541

46-
virtual ByteSize thread_disarmed_offset() const;
47-
virtual int* disarmed_value_address() const;
42+
virtual bool nmethod_entry_barrier(nmethod* nm);
4843
};
4944

5045
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSETNMETHOD_HPP

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

+2-11
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,8 @@ void ShenandoahCodeRoots::flush_nmethod(nmethod* nm) {
126126
}
127127

128128
void ShenandoahCodeRoots::arm_nmethods() {
129-
assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
130-
_disarmed_value ++;
131-
// 0 is reserved for new nmethod
132-
if (_disarmed_value == 0) {
133-
_disarmed_value = 1;
134-
}
135-
136-
JavaThreadIteratorWithHandle jtiwh;
137-
for (JavaThread *thr = jtiwh.next(); thr != NULL; thr = jtiwh.next()) {
138-
ShenandoahThreadLocalData::set_disarmed_value(thr, _disarmed_value);
139-
}
129+
assert(BarrierSet::barrier_set()->barrier_set_nmethod() != NULL, "Sanity");
130+
BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
140131
}
141132

142133
class ShenandoahDisarmNMethodClosure : public NMethodClosure {

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

+1-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2020, Red Hat, Inc. All rights reserved.
2+
* Copyright (c) 2018, 2022, Red Hat, Inc. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,6 @@ class ShenandoahThreadLocalData {
4444
SATBMarkQueue _satb_mark_queue;
4545
PLAB* _gclab;
4646
size_t _gclab_size;
47-
int _disarmed_value;
4847
double _paced_time;
4948

5049
ShenandoahThreadLocalData() :
@@ -54,12 +53,7 @@ class ShenandoahThreadLocalData {
5453
_satb_mark_queue(&ShenandoahBarrierSet::satb_mark_queue_set()),
5554
_gclab(NULL),
5655
_gclab_size(0),
57-
_disarmed_value(0),
5856
_paced_time(0) {
59-
60-
// At least on x86_64, nmethod entry barrier encodes _disarmed_value offset
61-
// in instruction as disp8 immed
62-
assert(in_bytes(disarmed_value_offset()) < 128, "Offset range check");
6357
}
6458

6559
~ShenandoahThreadLocalData() {
@@ -129,10 +123,6 @@ class ShenandoahThreadLocalData {
129123
data(thread)->_paced_time = 0;
130124
}
131125

132-
static void set_disarmed_value(Thread* thread, int value) {
133-
data(thread)->_disarmed_value = value;
134-
}
135-
136126
// Evacuation OOM handling
137127
static bool is_oom_during_evac(Thread* thread) {
138128
return data(thread)->_oom_during_evac;
@@ -182,10 +172,6 @@ class ShenandoahThreadLocalData {
182172
static ByteSize gc_state_offset() {
183173
return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _gc_state);
184174
}
185-
186-
static ByteSize disarmed_value_offset() {
187-
return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _disarmed_value);
188-
}
189175
};
190176

191177
STATIC_ASSERT(sizeof(ShenandoahThreadLocalData) <= sizeof(GCThreadLocalData));

0 commit comments

Comments
 (0)
Please sign in to comment.