From: Austin Clements Date: Mon, 17 Oct 2016 01:22:02 +0000 (-0400) Subject: runtime: keep gcMarkRootCheck happy with spare Gs X-Git-Tag: go1.8beta1~750 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2be3ab441578413972d93fc1048decc422640b09;p=gostls13.git runtime: keep gcMarkRootCheck happy with spare Gs oneNewExtraM creates a spare M and G for use with cgo callbacks. The G doesn't run right away, but goes directly into syscall status. For the garbage collector, it's marked as "scan valid" and not on the rescan list, but I forgot to also mark it as "scan done". As a result, gcMarkRootCheck thinks that the goroutine hasn't been scanned and panics. This only affects GODEBUG=gccheckmark=1 mode, since we otherwise skip the gcMarkRootCheck. Fixes #17473. Change-Id: I94f5671c42eb44bd5ea7dc68fbf85f0c19e2e52c Reviewed-on: https://go-review.googlesource.com/31139 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Rick Hudson --- diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 937135961a..f68a189997 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1449,6 +1449,7 @@ func oneNewExtraM() { gp.syscallsp = gp.sched.sp gp.stktopsp = gp.sched.sp gp.gcscanvalid = true // fresh G, so no dequeueRescan necessary + gp.gcscandone = true gp.gcRescan = -1 // malg returns status as Gidle, change to Gsyscall before adding to allg // where GC will see it.