]> Cypherpunks.ru repositories - gostls13.git/commitdiff
runtime: call enableMetadataHugePages and its callees on the systemstack
authorMichael Anthony Knyszek <mknyszek@google.com>
Fri, 10 Nov 2023 21:23:38 +0000 (21:23 +0000)
committerGopher Robot <gobot@golang.org>
Mon, 13 Nov 2023 14:11:13 +0000 (14:11 +0000)
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>
src/runtime/malloc.go
src/runtime/mgc.go
src/runtime/mpagealloc.go

index d9b4112ded24ca95e31bd45375bf70006ee6984e..398eaf5d52e22cd077bb0252276440faaf8cadb1 100644 (file)
@@ -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()
index b791acd163d67dfb11b9fd783bef96f12840f12b..c8a58de969f3edabd90e0e927c6edde63752084a 100644 (file)
@@ -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)
index f87565417f7195110cbf30fa416856dfefa7b13d..d533f84180fb73b541794b9886b2991a0ad4e092 100644 (file)
@@ -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.