From: Michael Anthony Knyszek Date: Fri, 10 Nov 2023 21:23:38 +0000 (+0000) Subject: runtime: call enableMetadataHugePages and its callees on the systemstack X-Git-Tag: go1.22rc1~343 X-Git-Url: http://www.git.cypherpunks.ru/?p=gostls13.git;a=commitdiff_plain;h=5f08b4479930af266d4a84c1533b320ed75edba7 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 Run-TryBot: Michael Knyszek Auto-Submit: Michael Knyszek TryBot-Result: Gopher Robot Reviewed-by: Michael Pratt Reviewed-by: Paul Murphy --- 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.