aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2023-11-10 21:23:38 +0000
committerGopher Robot <gobot@golang.org>2023-11-13 14:11:13 +0000
commit5f08b4479930af266d4a84c1533b320ed75edba7 (patch)
treed8dbe501bc5d872ec7f89dc35c8a7940d3c317ed /src/runtime
parent8da6405e0db80fa0a4136fb816c7ca2db716c2b2 (diff)
downloadgo-5f08b4479930af266d4a84c1533b320ed75edba7.tar.xz
runtime: call enableMetadataHugePages and its callees on the systemstack
These functions acquire the heap lock. If they're not called on the systemstack, a stack growth could cause a self-deadlock since stack growth may allocate memory from the page heap. This has been a problem for a while. If this is what's plaguing the ppc64 port right now, it's very surprising (and probably just coincidental) that it's showing up now. For #64050. For #64062. Fixes #64067. Change-Id: I2b95dc134d17be63b9fe8f7a3370fe5b5438682f Reviewed-on: https://go-review.googlesource.com/c/go/+/541635 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> Auto-Submit: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Pratt <mpratt@google.com> Reviewed-by: Paul Murphy <murp@ibm.com>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/malloc.go4
-rw-r--r--src/runtime/mgc.go4
-rw-r--r--src/runtime/mpagealloc.go4
3 files changed, 11 insertions, 1 deletions
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go
index d9b4112ded..398eaf5d52 100644
--- a/src/runtime/malloc.go
+++ b/src/runtime/malloc.go
@@ -872,6 +872,10 @@ retry:
//
// The heap lock must not be held over this operation, since it will briefly acquire
// the heap lock.
+//
+// Must be called on the system stack because it acquires the heap lock.
+//
+//go:systemstack
func (h *mheap) enableMetadataHugePages() {
// Enable huge pages for page structure.
h.pages.enableChunkHugePages()
diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go
index b791acd163..c8a58de969 100644
--- a/src/runtime/mgc.go
+++ b/src/runtime/mgc.go
@@ -1190,7 +1190,9 @@ func gcMarkTermination() {
// Enable huge pages on some metadata if we cross a heap threshold.
if gcController.heapGoal() > minHeapForMetadataHugePages {
- mheap_.enableMetadataHugePages()
+ systemstack(func() {
+ mheap_.enableMetadataHugePages()
+ })
}
semrelease(&worldsema)
diff --git a/src/runtime/mpagealloc.go b/src/runtime/mpagealloc.go
index f87565417f..d533f84180 100644
--- a/src/runtime/mpagealloc.go
+++ b/src/runtime/mpagealloc.go
@@ -437,6 +437,10 @@ func (p *pageAlloc) grow(base, size uintptr) {
//
// The heap lock must not be held over this operation, since it will briefly acquire
// the heap lock.
+//
+// Must be called on the system stack because it acquires the heap lock.
+//
+//go:systemstack
func (p *pageAlloc) enableChunkHugePages() {
// Grab the heap lock to turn on huge pages for new chunks and clone the current
// heap address space ranges.