]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: execute publicationBarrier in noscan case for delayed zeroing
authorMichael Anthony Knyszek <mknyszek@google.com>
Wed, 9 Oct 2024 17:38:49 +0000 (17:38 +0000)
committerGopher Robot <gobot@golang.org>
Mon, 21 Oct 2024 15:56:31 +0000 (15:56 +0000)
This is a peace-of-mind change to make sure that delayed-zeroed memory
(in the large alloc case) is globally visible from the moment the
allocation is published back to the caller.

The way it's written right now is good enough for the garbage collector
(we already have a publication barrier for a nil span.largeType, so the
GC will ignore the noscan span) but this might matter for user code on
weak memory architectures.

Change-Id: I06ac9b95863074e5f09382629083b19bfa87fdb8
Reviewed-on: https://go-review.googlesource.com/c/go/+/619036
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/malloc.go

index 3416b599f9b2061a8afeff14d0553fceec574f31..83f7f64f6f0db8e75346b85a293df6bbc7c9f90e 100644 (file)
@@ -1581,14 +1581,13 @@ func mallocgcLarge(size uintptr, typ *_type, needzero bool) (unsafe.Pointer, uin
                memclrNoHeapPointersChunked(size, x) // This is a possible preemption point: see #47302
 
                // Finish storing the type information for this case.
+               mp := acquirem()
                if !noscan {
-                       mp := acquirem()
                        getMCache(mp).scanAlloc += heapSetTypeLarge(uintptr(x), size, typ, span)
-
-                       // Publish the type information with the zeroed memory.
-                       publicationBarrier()
-                       releasem(mp)
                }
+               // Publish the object with the now-zeroed memory.
+               publicationBarrier()
+               releasem(mp)
        }
        return x, size
 }