Skip to content

Commit

Permalink
runtime: avoid using STW GC mechanism for checkmarks mode
Browse files Browse the repository at this point in the history
Currently, checkmarks mode uses the full STW GC infrastructure to
perform mark checking. We're about to remove that infrastructure and,
furthermore, since checkmarks is about doing the simplest thing
possible to check concurrent GC, it's valuable for it to be simpler.

Hence, this CL makes checkmarks even simpler by making it non-parallel
and divorcing it from the STW GC infrastructure (including the
gchelper mechanism).

Updates #26903. This is preparation for unifying STW GC and concurrent
GC.

Change-Id: Iad21158123e025e3f97d7986d577315e994bd43e
Reviewed-on: https://go-review.googlesource.com/c/134776
Run-TryBot: Austin Clements <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Rick Hudson <[email protected]>
  • Loading branch information
aclements committed Oct 2, 2018
1 parent 918ed88 commit ecc3659
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions src/runtime/mgc.go
Original file line number Diff line number Diff line change
Expand Up @@ -1513,12 +1513,16 @@ func gcMarkTermination(nextTriggerRatio float64) {
systemstack(func() {
work.heap2 = work.bytesMarked
if debug.gccheckmark > 0 {
// Run a full stop-the-world mark using checkmark bits,
// to check that we didn't forget to mark anything during
// the concurrent mark process.
// Run a full non-parallel, stop-the-world
// mark using checkmark bits, to check that we
// didn't forget to mark anything during the
// concurrent mark process.
gcResetMarkState()
initCheckmarks()
gcMark(startTime)
gcw := &getg().m.p.ptr().gcw
gcDrain(gcw, gcDrainNoBlock)
wbBufFlush1(getg().m.p.ptr())
gcw.dispose()
clearCheckmarks()
}

Expand Down Expand Up @@ -1905,12 +1909,12 @@ func gcMark(start_time int64) {
work.helperDrainBlock = false
} else {
// There's marking work to do. This is the case during
// STW GC and in checkmark mode. Instruct GC workers
// STW GC. Instruct GC workers
// to block in getfull until all GC workers are in getfull.
//
// TODO(austin): Move STW and checkmark marking out of
// TODO(austin): Move STW marking out of
// mark termination and eliminate this code path.
if !useCheckmark && debug.gcstoptheworld == 0 && debug.gcrescanstacks == 0 {
if debug.gcstoptheworld == 0 && debug.gcrescanstacks == 0 {
print("runtime: full=", hex(work.full), " nDataRoots=", work.nDataRoots, " nBSSRoots=", work.nBSSRoots, " nSpanRoots=", work.nSpanRoots, " nStackRoots=", work.nStackRoots, "\n")
panic("non-empty mark queue after concurrent mark")
}
Expand Down

0 comments on commit ecc3659

Please sign in to comment.