mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: fix spans corruption
The problem was that spans end up in wrong lists after split (e.g. in h->busy instead of h->central->empty). Also the span can be non-swept before split, I don't know what it can cause, but it's safer to operate on swept spans. Fixes #7544. R=golang-codereviews, rsc CC=golang-codereviews, khr https://golang.org/cl/76160043
This commit is contained in:
parent
f210fd1fa9
commit
8d321625fd
3 changed files with 70 additions and 40 deletions
|
|
@ -838,15 +838,7 @@ runtime·shrinkstack(G *gp)
|
|||
// First, we trick malloc into thinking
|
||||
// we allocated the stack as two separate half-size allocs. Then the
|
||||
// free() call does the rest of the work for us.
|
||||
if(oldsize == PageSize) {
|
||||
// convert span of 1 PageSize object to a span of 2
|
||||
// PageSize/2 objects.
|
||||
span->ref = 2;
|
||||
span->sizeclass = runtime·SizeToClass(PageSize/2);
|
||||
span->elemsize = PageSize/2;
|
||||
} else {
|
||||
// convert span of n>1 pages into two spans of n/2 pages each.
|
||||
runtime·MHeap_SplitSpan(&runtime·mheap, span);
|
||||
}
|
||||
runtime·MSpan_EnsureSwept(span);
|
||||
runtime·MHeap_SplitSpan(&runtime·mheap, span);
|
||||
runtime·free(oldstk);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue