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
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
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();
}
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;