]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: eliminate false sharing on runtime.goidgen
authorDmitriy Vyukov <dvyukov@google.com>
Tue, 12 Jul 2011 05:25:14 +0000 (01:25 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 12 Jul 2011 05:25:14 +0000 (01:25 -0400)
runtime.goidgen can be quite frequently modified and
shares cache line with the following variables,
it leads to false sharing.
50c6b0 b nfname
50c6b4 b nfunc
50c6b8 b nfunc$17
50c6bc b nhist$17
50c6c0 B runtime.checking
50c6c4 B runtime.gcwaiting
50c6c8 B runtime.goidgen
50c6cc B runtime.gomaxprocs
50c6d0 B runtime.panicking
50c6d4 B strconv.IntSize
50c6d8 B src/pkg/runtime/_xtest_.ss
50c6e0 B src/pkg/runtime/_xtest_.stop
50c6e8 b addrfree
50c6f0 b addrmem
50c6f8 b argv

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/4673054

src/pkg/runtime/proc.c
src/pkg/runtime/runtime.h

index 814a68e2ec6dff0cfae235caf34332a1c0121f79..76356c11bc3192cc8db7a82aef8720c879e877a4 100644 (file)
@@ -56,6 +56,7 @@ struct Sched {
        Lock;
 
        G *gfree;       // available gs (status == Gdead)
+       int32 goidgen;
 
        G *ghead;       // gs waiting to run
        G *gtail;
@@ -907,8 +908,8 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc)
        newg->gopc = (uintptr)callerpc;
 
        runtime·sched.gcount++;
-       runtime·goidgen++;
-       newg->goid = runtime·goidgen;
+       runtime·sched.goidgen++;
+       newg->goid = runtime·sched.goidgen;
 
        newprocreadylocked(newg);
        schedunlock();
index 48cd482dd9012e46793a5b616cf44f4b1cf0c951..83ea0f9ce2e3a5dea532f4f52436bca39c449a4e 100644 (file)
@@ -369,7 +369,6 @@ extern      Alg     runtime·algarray[Amax];
 extern String  runtime·emptystring;
 G*     runtime·allg;
 M*     runtime·allm;
-int32  runtime·goidgen;
 extern int32   runtime·gomaxprocs;
 extern uint32  runtime·panicking;
 extern int32   runtime·gcwaiting;             // gc is waiting to run