aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/malloc.go
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2024-10-09 17:38:49 +0000
committerGopher Robot <gobot@golang.org>2024-10-21 15:56:31 +0000
commitacd072a0784863dfbdf32da9d770753722270a26 (patch)
treef769ca2eabcc226fec500d69748e9490685c2819 /src/runtime/malloc.go
parenta1c4fb4361c3bc58760400b99f026fb2088610c6 (diff)
downloadgo-acd072a0784863dfbdf32da9d770753722270a26.tar.xz
runtime: execute publicationBarrier in noscan case for delayed zeroing
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>
Diffstat (limited to 'src/runtime/malloc.go')
-rw-r--r--src/runtime/malloc.go9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go
index 3416b599f9..83f7f64f6f 100644
--- a/src/runtime/malloc.go
+++ b/src/runtime/malloc.go
@@ -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
}