8258508: Merge G1RedirtyCardsQueue into qset

Reviewed-by: tschatzl, iwalulya
This commit is contained in:
Kim Barrett 2021-02-03 00:52:09 +00:00
parent bec60432ec
commit d423d368e7
5 changed files with 29 additions and 43 deletions

@ -41,7 +41,6 @@ class UpdateLogBuffersDeferred : public BasicOopIterateClosure {
private: private:
G1CollectedHeap* _g1h; G1CollectedHeap* _g1h;
G1RedirtyCardsLocalQueueSet* _rdc_local_qset; G1RedirtyCardsLocalQueueSet* _rdc_local_qset;
G1RedirtyCardsQueue* _rdcq;
G1CardTable* _ct; G1CardTable* _ct;
// Remember the last enqueued card to avoid enqueuing the same card over and over; // Remember the last enqueued card to avoid enqueuing the same card over and over;
@ -49,11 +48,9 @@ private:
size_t _last_enqueued_card; size_t _last_enqueued_card;
public: public:
UpdateLogBuffersDeferred(G1RedirtyCardsLocalQueueSet* rdc_local_qset, UpdateLogBuffersDeferred(G1RedirtyCardsLocalQueueSet* rdc_local_qset) :
G1RedirtyCardsQueue* rdcq) :
_g1h(G1CollectedHeap::heap()), _g1h(G1CollectedHeap::heap()),
_rdc_local_qset(rdc_local_qset), _rdc_local_qset(rdc_local_qset),
_rdcq(rdcq),
_ct(_g1h->card_table()), _ct(_g1h->card_table()),
_last_enqueued_card(SIZE_MAX) {} _last_enqueued_card(SIZE_MAX) {}
@ -73,7 +70,7 @@ public:
} }
size_t card_index = _ct->index_for(p); size_t card_index = _ct->index_for(p);
if (card_index != _last_enqueued_card) { if (card_index != _last_enqueued_card) {
_rdc_local_qset->enqueue(*_rdcq, _ct->byte_for_index(card_index)); _rdc_local_qset->enqueue(_ct->byte_for_index(card_index));
_last_enqueued_card = card_index; _last_enqueued_card = card_index;
} }
} }
@ -206,7 +203,6 @@ class RemoveSelfForwardPtrHRClosure: public HeapRegionClosure {
uint _worker_id; uint _worker_id;
G1RedirtyCardsLocalQueueSet _rdc_local_qset; G1RedirtyCardsLocalQueueSet _rdc_local_qset;
G1RedirtyCardsQueue _rdcq;
UpdateLogBuffersDeferred _log_buffer_cl; UpdateLogBuffersDeferred _log_buffer_cl;
public: public:
@ -214,12 +210,10 @@ public:
_g1h(G1CollectedHeap::heap()), _g1h(G1CollectedHeap::heap()),
_worker_id(worker_id), _worker_id(worker_id),
_rdc_local_qset(rdcqs), _rdc_local_qset(rdcqs),
_rdcq(&_rdc_local_qset), _log_buffer_cl(&_rdc_local_qset) {
_log_buffer_cl(&_rdc_local_qset, &_rdcq) {
} }
~RemoveSelfForwardPtrHRClosure() { ~RemoveSelfForwardPtrHRClosure() {
_rdc_local_qset.flush_queue(_rdcq);
_rdc_local_qset.flush(); _rdc_local_qset.flush();
} }

@ -59,7 +59,6 @@ G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h,
: _g1h(g1h), : _g1h(g1h),
_task_queue(g1h->task_queue(worker_id)), _task_queue(g1h->task_queue(worker_id)),
_rdc_local_qset(rdcqs), _rdc_local_qset(rdcqs),
_rdcq(&_rdc_local_qset),
_ct(g1h->card_table()), _ct(g1h->card_table()),
_closures(NULL), _closures(NULL),
_plab_allocator(NULL), _plab_allocator(NULL),
@ -114,7 +113,6 @@ G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h,
} }
size_t G1ParScanThreadState::flush(size_t* surviving_young_words) { size_t G1ParScanThreadState::flush(size_t* surviving_young_words) {
_rdc_local_qset.flush_queue(_rdcq);
_rdc_local_qset.flush(); _rdc_local_qset.flush();
flush_numa_stats(); flush_numa_stats();
// Update allocation statistics. // Update allocation statistics.

@ -49,7 +49,6 @@ class G1ParScanThreadState : public CHeapObj<mtGC> {
G1CollectedHeap* _g1h; G1CollectedHeap* _g1h;
G1ScannerTasksQueue* _task_queue; G1ScannerTasksQueue* _task_queue;
G1RedirtyCardsLocalQueueSet _rdc_local_qset; G1RedirtyCardsLocalQueueSet _rdc_local_qset;
G1RedirtyCardsQueue _rdcq;
G1CardTable* _ct; G1CardTable* _ct;
G1EvacuationRootClosures* _closures; G1EvacuationRootClosures* _closures;
@ -148,7 +147,7 @@ public:
size_t card_index = ct()->index_for(p); size_t card_index = ct()->index_for(p);
// If the card hasn't been added to the buffer, do it. // If the card hasn't been added to the buffer, do it.
if (_last_enqueued_card != card_index) { if (_last_enqueued_card != card_index) {
_rdc_local_qset.enqueue(_rdcq, ct()->byte_for_index(card_index)); _rdc_local_qset.enqueue(ct()->byte_for_index(card_index));
_last_enqueued_card = card_index; _last_enqueued_card = card_index;
} }
} }

@ -33,7 +33,8 @@
G1RedirtyCardsLocalQueueSet::G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset) : G1RedirtyCardsLocalQueueSet::G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset) :
PtrQueueSet(shared_qset->allocator()), PtrQueueSet(shared_qset->allocator()),
_shared_qset(shared_qset), _shared_qset(shared_qset),
_buffers() _buffers(),
_queue(this)
{} {}
#ifdef ASSERT #ifdef ASSERT
@ -53,33 +54,30 @@ void G1RedirtyCardsLocalQueueSet::enqueue_completed_buffer(BufferNode* node) {
} }
} }
void G1RedirtyCardsLocalQueueSet::enqueue(G1RedirtyCardsQueue& queue, void* value) { void G1RedirtyCardsLocalQueueSet::enqueue(void* value) {
if (!try_enqueue(queue, value)) { if (!try_enqueue(_queue, value)) {
BufferNode* old_node = exchange_buffer_with_new(queue); BufferNode* old_node = exchange_buffer_with_new(_queue);
if (old_node != nullptr) { if (old_node != nullptr) {
enqueue_completed_buffer(old_node); enqueue_completed_buffer(old_node);
} }
retry_enqueue(queue, value); retry_enqueue(_queue, value);
} }
} }
void G1RedirtyCardsLocalQueueSet::flush() { void G1RedirtyCardsLocalQueueSet::flush() {
flush_queue(_queue);
_shared_qset->add_bufferlist(_buffers); _shared_qset->add_bufferlist(_buffers);
_buffers = G1BufferNodeList(); _buffers = G1BufferNodeList();
} }
void G1RedirtyCardsLocalQueueSet::flush_queue(G1RedirtyCardsQueue& queue) { // G1RedirtyCardsLocalQueueSet::Queue
PtrQueueSet::flush_queue(queue);
}
// G1RedirtyCardsQueue G1RedirtyCardsLocalQueueSet::Queue::Queue(G1RedirtyCardsLocalQueueSet* qset) :
G1RedirtyCardsQueue::G1RedirtyCardsQueue(G1RedirtyCardsLocalQueueSet* qset) :
PtrQueue(qset) PtrQueue(qset)
{} {}
#ifdef ASSERT #ifdef ASSERT
G1RedirtyCardsQueue::~G1RedirtyCardsQueue() { G1RedirtyCardsLocalQueueSet::Queue::~Queue() {
assert(buffer() == nullptr, "unflushed queue"); assert(buffer() == nullptr, "unflushed queue");
} }
#endif // ASSERT #endif // ASSERT

