From: Austin Clements Date: Tue, 27 Oct 2015 21:48:18 +0000 (-0400) Subject: runtime: free stack spans outside STW X-Git-Tag: go1.6beta1~562 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=56ad88b1ffe567d6072e3d25d7b02da18af9f842;p=gostls13.git runtime: free stack spans outside STW We couldn't do this before this point because it must be done before the next GC cycle starts. Hence, if it delayed the start of the next cycle, that would widen the window between reaching the heap trigger of the next cycle and starting the next GC cycle, during which the mutator could over-allocate. With the decentralized GC, any mutators that reach the heap trigger will block on the GC starting, so it's safe to widen the time between starting the world and being able to start the next GC cycle. Fixes #11465. Change-Id: Ic7ea7e9eba5b66fc050299f843a9c9001ad814aa Reviewed-on: https://go-review.googlesource.com/16394 Reviewed-by: Rick Hudson Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot --- diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index abebe10660..a3326e344e 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -1229,6 +1229,10 @@ func gcMarkTermination() { memstats.numgc++ systemstack(startTheWorldWithSema) + + // Free stack spans. This must be done between GC cycles. + systemstack(freeStackSpans) + semrelease(&worldsema) releasem(mp) @@ -1540,12 +1544,6 @@ func gcMark(start_time int64) { traceGCScanDone() } - // TODO(austin): This doesn't have to be done during STW, as - // long as we block the next GC cycle until this is done. Move - // it after we start the world, but before dropping worldsema. - // (See issue #11465.) - freeStackSpans() - cachestats() // Compute the reachable heap size at the beginning of the