Commit 38425962 authored by Austin Clements's avatar Austin Clements

runtime: move concurrent mark setup off system stack

For historical reasons we currently do a lot of the concurrent mark
setup on the system stack. In fact, at this point the one and only
thing that needs to happen on the system stack is the start-the-world.

Clean up this code by lifting everything other than the
start-the-world off the system stack.

The diff for this change looks large, but the only code change is to
narrow the systemstack call. Everything else is re-indentation.

Change-Id: I1e03b8afc759fad726f2397b05a17d183c2713ce
Reviewed-on: https://go-review.googlesource.com/16354Reviewed-by: default avatarRick Hudson <rlh@golang.org>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 19596215
...@@ -1040,54 +1040,52 @@ func gc(mode gcMode) { ...@@ -1040,54 +1040,52 @@ func gc(mode gcMode) {
gcController.startCycle() gcController.startCycle()
work.heapGoal = gcController.heapGoal work.heapGoal = gcController.heapGoal
systemstack(func() { // Enter concurrent mark phase and enable
// Enter concurrent mark phase and enable // write barriers.
// write barriers. //
// // Because the world is stopped, all Ps will
// Because the world is stopped, all Ps will // observe that write barriers are enabled by
// observe that write barriers are enabled by // the time we start the world and begin
// the time we start the world and begin // scanning.
// scanning. //
// // It's necessary to enable write barriers
// It's necessary to enable write barriers // during the scan phase for several reasons:
// during the scan phase for several reasons: //
// // They must be enabled for writes to higher
// They must be enabled for writes to higher // stack frames before we scan stacks and
// stack frames before we scan stacks and // install stack barriers because this is how
// install stack barriers because this is how // we track writes to inactive stack frames.
// we track writes to inactive stack frames. // (Alternatively, we could not install stack
// (Alternatively, we could not install stack // barriers over frame boundaries with
// barriers over frame boundaries with // up-pointers).
// up-pointers). //
// // They must be enabled before assists are
// They must be enabled before assists are // enabled because they must be enabled before
// enabled because they must be enabled before // any non-leaf heap objects are marked. Since
// any non-leaf heap objects are marked. Since // allocations are blocked until assists can
// allocations are blocked until assists can // happen, we want enable assists as early as
// happen, we want enable assists as early as // possible.
// possible. setGCPhase(_GCmark)
setGCPhase(_GCmark)
// markrootSpans uses work.spans, so make sure
// markrootSpans uses work.spans, so make sure // it is up to date.
// it is up to date. gcCopySpans()
gcCopySpans()
gcBgMarkPrepare() // Must happen before assist enable.
gcBgMarkPrepare() // Must happen before assist enable. gcMarkRootPrepare()
gcMarkRootPrepare()
// At this point all Ps have enabled the write
// At this point all Ps have enabled the write // barrier, thus maintaining the no white to
// barrier, thus maintaining the no white to // black invariant. Enable mutator assists to
// black invariant. Enable mutator assists to // put back-pressure on fast allocating
// put back-pressure on fast allocating // mutators.
// mutators. atomicstore(&gcBlackenEnabled, 1)
atomicstore(&gcBlackenEnabled, 1)
// Concurrent mark.
// Concurrent mark. systemstack(startTheWorldWithSema)
startTheWorldWithSema() now = nanotime()
now = nanotime() work.pauseNS += now - work.pauseStart
work.pauseNS += now - work.pauseStart gcController.assistStartTime = now
gcController.assistStartTime = now
})
work.tMark = now work.tMark = now
// Enable background mark workers and wait for // Enable background mark workers and wait for
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment