]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: mark with non-atomic operations when GOMAXPROCS=1
authorDmitriy Vyukov <dvyukov@google.com>
Sat, 16 Aug 2014 05:07:55 +0000 (09:07 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Sat, 16 Aug 2014 05:07:55 +0000 (09:07 +0400)
Perf builders show 3-5% GC pause increase with GOMAXPROCS=1 when marking with atomic ops:
http://goperfd.appspot.com/perfdetail?commit=a8a6e765d6a87f7ccb71fd85a60eb5a821151f85&commit0=3b864e02b987171e05e2e9d0840b85b5b6476386&kind=builder&builder=linux-amd64&benchmark=http

LGTM=rlh
R=golang-codereviews, rlh
CC=dave, golang-codereviews, khr, rsc
https://golang.org/cl/128340043

src/pkg/runtime/mgc0.c

index 59dfd51e65c18f9661b18b19a41e2fd565f065d9..f46d329017f973c5e243ea61776d61a689564598 100644 (file)
@@ -451,7 +451,8 @@ scanblock(byte *b, uintptr n, byte *ptrmask)
                        // quadruple is already marked. Otherwise we resort to CAS
                        // loop for marking.
                        bits8 = xbits>>(shift&~7);
-                       if((bits8&(bitMask|(bitMask<<gcBits))) != (bitBoundary|(bitBoundary<<gcBits)))
+                       if((bits8&(bitMask|(bitMask<<gcBits))) != (bitBoundary|(bitBoundary<<gcBits)) ||
+                               work.nproc == 1)
                                ((uint8*)bitp)[shift/8] = bits8 | (bitMarked<<(shift&7));
                        else {
                                for(;;) {