Skip to content

Commit cdb5342

Browse files
author
Kim Barrett
committed
8258252: Move PtrQueue enqueue to PtrQueueSet subclasses
Reviewed-by: tschatzl, rkennke
1 parent 17ace83 commit cdb5342

22 files changed

+251
-183
lines changed

src/hotspot/share/gc/g1/g1BarrierSet.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ G1BarrierSet::G1BarrierSet(G1CardTable* card_table) :
6565
void G1BarrierSet::enqueue(oop pre_val) {
6666
// Nulls should have been already filtered.
6767
assert(oopDesc::is_oop(pre_val, true), "Error");
68-
G1ThreadLocalData::satb_mark_queue(Thread::current()).enqueue(pre_val);
68+
SATBMarkQueue& queue = G1ThreadLocalData::satb_mark_queue(Thread::current());
69+
G1BarrierSet::satb_mark_queue_set().enqueue(queue, pre_val);
6970
}
7071

7172
template <class T> void
@@ -99,7 +100,8 @@ void G1BarrierSet::write_ref_field_post_slow(volatile CardValue* byte) {
99100
if (*byte != G1CardTable::dirty_card_val()) {
100101
*byte = G1CardTable::dirty_card_val();
101102
Thread* thr = Thread::current();
102-
G1ThreadLocalData::dirty_card_queue(thr).enqueue(byte);
103+
G1DirtyCardQueue& queue = G1ThreadLocalData::dirty_card_queue(thr);
104+
G1BarrierSet::dirty_card_queue_set().enqueue(queue, byte);
103105
}
104106
}
105107

@@ -116,13 +118,14 @@ void G1BarrierSet::invalidate(MemRegion mr) {
116118
OrderAccess::storeload();
117119
// Enqueue if necessary.
118120
Thread* thr = Thread::current();
121+
G1DirtyCardQueueSet& qset = G1BarrierSet::dirty_card_queue_set();
119122
G1DirtyCardQueue& queue = G1ThreadLocalData::dirty_card_queue(thr);
120123
for (; byte <= last_byte; byte++) {
121124
CardValue bv = *byte;
122125
if ((bv != G1CardTable::g1_young_card_val()) &&
123126
(bv != G1CardTable::dirty_card_val())) {
124127
*byte = G1CardTable::dirty_card_val();
125-
queue.enqueue(byte);
128+
qset.enqueue(queue, byte);
126129
}
127130
}
128131
}

