]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: don't create heap hints outside TSAN's supported heap
authorAustin Clements <austin@google.com>
Fri, 13 Jul 2018 21:29:39 +0000 (17:29 -0400)
committerAustin Clements <austin@google.com>
Thu, 19 Jul 2018 18:12:51 +0000 (18:12 +0000)
TSAN for Go only supports heap address in the range [0x00c000000000,
0x00e000000000). However, we currently create heap hints of the form
0xXXc000000000 for XX between 0x00 and 0x7f. Even for XX=0x01, this
hint is outside TSAN's supported heap address range.

Fix this by creating a slightly different set of hints in race mode,
all of which fall inside TSAN's heap address range.

This should fix TestArenaCollision flakes. That test forces the
runtime to use later heap hints. Currently, this always results in
TSAN "failed to allocate" failures on Windows (which happens to have a
slightly more constrained TSAN layout than non-Windows). Most of the
time we don't notice these failures, but sometimes it crashes TSAN,
leading to a test failure.

Fixes #25698.

Change-Id: I8926cd61f0ee5ee00efa77b283f7b809c555be46
Reviewed-on: https://go-review.googlesource.com/123780
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/malloc.go

index e75edf05fd6c2e173e887ff10af4c2b67448d79f..07e0a67240ceb848d796ee4e5f73b2a98ac334ca 100644 (file)
@@ -427,6 +427,14 @@ func mallocinit() {
                                p = uintptr(i)<<40 | uintptrMask&(0x0013<<28)
                        case GOARCH == "arm64":
                                p = uintptr(i)<<40 | uintptrMask&(0x0040<<32)
+                       case raceenabled:
+                               // The TSAN runtime requires the heap
+                               // to be in the range [0x00c000000000,
+                               // 0x00e000000000).
+                               p = uintptr(i)<<32 | uintptrMask&(0x00c0<<32)
+                               if p >= uintptrMask&0x00e000000000 {
+                                       continue
+                               }
                        default:
                                p = uintptr(i)<<40 | uintptrMask&(0x00c0<<32)
                        }