Commit 7c75a862 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: eliminate false retention due to m->moreargp/morebuf

m->moreargp/morebuf were not cleared in case of preemption and stack growing,
it can lead to persistent leaks of large memory blocks.

It seems to fix the sync.Pool finalizer failures. I've run the test 500'000 times
w/o a single failure; previously it would fail dozens of times.

Fixes #7633.
Fixes #7533.

LGTM=rsc
R=golang-codereviews
CC=golang-codereviews, khr, rsc
https://golang.org/cl/80480044
parent d89a7383
......@@ -608,7 +608,8 @@ runtime·newstack(void)
uintptr sp;
uintptr *src, *dst, *dstend;
G *gp;
Gobuf label;
Gobuf label, morebuf;
void *moreargp;
bool newstackcall;
if(m->forkstackguard)
......@@ -627,6 +628,12 @@ runtime·newstack(void)
framesize = m->moreframesize;
argsize = m->moreargsize;
moreargp = m->moreargp;
m->moreargp = nil;
morebuf = m->morebuf;
m->morebuf.pc = (uintptr)nil;
m->morebuf.lr = (uintptr)nil;
m->morebuf.sp = (uintptr)nil;
gp->status = Gwaiting;
gp->waitreason = "stack split";
newstackcall = framesize==1;
......@@ -727,13 +734,9 @@ runtime·newstack(void)
top->stackbase = gp->stackbase;
top->stackguard = gp->stackguard;
top->gobuf = m->morebuf;
top->argp = m->moreargp;
top->gobuf = morebuf;
top->argp = moreargp;
top->argsize = argsize;
m->moreargp = nil;
m->morebuf.pc = (uintptr)nil;
m->morebuf.lr = (uintptr)nil;
m->morebuf.sp = (uintptr)nil;
// copy flag from panic
top->panic = gp->ispanic;
......
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