1
0
mirror of https://github.com/golang/go synced 2024-09-25 01:20:13 -06:00

runtime: move stack shrinking until after sweepgen is incremented.

Before GC, we flush all the per-P allocation caches.  Doing
stack shrinking mid-GC causes these caches to fill up.  At the
end of gc, the sweepgen is incremented which causes all of the
data in these caches to be in a bad state (cached but not yet
swept).

Move the stack shrinking until after sweepgen is incremented,
so any caching that happens as part of shrinking is done with
already-swept data.

Reenable stack copying.

LGTM=bradfitz
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/69620043
This commit is contained in:
Keith Randall 2014-02-27 14:20:15 -08:00
parent 0399b971d9
commit e9445547b6
2 changed files with 5 additions and 4 deletions

View File

@ -1601,9 +1601,6 @@ addstackroots(G *gp, Workbuf **wbufp)
if((mp = gp->m) != nil && mp->helpgc)
runtime·throw("can't scan gchelper stack");
// Shrink stack if not much of it is being used.
runtime·shrinkstack(gp);
if(gp->syscallstack != (uintptr)nil) {
// Scanning another goroutine that is about to enter or might
// have just exited a system call. It may be executing code such
@ -2426,6 +2423,11 @@ gc(struct gc_args *args)
gcstats.npausesweep++;
}
// Shrink a stack if not much of it is being used.
// TODO: do in a parfor
for(i = 0; i < runtime·allglen; i++)
runtime·shrinkstack(runtime·allg[i]);
runtime·MProf_GC();
}

View File

@ -174,7 +174,6 @@ runtime·schedinit(void)
procresize(procs);
runtime·copystack = runtime·precisestack;
runtime·copystack = false; // TODO: remove
p = runtime·getenv("GOCOPYSTACK");
if(p != nil && !runtime·strcmp(p, (byte*)"0"))
runtime·copystack = false;