RFR: 8253180: ZGC: Implementation of JEP 376: ZGC: Concurrent Thread-Stack Processing
Erik Ă–sterlund
eosterlund at openjdk.java.net
Tue Sep 22 12:00:26 UTC 2020
This PR the implementation of "JEP 376: ZGC: Concurrent Thread-Stack Processing" (cf.
https://openjdk.java.net/jeps/376).
Basically, this patch modifies the epilog safepoint when returning from a frame (supporting interpreter frames, c1, c2,
and native wrapper frames), to compare the stack pointer against a thread-local value. This turns return polls into
more of a swiss army knife that can be used to poll for safepoints, handshakes, but also returns into not yet safe to
expose frames, denoted by a "stack watermark".
ZGC will leave frames (and other thread oops) in a state of a mess in the GC checkpoint safepoints, rather than
processing all threads and their stacks. Processing is initialized automagically when threads wake up for a safepoint,
or get poked by a handshake or safepoint. Said initialization processes a few (3) frames and other thread oops. The
rest - the bulk of the frame processing, is deferred until it is actually needed. It is needed when a frame is exposed
to either 1) execution (returns or unwinding due to exception handling), or 2) stack walker APIs. A hook is then run to
go and finish the lazy processing of frames.
Mutator and GC threads can compete for processing. The processing is therefore performed under a per-thread lock. Note
that disarming of the poll word (that the returns are comparing against) is only performed by the thread itself. So
sliding the watermark up will require one runtime call for a thread to note that nothing needs to be done, and then
update the poll word accordingly. Downgrading the poll word concurrently by other threads was simply not worth the
complexity it brought (and is only possible on TSO machines). So left that one out.
-------------
Commit messages:
- 8253180: ZGC: Implementation of JEP 376: ZGC: Concurrent Thread-Stack Processing
Changes: https://git.openjdk.java.net/jdk/pull/296/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=296&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8253180
Stats: 2560 lines in 131 files changed: 2046 ins; 279 del; 235 mod
Patch: https://git.openjdk.java.net/jdk/pull/296.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/296/head:pull/296
PR: https://git.openjdk.java.net/jdk/pull/296
More information about the serviceability-dev
mailing list