Commit 2be3ab44 authored by Austin Clements's avatar Austin Clements

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 <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRick Hudson <rlh@golang.org>
parent 7bc42a14
...@@ -1449,6 +1449,7 @@ func oneNewExtraM() { ...@@ -1449,6 +1449,7 @@ func oneNewExtraM() {
gp.syscallsp = gp.sched.sp gp.syscallsp = gp.sched.sp
gp.stktopsp = gp.sched.sp gp.stktopsp = gp.sched.sp
gp.gcscanvalid = true // fresh G, so no dequeueRescan necessary gp.gcscanvalid = true // fresh G, so no dequeueRescan necessary
gp.gcscandone = true
gp.gcRescan = -1 gp.gcRescan = -1
// malg returns status as Gidle, change to Gsyscall before adding to allg // malg returns status as Gidle, change to Gsyscall before adding to allg
// where GC will see it. // where GC will see it.
......
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