RFR: 8238979: Improve G1DirtyCardQueueSet handling of previously paused buffers

Kim Barrett kim.barrett at oracle.com
Fri Feb 14 01:46:46 UTC 2020


Please review this simplification of the handling of previously paused
buffers by G1DirtyCardQueueSet.  This change moves the call to
enqueue_previous_paused_buffers() into record_paused_buffer().  This
ensures any paused buffers from a previous safepoint have been flushed
out before recording a buffer for the next safepoint.

This move eliminates the former precondition that the enqueue had to
have been performed before recording.

This move also permits the enqueue_previous_paused_buffers in
get_completed_buffer() to be moved to a point where it will be called
much more rarely, slightly improving the normal performance of
get_dirtied_buffer.  The old location of the call was in support of
the call order invariant needed by record_paused_buffer().

As a consequence of the changed enqueue locations, the fast path check
in enqueue_previous_paused_buffers() will now only rarely succeed, and
is no longer worth the (very small) performance cost and (much more
importantly) the largish block comment arguing its correctness.  So
that fast path is removed.  And since the raison d'etre for
PausedBuffers::is_empty() was to support that fast path, that function
is also removed.

CR:
https://bugs.openjdk.java.net/browse/JDK-8238979

Webrev:
https://cr.openjdk.java.net/~kbarrett/8238979/open.00/

Testing:
mach5 tier1-5 in conjunction with other in-development changes.
Local (linux-x64) hotspot:tier1 for this change in isolation.



More information about the hotspot-gc-dev mailing list