From b1760f3a27ed9a0e99599bf028b2b48403f8c3fc Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 27 Mar 2020 11:17:00 -0700 Subject: [PATCH] runtime: grow stack more than 2x if the new frame is large We might as well grow the stack at least as large as we'll need for the frame that is calling morestack. It doesn't help with the lots-of-small-frames case, but it may help a bit with the few-big-frames case. Update #18138 Change-Id: I1f49c97706a70e20b30433cbec99a7901528ea52 Reviewed-on: https://go-review.googlesource.com/c/go/+/225800 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/stack.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/runtime/stack.go b/src/runtime/stack.go index eeac66d1ce..6e1f07bf73 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -1033,6 +1033,17 @@ func newstack() { // Allocate a bigger segment and move the stack. oldsize := gp.stack.hi - gp.stack.lo newsize := oldsize * 2 + + // Make sure we grow at least as much as needed to fit the new frame. + // (This is just an optimization - the caller of morestack will + // recheck the bounds on return.) + if f := findfunc(gp.sched.pc); f.valid() { + max := uintptr(funcMaxSPDelta(f)) + for newsize-oldsize < max+_StackGuard { + newsize *= 2 + } + } + if newsize > maxstacksize { print("runtime: goroutine stack exceeds ", maxstacksize, "-byte limit\n") print("runtime: sp=", hex(sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n") -- 2.50.0