]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: grow stack more than 2x if the new frame is large
authorKeith Randall <khr@golang.org>
Fri, 27 Mar 2020 18:17:00 +0000 (11:17 -0700)
committerKeith Randall <khr@golang.org>
Thu, 7 May 2020 18:31:25 +0000 (18:31 +0000)
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 <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/stack.go

index eeac66d1ceca66680c06e33be0ef91954af2adb3..6e1f07bf73375ddc8e0b4f4dbb86644de18bf9b7 100644 (file)
@@ -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")