]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix final stack split in exitsyscall
authorAustin Clements <austin@google.com>
Fri, 24 Nov 2017 15:12:44 +0000 (10:12 -0500)
committerAustin Clements <austin@google.com>
Fri, 24 Nov 2017 15:48:04 +0000 (15:48 +0000)
exitsyscall should be recursively nosplit, but we don't have a way to
annotate that right now (see #21314). There's exactly one remaining
place where this is violated right now: exitsyscall -> casgstatus ->
print. The other prints in casgstatus are wrapped in systemstack
calls. This fixes the remaining print.

Updates #21431 (in theory could fix it, but that would just indicate
that we have a different G status-related crash and we've *never* seen
that failure on the dashboard.)

Change-Id: I9a5e8d942adce4a5c78cfc6b306ea5bda90dbd33
Reviewed-on: https://go-review.googlesource.com/79815
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: Rick Hudson <rlh@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/proc.go

index 8cb6e57a9702d09138e21b04733d1c48bf76a309..5912fc61d1028bcfc99aacb724246e9830ed26cc 100644 (file)
@@ -782,8 +782,10 @@ func casgstatus(gp *g, oldval, newval uint32) {
                // _Grunning or _Grunning|_Gscan; either way,
                // we own gp.gcscanvalid, so it's safe to read.
                // gp.gcscanvalid must not be true when we are running.
-               print("runtime: casgstatus ", hex(oldval), "->", hex(newval), " gp.status=", hex(gp.atomicstatus), " gp.gcscanvalid=true\n")
-               throw("casgstatus")
+               systemstack(func() {
+                       print("runtime: casgstatus ", hex(oldval), "->", hex(newval), " gp.status=", hex(gp.atomicstatus), " gp.gcscanvalid=true\n")
+                       throw("casgstatus")
+               })
        }
 
        // See http://golang.org/cl/21503 for justification of the yield delay.