1
0
mirror of https://github.com/golang/go synced 2024-11-23 03:30:02 -07:00

runtime: do not treat morestack as a topofstack

I added morestack to this list in 2013 with an explanation
that they were needed if we “start a garbage collection on g0
during a stack split or unsplit”.
(https://golang.org/cl/11533043)

This explanation no longer applies for a handful of reasons,
most importantly that if we did stop a stack scan in the middle
of a call to morestack, we'd ignore pointers above the split,
which would lead to memory corruption. But we don't scan
goroutine stacks during morestack now, so that can't happen.
If we did see morestack during a GC, that would be a good time
to crash the program.

The real problem with morestack is during profiling, as noted
in the code review conversation during 2013. And in profiling
we just need to know to stop and not unwind further, which
the new SPWRITE bit will do for us.

So remove from topofstack and let the program crash if GC
sees morestack and otherwise let the SPWRITE stop morestack
unwinding during profiling.

This CL is part of a stack adding windows/arm64
support (#36439), intended to land in the Go 1.17 cycle.
This CL is, however, not windows/arm64-specific.
It is cleanup meant to make the port (and future ports) easier.

Change-Id: I06d95920b18c599c7c46f64c21028104978215d7
Reviewed-on: https://go-review.googlesource.com/c/go/+/288804
Trust: Russ Cox <rsc@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Russ Cox 2021-01-29 09:05:10 -05:00
parent 5ecd9e34df
commit 776ee4079a

View File

@ -1003,7 +1003,6 @@ func tracebackHexdump(stk stack, frame *stkframe, bad uintptr) {
// Does f mark the top of a goroutine stack? // Does f mark the top of a goroutine stack?
func topofstack(f funcInfo, g0 bool) bool { func topofstack(f funcInfo, g0 bool) bool {
return f.flag&funcFlag_TOPFRAME != 0 || return f.flag&funcFlag_TOPFRAME != 0 ||
f.funcID == funcID_morestack ||
// asmcgocall is TOS on the system stack because it // asmcgocall is TOS on the system stack because it
// switches to the system stack, but in this case we // switches to the system stack, but in this case we
// can come back to the regular stack and still want // can come back to the regular stack and still want