From fa2f9c2c0923edf539cdcce82473e7131826d677 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 18 Mar 2015 11:22:12 -0400 Subject: [PATCH] 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/7730 Reviewed-by: Rick Hudson --- src/runtime/mgc.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index d19606bba78..9d987400670 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -339,18 +339,18 @@ func gc(mode int) { // Concurrent mark. starttheworld() - gctimer.cycle.mark = nanotime() - var gcw gcWork - gcDrain(&gcw) - gcw.dispose() - - // Begin mark termination. - gctimer.cycle.markterm = nanotime() - 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. }) + gctimer.cycle.mark = nanotime() + var gcw gcWork + gcDrain(&gcw) + gcw.dispose() + + // Begin mark termination. + gctimer.cycle.markterm = nanotime() + 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