8287818: Shenandoah: adapt nmethod arming from Loom

Reviewed-by: shade
This commit is contained in:
Zhengyu Gu 2022-06-28 12:16:55 +00:00
parent aa43824249
commit 549c6c22ae
5 changed files with 12 additions and 48 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2021, Red Hat, Inc. All rights reserved.
* Copyright (c) 2013, 2022, Red Hat, Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,7 +23,7 @@
*/
#include "precompiled.hpp"
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
#include "gc/shared/barrierSetNMethod.hpp"
#include "gc/shenandoah/shenandoahBarrierSetClone.inline.hpp"
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
#include "gc/shenandoah/shenandoahBarrierSetNMethod.hpp"
@ -99,7 +99,11 @@ void ShenandoahBarrierSet::on_thread_attach(Thread *thread) {
if (thread->is_Java_thread()) {
ShenandoahThreadLocalData::set_gc_state(thread, _heap->gc_state());
ShenandoahThreadLocalData::initialize_gclab(thread);
ShenandoahThreadLocalData::set_disarmed_value(thread, ShenandoahCodeRoots::disarmed_value());
BarrierSetNMethod* bs_nm = barrier_set_nmethod();
if (bs_nm != NULL) {
thread->set_nmethod_disarm_value(bs_nm->disarmed_value());
}
if (ShenandoahStackWatermarkBarrier) {
JavaThread* const jt = JavaThread::cast(thread);

View File

@ -70,15 +70,3 @@ bool ShenandoahBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
ShenandoahNMethod::disarm_nmethod(nm);
return true;
}
int ShenandoahBarrierSetNMethod::disarmed_value() const {
return ShenandoahCodeRoots::disarmed_value();
}
ByteSize ShenandoahBarrierSetNMethod::thread_disarmed_offset() const {
return ShenandoahThreadLocalData::disarmed_value_offset();
}
int* ShenandoahBarrierSetNMethod::disarmed_value_address() const {
return ShenandoahCodeRoots::disarmed_value_address();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019, Red Hat, Inc. All rights reserved.
* Copyright (c) 2019, 2022, Red Hat, Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -35,16 +35,11 @@ class ShenandoahBarrierSetNMethod : public BarrierSetNMethod {
private:
ShenandoahHeap* _heap;
protected:
virtual int disarmed_value() const;
virtual bool nmethod_entry_barrier(nmethod* nm);
public:
ShenandoahBarrierSetNMethod(ShenandoahHeap* heap) : _heap(heap) {
}
virtual ByteSize thread_disarmed_offset() const;
virtual int* disarmed_value_address() const;
virtual bool nmethod_entry_barrier(nmethod* nm);
};
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSETNMETHOD_HPP

View File

@ -126,17 +126,8 @@ void ShenandoahCodeRoots::flush_nmethod(nmethod* nm) {
}
void ShenandoahCodeRoots::arm_nmethods() {
assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
_disarmed_value ++;
// 0 is reserved for new nmethod
if (_disarmed_value == 0) {
_disarmed_value = 1;
}
JavaThreadIteratorWithHandle jtiwh;
for (JavaThread *thr = jtiwh.next(); thr != NULL; thr = jtiwh.next()) {
ShenandoahThreadLocalData::set_disarmed_value(thr, _disarmed_value);
}
assert(BarrierSet::barrier_set()->barrier_set_nmethod() != NULL, "Sanity");
BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
}
class ShenandoahDisarmNMethodClosure : public NMethodClosure {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018, 2020, Red Hat, Inc. All rights reserved.
* Copyright (c) 2018, 2022, Red Hat, Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -44,7 +44,6 @@ private:
SATBMarkQueue _satb_mark_queue;
PLAB* _gclab;
size_t _gclab_size;
int _disarmed_value;
double _paced_time;
ShenandoahThreadLocalData() :
@ -54,12 +53,7 @@ private:
_satb_mark_queue(&ShenandoahBarrierSet::satb_mark_queue_set()),
_gclab(NULL),
_gclab_size(0),
_disarmed_value(0),
_paced_time(0) {
// At least on x86_64, nmethod entry barrier encodes _disarmed_value offset
// in instruction as disp8 immed
assert(in_bytes(disarmed_value_offset()) < 128, "Offset range check");
}
~ShenandoahThreadLocalData() {
@ -129,10 +123,6 @@ public:
data(thread)->_paced_time = 0;
}
static void set_disarmed_value(Thread* thread, int value) {
data(thread)->_disarmed_value = value;
}
// Evacuation OOM handling
static bool is_oom_during_evac(Thread* thread) {
return data(thread)->_oom_during_evac;
@ -182,10 +172,6 @@ public:
static ByteSize gc_state_offset() {
return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _gc_state);
}
static ByteSize disarmed_value_offset() {
return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _disarmed_value);
}
};
STATIC_ASSERT(sizeof(ShenandoahThreadLocalData) <= sizeof(GCThreadLocalData));