src/runtime/malloc.go | 4 ++++ src/runtime/mgc.go | 4 +++- src/runtime/mpagealloc.go | 4 ++++ diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go index 44479cc2be262ccd81ebcf1c9e6144d3cbdac3fa..b2026ad0dc72d7e9b5ed9f83a78cdb9f6cf39b04 100644 --- a/src/runtime/malloc.go +++ b/src/runtime/malloc.go @@ -853,6 +853,10 @@ // This function is idempotent. // // 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 de5ae0ae00c4f1e6b12b104e98cb43704caa0555..a12dbfe9df292cad9da9ba100f91af905de770bf 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -1186,7 +1186,9 @@ } // 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 3e789ab85cc0192587dde791cc8fab5f113a2cee..2861fa93ebf0d5c8c937f25453f287d14eb2ac51 100644 --- a/src/runtime/mpagealloc.go +++ b/src/runtime/mpagealloc.go @@ -437,6 +437,10 @@ // time, but may take time proportional to the size of the mapped heap beyond that. // // 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.