runtime: call enableMetadataHugePages and its callees on the systemstack Signed-off-by: EulerOSWander <314264452@qq.com> (cherry picked from commit d0a5cf4f0b233ea21ea8d2ad3d7e0a705c0a4863)
90 lines
3.2 KiB
Diff
90 lines
3.2 KiB
Diff
From 05bf700ebeec865b73500bd6a2ae93ddbd051692 Mon Sep 17 00:00:00 2001
|
|
From: Michael Anthony Knyszek <mknyszek@google.com>
|
|
Date: Fri, 10 Nov 2023 21:23:38 +0000
|
|
Subject: [PATCH 04/20] [release-branch.go1.21] runtime: call
|
|
enableMetadataHugePages and its callees on the systemstack
|
|
|
|
Conflict:NA
|
|
Reference:https://go-review.googlesource.com/c/go/+/541635
|
|
|
|
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.
|
|
For #64067.
|
|
Fixes #64073.
|
|
|
|
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>
|
|
(cherry picked from commit 5f08b4479930af266d4a84c1533b320ed75edba7)
|
|
Reviewed-on: https://go-review.googlesource.com/c/go/+/541955
|
|
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
|
|
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
|
|
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
|
|
---
|
|
src/runtime/malloc.go | 4 ++++
|
|
src/runtime/mgc.go | 4 +++-
|
|
src/runtime/mpagealloc.go | 4 ++++
|
|
3 files changed, 11 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go
|
|
index 44479cc2be26..b2026ad0dc72 100644
|
|
--- a/src/runtime/malloc.go
|
|
+++ b/src/runtime/malloc.go
|
|
@@ -853,6 +853,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 de5ae0ae00c4..a12dbfe9df29 100644
|
|
--- a/src/runtime/mgc.go
|
|
+++ b/src/runtime/mgc.go
|
|
@@ -1186,7 +1186,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 3e789ab85cc0..2861fa93ebf0 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.
|
|
--
|
|
2.33.0
|
|
|