Skip to content

Commit

Permalink
8287818: Shenandoah: adapt nmethod arming from Loom
Browse files Browse the repository at this point in the history
Reviewed-by: shade
  • Loading branch information
zhengyu123 committed Jun 28, 2022
1 parent aa43824 commit 549c6c2
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 48 deletions.
10 changes: 7 additions & 3 deletions src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
@@ -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
Expand All @@ -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"
Expand Down Expand Up @@ -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);
Expand Down
12 changes: 0 additions & 12 deletions src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp
Expand Up @@ -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
Expand Down Expand Up @@ -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
13 changes: 2 additions & 11 deletions src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
Expand Up @@ -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 {
Expand Down
16 changes: 1 addition & 15 deletions src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp
@@ -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
Expand Down Expand Up @@ -44,7 +44,6 @@ class ShenandoahThreadLocalData {
SATBMarkQueue _satb_mark_queue;
PLAB* _gclab;
size_t _gclab_size;
int _disarmed_value;
double _paced_time;

ShenandoahThreadLocalData() :
Expand All @@ -54,12 +53,7 @@ class ShenandoahThreadLocalData {
_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() {
Expand Down Expand Up @@ -129,10 +123,6 @@ class ShenandoahThreadLocalData {
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;
Expand Down Expand Up @@ -182,10 +172,6 @@ class ShenandoahThreadLocalData {
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));
Expand Down

1 comment on commit 549c6c2

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.