src/hotspot/share/gc/g1/g1RedirtyCardsQueue.hpp
author manc
Mon, 14 Oct 2019 18:48:10 -0700
changeset 58652 9b67dd88a931
parent 57890 6bb824c45df1
child 58679 9c3209ff7550
permissions -rw-r--r--
8232232: G1RemSetSummary::_rs_threads_vtimes is not initialized to zero Summary: Fix error in "Concurrent refinement threads times" in GC log and cleanup. Reviewed-by: tschatzl, kbarrett
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55752
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     1
/*
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     4
 *
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     7
 * published by the Free Software Foundation.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     8
 *
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    13
 * accompanied this code).
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    14
 *
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    18
 *
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    21
 * questions.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    22
 *
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    23
 */
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    24
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    25
#ifndef SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    26
#define SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    27
57890
6bb824c45df1 8230192: Rename G1RedirtyCardsBufferList to G1BufferNodeList
kbarrett
parents: 57785
diff changeset
    28
#include "gc/g1/g1BufferNodeList.hpp"
55752
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    29
#include "gc/shared/ptrQueue.hpp"
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    30
#include "memory/allocation.hpp"
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    31
#include "memory/padded.hpp"
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    32
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    33
class G1CardTableEntryClosure;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    34
class G1RedirtyCardsQueue;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    35
class G1RedirtyCardsQueueSet;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    36
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    37
// Provide G1RedirtyCardsQueue with a thread-local qset.  It provides an
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    38
// uncontended staging area for completed buffers, to be flushed to the
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    39
// shared qset en masse.  Using the "base from member" idiom so the local
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    40
// qset is constructed before being passed to the PtrQueue constructor.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    41
class G1RedirtyCardsQueueBase {
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    42
  friend class G1RedirtyCardsQueue;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    43
  friend class G1RedirtyCardsQueueSet;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    44
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    45
  class LocalQSet : public PtrQueueSet {
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    46
    G1RedirtyCardsQueueSet* _shared_qset;
57890
6bb824c45df1 8230192: Rename G1RedirtyCardsBufferList to G1BufferNodeList
kbarrett
parents: 57785
diff changeset
    47
    G1BufferNodeList _buffers;
55752
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    48
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    49
  public:
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    50
    LocalQSet(G1RedirtyCardsQueueSet* shared_qset);
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    51
    ~LocalQSet();
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    52
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    53
    // Add the buffer to the local list.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    54
    virtual void enqueue_completed_buffer(BufferNode* node);
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    55
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    56
    // Transfer all completed buffers to the shared qset.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    57
    void flush();
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    58
57890
6bb824c45df1 8230192: Rename G1RedirtyCardsBufferList to G1BufferNodeList
kbarrett
parents: 57785
diff changeset
    59
    G1BufferNodeList take_all_completed_buffers();
55752
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    60
  };
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    61
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    62
  G1RedirtyCardsQueueBase(G1RedirtyCardsQueueSet* shared_qset) :
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    63
    _local_qset(shared_qset) {}
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    64
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    65
  ~G1RedirtyCardsQueueBase() {}
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    66
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    67
  LocalQSet _local_qset;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    68
};
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    69
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    70
// Worker-local queues of card table entries.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    71
class G1RedirtyCardsQueue : private G1RedirtyCardsQueueBase, public PtrQueue {
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    72
protected:
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    73
  virtual void handle_completed_buffer();
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    74
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    75
public:
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    76
  G1RedirtyCardsQueue(G1RedirtyCardsQueueSet* qset);
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    77
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    78
  // Flushes the queue.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    79
  ~G1RedirtyCardsQueue();
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    80
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    81
  // Flushes all enqueued cards to qset.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    82
  void flush();
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    83
};
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    84
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    85
// Card table entries to be redirtied and the cards reprocessed later.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    86
// Has two phases, collecting and processing.  During the collecting
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    87
// phase buffers are added to the set.  Once collecting is complete and
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    88
// processing starts, buffers can no longer be added.  Taking all the
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    89
// collected (and processed) buffers reverts back to collecting, allowing
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    90
// the set to be reused for another round of redirtying.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    91
class G1RedirtyCardsQueueSet : public PtrQueueSet {
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    92
  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    93
  BufferNode::Stack _list;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    94
  DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, sizeof(size_t));
57507
f6b30bd6804e 8227719: G1 Pending cards estimation too conservative in cost prediction
tschatzl
parents: 55752
diff changeset
    95
  volatile size_t _entry_count;
55752
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    96
  DEFINE_PAD_MINUS_SIZE(3, DEFAULT_CACHE_LINE_SIZE, sizeof(BufferNode*));
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    97
  BufferNode* _tail;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    98
  DEBUG_ONLY(mutable bool _collecting;)
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
    99
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   100
  typedef G1RedirtyCardsQueueBase::LocalQSet LocalQSet;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   101
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   102
  void update_tail(BufferNode* node);
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   103
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   104
public:
57785
8d9362f3b8aa 8229044: G1RedirtyCardsQueueSet should be local to a collection
kbarrett
parents: 57507
diff changeset
   105
  G1RedirtyCardsQueueSet(BufferNode::Allocator* allocator);
55752
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   106
  ~G1RedirtyCardsQueueSet();
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   107
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   108
  void verify_empty() const NOT_DEBUG_RETURN;
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   109
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   110
  // Collect buffers.  These functions are thread-safe.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   111
  // precondition: Must not be concurrent with buffer processing.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   112
  virtual void enqueue_completed_buffer(BufferNode* node);
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   113
  void merge_bufferlist(LocalQSet* src);
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   114
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   115
  // Processing phase operations.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   116
  // precondition: Must not be concurrent with buffer collection.
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   117
  BufferNode* all_completed_buffers() const;
57890
6bb824c45df1 8230192: Rename G1RedirtyCardsBufferList to G1BufferNodeList
kbarrett
parents: 57785
diff changeset
   118
  G1BufferNodeList take_all_completed_buffers();
55752
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   119
};
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   120
8ae33203d600 8162929: Enqueuing dirty cards into a single DCQS during GC does not scale
kbarrett
parents:
diff changeset
   121
#endif // SHARE_GC_G1_G1REDIRTYCARDSQUEUE_HPP