src/hotspot/share/gc/g1/g1BarrierSetRuntime.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. 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
@@ -52,10 +52,13 @@ JRT_LEAF(void, G1BarrierSetRuntime::write_ref_field_pre_entry(oopDesc* orig, Jav
5252
}
5353
assert(oopDesc::is_oop(orig, true /* ignore mark word */), "Error");
5454
// store the original value that was in the field reference
55-
G1ThreadLocalData::satb_mark_queue(thread).enqueue(orig);
55+
SATBMarkQueue& queue = G1ThreadLocalData::satb_mark_queue(thread);
56+
G1BarrierSet::satb_mark_queue_set().enqueue(queue, orig);
5657
JRT_END
5758

5859
// G1 post write barrier slowpath
59-
JRT_LEAF(void, G1BarrierSetRuntime::write_ref_field_post_entry(void* card_addr, JavaThread* thread))
60-
G1ThreadLocalData::dirty_card_queue(thread).enqueue(card_addr);
60+
JRT_LEAF(void, G1BarrierSetRuntime::write_ref_field_post_entry(volatile G1CardTable::CardValue* card_addr,
61+
JavaThread* thread))
62+
G1DirtyCardQueue& queue = G1ThreadLocalData::dirty_card_queue(thread);
63+
G1BarrierSet::dirty_card_queue_set().enqueue(queue, card_addr);
6164
JRT_END

src/hotspot/share/gc/g1/g1BarrierSetRuntime.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. 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
@@ -25,7 +25,8 @@
2525
#ifndef SHARE_GC_G1_G1BARRIERSETRUNTIME_HPP
2626
#define SHARE_GC_G1_G1BARRIERSETRUNTIME_HPP
2727

28-
#include "memory/allocation.hpp"
28+
#include "gc/g1/g1CardTable.hpp"
29+
#include "memory/allStatic.hpp"
2930
#include "oops/oopsHierarchy.hpp"
3031
#include "utilities/globalDefinitions.hpp"
3132
#include "utilities/macros.hpp"
@@ -35,14 +36,16 @@ class JavaThread;
3536

3637
class G1BarrierSetRuntime: public AllStatic {
3738
public:
39+
using CardValue = G1CardTable::CardValue;
40+
3841
// Arraycopy stub generator
3942
static void write_ref_array_pre_oop_entry(oop* dst, size_t length);
4043
static void write_ref_array_pre_narrow_oop_entry(narrowOop* dst, size_t length);
4144
static void write_ref_array_post_entry(HeapWord* dst, size_t length);
4245

4346
// C2 slow-path runtime calls.
4447
static void write_ref_field_pre_entry(oopDesc* orig, JavaThread *thread);
45-
static void write_ref_field_post_entry(void* card_addr, JavaThread* thread);
48+
static void write_ref_field_post_entry(volatile CardValue* card_addr, JavaThread* thread);
4649
};
4750

4851
#endif // SHARE_GC_G1_G1BARRIERSETRUNTIME_HPP

src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424

2525
#include "precompiled.hpp"
26+
#include "gc/g1/g1BarrierSet.inline.hpp"
2627
#include "gc/g1/g1BufferNodeList.hpp"
2728
#include "gc/g1/g1CardTableEntryClosure.hpp"
2829
#include "gc/g1/g1CollectedHeap.inline.hpp"
@@ -71,14 +72,6 @@ void G1DirtyCardQueue::on_thread_detach() {
7172
dirty_card_qset()->record_detached_refinement_stats(_refinement_stats);
7273
}
7374

74-
void G1DirtyCardQueue::handle_completed_buffer() {
75-
assert(!is_empty(), "precondition");
76-
_refinement_stats->inc_dirtied_cards(size());
77-
BufferNode* node = BufferNode::make_node_from_buffer(_buf, index());
78-
allocate_buffer();
79-
dirty_card_qset()->handle_completed_buffer(node, _refinement_stats);
80-
}
81-
8275
// Assumed to be zero by concurrent threads.
8376
static uint par_ids_start() { return 0; }
8477

@@ -106,8 +99,28 @@ uint G1DirtyCardQueueSet::num_par_ids() {
10699
return (uint)os::initial_active_processor_count();
107100
}
108101

102+
void G1DirtyCardQueueSet::enqueue(G1DirtyCardQueue& queue,
103+
volatile CardValue* card_ptr) {
104+
CardValue* value = const_cast<CardValue*>(card_ptr);
105+
if (!try_enqueue(queue, value)) {
106+
handle_zero_index(queue);
107+
retry_enqueue(queue, value);
108+
}
109+
}
110+
111+
void G1DirtyCardQueueSet::handle_zero_index(G1DirtyCardQueue& queue) {
112+
assert(queue.index() == 0, "precondition");
113+
BufferNode* old_node = exchange_buffer_with_new(queue);
114+
if (old_node != nullptr) {
115+
G1ConcurrentRefineStats* stats = queue.refinement_stats();
116+
stats->inc_dirtied_cards(buffer_size());
117+
handle_completed_buffer(old_node, stats);
118+
}
119+
}
120+
109121
void G1DirtyCardQueueSet::handle_zero_index_for_thread(Thread* t) {
110-
G1ThreadLocalData::dirty_card_queue(t).handle_zero_index();
122+
G1DirtyCardQueue& queue = G1ThreadLocalData::dirty_card_queue(t);
123+
G1BarrierSet::dirty_card_queue_set().handle_zero_index(queue);
111124
}
112125

113126
#ifdef ASSERT

src/hotspot/share/gc/g1/g1DirtyCardQueue.hpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#include "gc/g1/g1BufferNodeList.hpp"
2929
#include "gc/g1/g1FreeIdSet.hpp"
30+
#include "gc/g1/g1CardTable.hpp"
3031
#include "gc/g1/g1ConcurrentRefineStats.hpp"
3132
#include "gc/shared/ptrQueue.hpp"
3233
#include "memory/allocation.hpp"
@@ -41,9 +42,6 @@ class Thread;
4142
class G1DirtyCardQueue: public PtrQueue {
4243
G1ConcurrentRefineStats* _refinement_stats;
4344

44-
protected:
45-
virtual void handle_completed_buffer();
46-
4745
public:
4846
G1DirtyCardQueue(G1DirtyCardQueueSet* qset);
4947

@@ -263,6 +261,19 @@ class G1DirtyCardQueueSet: public PtrQueueSet {
263261
// if none available.
264262
BufferNode* get_completed_buffer();
265263

264+
// Called when queue is full or has no buffer.
265+
void handle_zero_index(G1DirtyCardQueue& queue);
266+
267+
// Enqueue the buffer, and optionally perform refinement by the mutator.
268+
// Mutator refinement is only done by Java threads, and only if there
269+
// are more than max_cards (possibly padded) cards in the completed
270+
// buffers. Updates stats.
271+
//
272+
// Mutator refinement, if performed, stops processing a buffer if
273+
// SuspendibleThreadSet::should_yield(), recording the incompletely
274+
// processed buffer for later processing of the remainder.
275+
void handle_completed_buffer(BufferNode* node, G1ConcurrentRefineStats* stats);
276+
266277
public:
267278
G1DirtyCardQueueSet(BufferNode::Allocator* allocator);
268279
~G1DirtyCardQueueSet();
@@ -302,16 +313,8 @@ class G1DirtyCardQueueSet: public PtrQueueSet {
302313

303314
G1BufferNodeList take_all_completed_buffers();
304315

305-
// Helper for G1DirtyCardQueue::handle_completed_buffer().
306-
// Enqueue the buffer, and optionally perform refinement by the mutator.
307-
// Mutator refinement is only done by Java threads, and only if there
308-
// are more than max_cards (possibly padded) cards in the completed
309-
// buffers. Updates stats.
310-
//
311-
// Mutator refinement, if performed, stops processing a buffer if
312-
// SuspendibleThreadSet::should_yield(), recording the incompletely
313-
// processed buffer for later processing of the remainder.
314-
void handle_completed_buffer(BufferNode* node, G1ConcurrentRefineStats* stats);
316+
using CardValue = G1CardTable::CardValue;
317+
void enqueue(G1DirtyCardQueue& queue, volatile CardValue* card_ptr);
315318

316319
// If there are more than stop_at cards in the completed buffers, pop
317320
// a buffer, refine its contents, and return true. Otherwise return

src/hotspot/share/gc/g1/g1EvacFailure.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
class UpdateLogBuffersDeferred : public BasicOopIterateClosure {
4141
private:
4242
G1CollectedHeap* _g1h;
43+
G1RedirtyCardsLocalQueueSet* _rdc_local_qset;
4344
G1RedirtyCardsQueue* _rdcq;
4445
G1CardTable* _ct;
4546

@@ -48,8 +49,13 @@ class UpdateLogBuffersDeferred : public BasicOopIterateClosure {
4849
size_t _last_enqueued_card;
4950

5051
public:
51-
UpdateLogBuffersDeferred(G1RedirtyCardsQueue* rdcq) :
52-
_g1h(G1CollectedHeap::heap()), _rdcq(rdcq), _ct(_g1h->card_table()), _last_enqueued_card(SIZE_MAX) {}
52+
UpdateLogBuffersDeferred(G1RedirtyCardsLocalQueueSet* rdc_local_qset,
53+
G1RedirtyCardsQueue* rdcq) :
54+
_g1h(G1CollectedHeap::heap()),
55+
_rdc_local_qset(rdc_local_qset),
56+
_rdcq(rdcq),
57+
_ct(_g1h->card_table()),
58+
_last_enqueued_card(SIZE_MAX) {}
5359

5460
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
5561
virtual void do_oop( oop* p) { do_oop_work(p); }
@@ -67,7 +73,7 @@ class UpdateLogBuffersDeferred : public BasicOopIterateClosure {
6773
}
6874
size_t card_index = _ct->index_for(p);
6975
if (card_index != _last_enqueued_card) {
70-
_rdcq->enqueue(_ct->byte_for_index(card_index));
76+
_rdc_local_qset->enqueue(*_rdcq, _ct->byte_for_index(card_index));
7177
_last_enqueued_card = card_index;
7278
}
7379
}
@@ -209,7 +215,7 @@ class RemoveSelfForwardPtrHRClosure: public HeapRegionClosure {
209215
_worker_id(worker_id),
210216
_rdc_local_qset(rdcqs),
211217
_rdcq(&_rdc_local_qset),
212-
_log_buffer_cl(&_rdcq) {
218+
_log_buffer_cl(&_rdc_local_qset, &_rdcq) {
213219
}
214220

215221
~RemoveSelfForwardPtrHRClosure() {

src/hotspot/share/gc/g1/g1ParScanThreadState.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@ class G1ParScanThreadState : public CHeapObj<mtGC> {
8888
// Used to check whether string dedup should be applied to an object.
8989
Klass* _string_klass_or_null;
9090

91-
G1RedirtyCardsQueue& redirty_cards_queue() { return _rdcq; }
92-
G1CardTable* ct() { return _ct; }
91+
G1CardTable* ct() { return _ct; }
9392

9493
G1HeapRegionAttr dest(G1HeapRegionAttr original) const {
9594
assert(original.is_valid(),
@@ -149,7 +148,7 @@ class G1ParScanThreadState : public CHeapObj<mtGC> {
149148
size_t card_index = ct()->index_for(p);
150149
// If the card hasn't been added to the buffer, do it.
151150
if (_last_enqueued_card != card_index) {
152-
redirty_cards_queue().enqueue(ct()->byte_for_index(card_index));
151+
_rdc_local_qset.enqueue(_rdcq, ct()->byte_for_index(card_index));
153152
_last_enqueued_card = card_index;
154153
}
155154
}

src/hotspot/share/gc/g1/g1RedirtyCardsQueue.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#include "utilities/debug.hpp"
2929
#include "utilities/macros.hpp"
3030

31-
// G1RedirtyCardsQueueBase::LocalQSet
31+
// G1RedirtyCardsLocalQueueSet
3232

3333
G1RedirtyCardsLocalQueueSet::G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset) :
3434
PtrQueueSet(shared_qset->allocator()),
@@ -53,6 +53,16 @@ void G1RedirtyCardsLocalQueueSet::enqueue_completed_buffer(BufferNode* node) {
5353
}
5454
}
5555

56+
void G1RedirtyCardsLocalQueueSet::enqueue(G1RedirtyCardsQueue& queue, void* value) {
57+
if (!try_enqueue(queue, value)) {
58+
BufferNode* old_node = exchange_buffer_with_new(queue);
59+
if (old_node != nullptr) {
60+
enqueue_completed_buffer(old_node);
61+
}
62+
retry_enqueue(queue, value);
63+
}
64+
}
65+
5666
void G1RedirtyCardsLocalQueueSet::flush() {
5767
_shared_qset->add_bufferlist(_buffers);
5868
_buffers = G1BufferNodeList();
@@ -70,10 +80,6 @@ G1RedirtyCardsQueue::~G1RedirtyCardsQueue() {
7080
}
7181
#endif // ASSERT
7282

73-
void G1RedirtyCardsQueue::handle_completed_buffer() {
74-
enqueue_completed_buffer();
75-
}
76-
7783
void G1RedirtyCardsQueue::flush() {
7884
flush_impl();
7985
}

src/hotspot/share/gc/g1/g1RedirtyCardsQueue.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "gc/shared/ptrQueue.hpp"
3030
#include "memory/padded.hpp"
3131

32+
class G1RedirtyCardsQueue;
3233
class G1RedirtyCardsQueueSet;
3334

3435
// Provide G1RedirtyCardsQueue with a thread-local qset. It provides an
@@ -42,6 +43,8 @@ class G1RedirtyCardsLocalQueueSet : public PtrQueueSet {
4243
G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset);
4344
~G1RedirtyCardsLocalQueueSet() NOT_DEBUG(= default);
4445

46+
void enqueue(G1RedirtyCardsQueue& queue, void* value);
47+
4548
// Add the buffer to the local list.
4649
virtual void enqueue_completed_buffer(BufferNode* node);
4750

@@ -51,9 +54,6 @@ class G1RedirtyCardsLocalQueueSet : public PtrQueueSet {
5154

5255
// Worker-local queues of card table entries.
5356
class G1RedirtyCardsQueue : public PtrQueue {
54-
protected:
55-
virtual void handle_completed_buffer();
56-
5757
public:
5858
G1RedirtyCardsQueue(G1RedirtyCardsLocalQueueSet* qset);
5959
~G1RedirtyCardsQueue() NOT_DEBUG(= default);

src/hotspot/share/gc/g1/g1SATBMarkQueueSet.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. 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,6 +23,7 @@
2323
*/
2424

2525
#include "precompiled.hpp"
26+
#include "gc/g1/g1BarrierSet.inline.hpp"
2627
#include "gc/g1/g1CollectedHeap.inline.hpp"
2728
#include "gc/g1/g1SATBMarkQueueSet.hpp"
2829
#include "gc/g1/g1ThreadLocalData.hpp"
@@ -37,10 +38,11 @@ G1SATBMarkQueueSet::G1SATBMarkQueueSet(BufferNode::Allocator* allocator) :
3738
{}
3839

3940
void G1SATBMarkQueueSet::handle_zero_index_for_thread(Thread* t) {
40-
G1ThreadLocalData::satb_mark_queue(t).handle_zero_index();
41+
G1SATBMarkQueueSet& qset = G1BarrierSet::satb_mark_queue_set();
42+
qset.handle_zero_index(qset.satb_queue_for_thread(t));
4143
}
4244

43-
SATBMarkQueue& G1SATBMarkQueueSet::satb_queue_for_thread(Thread* const t) const{
45+
SATBMarkQueue& G1SATBMarkQueueSet::satb_queue_for_thread(Thread* const t) const {
4446
return G1ThreadLocalData::satb_mark_queue(t);
4547
}
4648

@@ -113,6 +115,6 @@ class G1SATBMarkQueueFilterFn {
113115
}
114116
};
115117

116-
void G1SATBMarkQueueSet::filter(SATBMarkQueue* queue) {
118+
void G1SATBMarkQueueSet::filter(SATBMarkQueue& queue) {
117119
apply_filter(G1SATBMarkQueueFilterFn(), queue);
118120
}

0 commit comments

Comments
 (0)