Commit 9741f027 authored by Austin Clements's avatar Austin Clements

runtime: initialize more fields of stack spans

Stack spans don't internally use many of the fields of the mspan,
which means things like the size class and element size get left over
from whatever last used the mspan. This can lead to confusing crashes
and debugging.

Zero these fields or initialize them to something reasonable. This
also lets us simplify some code that currently has to distinguish
between heap and stack spans.

Change-Id: I9bd114e76c147bb32de497045b932f8bf1988bbf
Reviewed-on: https://go-review.googlesource.com/38573
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRick Hudson <rlh@golang.org>
parent 92cf05da
...@@ -326,10 +326,8 @@ func inHeapOrStack(b uintptr) bool { ...@@ -326,10 +326,8 @@ func inHeapOrStack(b uintptr) bool {
return false return false
} }
switch s.state { switch s.state {
case mSpanInUse: case mSpanInUse, _MSpanStack:
return b < s.limit return b < s.limit
case _MSpanStack:
return b < s.base()+s.npages<<_PageShift
default: default:
return false return false
} }
...@@ -653,6 +651,10 @@ func (h *mheap) allocStack(npage uintptr) *mspan { ...@@ -653,6 +651,10 @@ func (h *mheap) allocStack(npage uintptr) *mspan {
s.state = _MSpanStack s.state = _MSpanStack
s.stackfreelist = 0 s.stackfreelist = 0
s.allocCount = 0 s.allocCount = 0
s.sizeclass = 0
s.nelems = 0
s.elemsize = 0
s.limit = s.base() + s.npages<<_PageShift
memstats.stacks_inuse += uint64(s.npages << _PageShift) memstats.stacks_inuse += uint64(s.npages << _PageShift)
} }
......
...@@ -196,7 +196,8 @@ func stackpoolalloc(order uint8) gclinkptr { ...@@ -196,7 +196,8 @@ func stackpoolalloc(order uint8) gclinkptr {
if s.stackfreelist.ptr() != nil { if s.stackfreelist.ptr() != nil {
throw("bad stackfreelist") throw("bad stackfreelist")
} }
for i := uintptr(0); i < _StackCacheSize; i += _FixedStack << order { s.elemsize = _FixedStack << order
for i := uintptr(0); i < _StackCacheSize; i += s.elemsize {
x := gclinkptr(s.base() + i) x := gclinkptr(s.base() + i)
x.ptr().next = s.stackfreelist x.ptr().next = s.stackfreelist
s.stackfreelist = x s.stackfreelist = x
...@@ -393,6 +394,7 @@ func stackalloc(n uint32) stack { ...@@ -393,6 +394,7 @@ func stackalloc(n uint32) stack {
if s == nil { if s == nil {
throw("out of memory") throw("out of memory")
} }
s.elemsize = uintptr(n)
} }
v = unsafe.Pointer(s.base()) v = unsafe.Pointer(s.base())
} }
......
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