8287818: Shenandoah: adapt nmethod arming from Loom
Reviewed-by: shade
This commit is contained in:
parent
aa43824249
commit
549c6c22ae
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user