diff --git a/backport-0017-release-branch.go1.21-runtime-call-enableMetadataHug.patch b/backport-0017-release-branch.go1.21-runtime-call-enableMetadataHug.patch new file mode 100644 index 0000000..dec6f61 --- /dev/null +++ b/backport-0017-release-branch.go1.21-runtime-call-enableMetadataHug.patch @@ -0,0 +1,89 @@ +From 05bf700ebeec865b73500bd6a2ae93ddbd051692 Mon Sep 17 00:00:00 2001 +From: Michael Anthony Knyszek +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 +Run-TryBot: Michael Knyszek +Auto-Submit: Michael Knyszek +TryBot-Result: Gopher Robot +Reviewed-by: Michael Pratt +Reviewed-by: Paul Murphy +(cherry picked from commit 5f08b4479930af266d4a84c1533b320ed75edba7) +Reviewed-on: https://go-review.googlesource.com/c/go/+/541955 +Reviewed-by: Dmitri Shuralyov +Reviewed-by: Dmitri Shuralyov +Auto-Submit: Dmitri Shuralyov +--- + 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 + diff --git a/golang.spec b/golang.spec index 6600842..26e5a8e 100644 --- a/golang.spec +++ b/golang.spec @@ -66,7 +66,7 @@ Name: golang Version: 1.21.4 -Release: 18 +Release: 19 Summary: The Go Programming Language License: BSD and Public Domain URL: https://golang.org/ @@ -137,6 +137,7 @@ Patch6013: backport-0013-release-branch.go1.21-net-http-update-bundled-golang.pa Patch6014: backport-0014-cmd-compile-handle-constant-pointer-offsets-in-dead-.patch Patch6015: backport-0015-release-branch.go1.21-cmd-compile-ensure-pointer-ari.patch Patch6016: backport-0016-release-branch.go1.21-internal-poll-add-SPLICE_F_NON.patch +Patch6017: backport-0017-release-branch.go1.21-runtime-call-enableMetadataHug.patch ExclusiveArch: %{golang_arches} @@ -375,6 +376,10 @@ fi %files devel -f go-tests.list -f go-misc.list -f go-src.list %changelog + +* Thu Aug 1 2024 EulerOSWander <314264452@qq.com> - 1.21.4-19 +- runtime: call enableMetadataHugePages and its callees on the systemstack + * Thu Aug 1 2024 EulerOSWander <314264452@qq.com> - 1.21.4-18 - internal/poll:add SPLICE_F_NONBLOCK flag for splice to avoid insonsistency with O_NONBLOCK