Skip to content

Commit

Permalink
runtime: call enableMetadataHugePages and its callees on the systemstack
Browse files Browse the repository at this point in the history
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 <[email protected]>
Run-TryBot: Michael Knyszek <[email protected]>
Auto-Submit: Michael Knyszek <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
Reviewed-by: Michael Pratt <[email protected]>
Reviewed-by: Paul Murphy <[email protected]>
  • Loading branch information
mknyszek authored and gopherbot committed Nov 13, 2023
1 parent 8da6405 commit 5f08b44
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 1 deletion.
4 changes: 4 additions & 0 deletions src/runtime/malloc.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
4 changes: 3 additions & 1 deletion src/runtime/mgc.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions src/runtime/mpagealloc.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 5f08b44

Please sign in to comment.