mirror of
https://github.com/golang/go
synced 2024-11-23 00:00:07 -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:
parent
5ecd9e34df
commit
776ee4079a
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user