@ -28,37 +28,34 @@
#include "gc/g1/g1BufferNodeList.hpp" #include "gc/g1/g1BufferNodeList.hpp"
#include "gc/shared/ptrQueue.hpp" #include "gc/shared/ptrQueue.hpp"
#include "memory/padded.hpp" #include "memory/padded.hpp"
#include "utilities/macros.hpp"
class G1RedirtyCardsQueue;
class G1RedirtyCardsQueueSet; class G1RedirtyCardsQueueSet;
// Provide G1RedirtyCardsQueue with a thread-local qset. It provides an // A thread-local qset and queue. It provides an uncontended staging
// uncontended staging area for completed buffers, to be flushed to the // area for completed buffers, to be flushed to the shared qset en masse.
// shared qset en masse. class G1RedirtyCardsLocalQueueSet : private PtrQueueSet {
class G1RedirtyCardsLocalQueueSet : public PtrQueueSet { class Queue : public PtrQueue {
public:
Queue(G1RedirtyCardsLocalQueueSet* qset);
~Queue() NOT_DEBUG(= default);
};
G1RedirtyCardsQueueSet* _shared_qset; G1RedirtyCardsQueueSet* _shared_qset;
G1BufferNodeList _buffers; G1BufferNodeList _buffers;
Queue _queue;
// Add the buffer to the local list.
virtual void enqueue_completed_buffer(BufferNode* node);
public: public:
G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset); G1RedirtyCardsLocalQueueSet(G1RedirtyCardsQueueSet* shared_qset);
~G1RedirtyCardsLocalQueueSet() NOT_DEBUG(= default); ~G1RedirtyCardsLocalQueueSet() NOT_DEBUG(= default);
void enqueue(G1RedirtyCardsQueue& queue, void* value); void enqueue(void* value);
// Add the buffer to the local list.
virtual void enqueue_completed_buffer(BufferNode* node);
// Transfer all completed buffers to the shared qset. // Transfer all completed buffers to the shared qset.
void flush(); void flush();
void flush_queue(G1RedirtyCardsQueue& queue);
};
// Worker-local queues of card table entries.
class G1RedirtyCardsQueue : public PtrQueue {
public:
G1RedirtyCardsQueue(G1RedirtyCardsLocalQueueSet* qset);
~G1RedirtyCardsQueue() NOT_DEBUG(= default);
}; };
// Card table entries to be redirtied and the cards reprocessed later. // Card table entries to be redirtied and the cards reprocessed later.