From: Keith Randall Date: Thu, 27 Feb 2014 22:20:15 +0000 (-0800) Subject: runtime: move stack shrinking until after sweepgen is incremented. X-Git-Tag: go1.3beta1~539 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e9445547b6d04edc358ae60e2eb29db88fd67654;p=gostls13.git 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 --- diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index 68c4e95466..aa3eddbccd 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -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(); } diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 6b56634225..94d08bb55c 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -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;