From 2d99109cfcaef22b6872dc2e07e4582586c032a2 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 13 Feb 2023 16:20:54 -0500 Subject: runtime: replace all callback uses of gentraceback with unwinder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a really nice simplification for all of these call sites. It also achieves a nice performance improvement for stack copying: goos: linux goarch: amd64 pkg: runtime cpu: Intel(R) Xeon(R) CPU E5-2690 v3 @ 2.60GHz │ before │ after │ │ sec/op │ sec/op vs base │ StackCopyPtr-48 89.25m ± 1% 79.78m ± 1% -10.62% (p=0.000 n=20) StackCopy-48 83.48m ± 2% 71.88m ± 1% -13.90% (p=0.000 n=20) StackCopyNoCache-48 2.504m ± 2% 2.195m ± 1% -12.32% (p=0.000 n=20) StackCopyWithStkobj-48 21.66m ± 1% 21.02m ± 2% -2.95% (p=0.000 n=20) geomean 25.21m 22.68m -10.04% Updates #54466. Change-Id: I31715b7b6efd65726940041d3052bb1c0a1186f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/468297 Run-TryBot: Austin Clements TryBot-Result: Gopher Robot Reviewed-by: Michael Pratt --- src/runtime/mgcmark.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'src/runtime/mgcmark.go') diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index bbb1ca2f6b..d5c981f17a 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -797,11 +797,10 @@ func scanstack(gp *g, gcw *gcWork) int64 { } // Scan the stack. Accumulate a list of stack objects. - scanframe := func(frame *stkframe, unused unsafe.Pointer) bool { - scanframeworker(frame, &state, gcw) - return true + var u unwinder + for u.init(gp, 0); u.valid(); u.next() { + scanframeworker(&u.frame, &state, gcw) } - gentraceback(^uintptr(0), ^uintptr(0), 0, gp, 0, nil, 0x7fffffff, scanframe, nil, 0) // Find additional pointers that point into the stack from the heap. // Currently this includes defers and panics. See also function copystack. -- cgit v1.3-5-g9baa