]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix preemption sensitivity in TestTinyAllocIssue37262
authorAustin Clements <austin@google.com>
Mon, 22 Nov 2021 20:33:01 +0000 (15:33 -0500)
committerAustin Clements <austin@google.com>
Mon, 29 Nov 2021 19:45:58 +0000 (19:45 +0000)
TestTinyAllocIssue37262 assumes that all of its allocations will come
from the same tiny allocator (that is, the same P), and that nothing
else will allocate from that tiny allocator while it's running. It can
fail incorrectly if these assumptions aren't met.

Fix this potential test flakiness by disabling preemption during this
test.

As far as I know, this has never happened on the builders. It was
found by mayMoreStackPreempt.

Change-Id: I59f993e0bdbf46a9add842d0e278415422c3f804
Reviewed-on: https://go-review.googlesource.com/c/go/+/366994
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/export_test.go
src/runtime/malloc_test.go

index b2e64f14ad381d5616e2adc67d6a766b0520da0b..ef601f770c540f686fd5feae8fb55f83166f391b 100644 (file)
@@ -1307,3 +1307,12 @@ func escape(x interface{}) interface{} {
        escapeSink = nil
        return x
 }
+
+// Acquirem blocks preemption.
+func Acquirem() {
+       acquirem()
+}
+
+func Releasem() {
+       releasem(getg().m)
+}
index e028554b2386d5218194baac291b98a9f6a99149..757f9453930db5195e73a683ab2ab36b544c29ac 100644 (file)
@@ -198,6 +198,10 @@ func TestTinyAllocIssue37262(t *testing.T) {
        runtime.GC()
        runtime.GC()
 
+       // Disable preemption so we stay on one P's tiny allocator and
+       // nothing else allocates from it.
+       runtime.Acquirem()
+
        // Make 1-byte allocations until we get a fresh tiny slot.
        aligned := false
        for i := 0; i < 16; i++ {
@@ -208,6 +212,7 @@ func TestTinyAllocIssue37262(t *testing.T) {
                }
        }
        if !aligned {
+               runtime.Releasem()
                t.Fatal("unable to get a fresh tiny slot")
        }
 
@@ -229,6 +234,8 @@ func TestTinyAllocIssue37262(t *testing.T) {
        tinyByteSink = nil
        tinyUint32Sink = nil
        tinyObj12Sink = nil
+
+       runtime.Releasem()
 }
 
 func TestPageCacheLeak(t *testing.T) {