Commit fa2f9c2c authored by Austin Clements's avatar Austin Clements

runtime: run concurrent mark phase on regular stack

Currently, the GC's concurrent mark phase runs on the system
stack. There's no need to do this, and running it this way ties up the
entire M and P running the GC by preventing the scheduler from
preempting the GC even during concurrent mark.

Fix this by running concurrent mark on the regular G stack. It's still
non-preemptible because we also set preemptoff around the whole GC
process, but this moves us closer to making it preemptible.

Change-Id: Ia9f1245e299b8c5c513a4b1e3ef13eaa35ac5e73
Reviewed-on: https://go-review.googlesource.com/7730Reviewed-by: default avatarRick Hudson <rlh@golang.org>
parent bef356b2
......@@ -339,6 +339,7 @@ func gc(mode int) {
// Concurrent mark.
starttheworld()
})
gctimer.cycle.mark = nanotime()
var gcw gcWork
gcDrain(&gcw)
......@@ -346,11 +347,10 @@ func gc(mode int) {
// Begin mark termination.
gctimer.cycle.markterm = nanotime()
stoptheworld()
systemstack(stoptheworld)
// The gcphase is _GCmark, it will transition to _GCmarktermination
// below. The important thing is that the wb remains active until
// all marking is complete. This includes writes made by the GC.
})
} else {
// For non-concurrent GC (mode != gcBackgroundMode)
// The g stacks have not been scanned so clear g state
......
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