mirror of
https://github.com/golang/go
synced 2024-09-15 22:20:06 +00:00
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
This commit is contained in:
parent
d89a738378
commit
7c75a862b4
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue