RFR: 8261448: Preserve GC stack watermark across safepoints in StackWalk

Roman Kennke rkennke at openjdk.java.net
Wed Feb 10 10:12:49 UTC 2021


I am observing the following assert:

# Internal Error (/home/rkennke/src/openjdk/loom/src/hotspot/share/runtime/stackWatermark.cpp:178), pid=54418, tid=54534
# assert(is_frame_safe(f)) failed: Frame must be safe

(see issue for full hs_err)

In StackWalk::fetchNextBatch() we prepare the entire stack to be processed by calling StackWatermarkSet::finish_processing(jt, NULL, StackWatermarkKind::gc), but then subsequently, during frames scan, perform allocations to fill in the frame information (fill_in_frames => LiveFrameStream::fill_frame => fill_live_stackframe) at where we could safepoint for GC, which could reset the stack watermark.

This is only relevant for GCs that use the StackWatermark, e.g. ZGC and Shenandoah at the moment.

Solution is to preserve the stack-watermark across safepoints in StackWalk::fetchNextBatch(). StackWalk::fetchFirstBatch() doesn't look to be affected by this: it is not using the stack-watermark.

Testing:
 - [x] StackWalk tests with Shenandoah/aggressive
 - [x] StackWalk tests with ZGC/aggressive
 - [ ] tier1 (+Shenandoah/ZGC)
 - [ ] tier2 (+Shenandoah/ZGC)

-------------

Commit messages:
 - 8261448: Preserve GC stack watermark across safepoints in StackWalk

Changes: https://git.openjdk.java.net/jdk/pull/2500/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2500&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8261448
  Stats: 2 lines in 1 file changed: 1 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2500.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2500/head:pull/2500

PR: https://git.openjdk.java.net/jdk/pull/2500



More information about the hotspot-gc-dev mailing list