From: Dmitriy Vyukov Date: Sun, 29 Jun 2014 02:20:46 +0000 (-0700) Subject: runtime: fix GC bitmap corruption X-Git-Tag: go1.4beta1~1200 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5bfe8adee5100444cdde78d4897d1673df96c813;p=gostls13.git runtime: fix GC bitmap corruption Fixes #8299. R=golang-codereviews CC=golang-codereviews, khr, rsc https://golang.org/cl/103640044 --- diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index 3eda4f4b9e..4ad8f3b08f 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -2731,7 +2731,7 @@ runtime·markscan(void *v) void runtime·markfreed(void *v) { - uintptr *b, off, shift; + uintptr *b, off, shift, xbits; if(0) runtime·printf("markfreed %p\n", v); @@ -2742,7 +2742,18 @@ runtime·markfreed(void *v) off = (uintptr*)v - (uintptr*)runtime·mheap.arena_start; // word offset b = (uintptr*)runtime·mheap.arena_start - off/wordsPerBitmapWord - 1; shift = off % wordsPerBitmapWord; - *b = (*b & ~(bitMask<m->gcing || work.nproc == 1) { + // During normal operation (not GC), the span bitmap is not updated concurrently, + // because either the span is cached or accesses are protected with MCentral lock. + *b = (*b & ~(bitMask<