]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: move stack shrinking until after sweepgen is incremented.
authorKeith Randall <khr@golang.org>
Thu, 27 Feb 2014 22:20:15 +0000 (14:20 -0800)
committerKeith Randall <khr@golang.org>
Thu, 27 Feb 2014 22:20:15 +0000 (14:20 -0800)
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

src/pkg/runtime/mgc0.c
src/pkg/runtime/proc.c

index 68c4e95466eb40ba2981f25d814b046ac2408bc7..aa3eddbccd73fa6efef5ed636889a16748b0f8f7 100644 (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();
 }
 
index 6b56634225df40623b856e3ced41ad8c66088710..94d08bb55cb003268d706c637735d003bb03db10 100644 (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;