From 921699fe5f67a2e5246badc8f626cc70a615ad1c Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 19 Apr 2023 14:01:05 -0400 Subject: runtime, cmd: rationalize StackLimit and StackGuard The current definitions of StackLimit and StackGuard only indirectly specify the NOSPLIT stack limit and duplicate a literal constant (928). Currently, they define the stack guard delta, and from there compute the NOSPLIT limit. Rationalize these by defining a new constant, abi.StackNosplitBase, which consolidates and directly specifies the NOSPLIT stack limit (in the default case). From this we then compute the stack guard delta, inverting the relationship between these two constants. While we're here, we rename StackLimit to StackNosplit to make it clearer what's being limited. This change does not affect the values of these constants in the default configuration. It does slightly change how StackGuardMultiplier values other than 1 affect the constants, but this multiplier is a pretty rough heuristic anyway. before after stackNosplit 800 800 _StackGuard 928 928 stackNosplit -race 1728 1600 _StackGuard -race 1856 1728 For #59670. Change-Id: Ibe20825ebe0076bbd7b0b7501177b16c9dbcb79e Reviewed-on: https://go-review.googlesource.com/c/go/+/486380 Run-TryBot: Austin Clements Reviewed-by: Cherry Mui TryBot-Result: Gopher Robot --- src/runtime/stack.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'src/runtime/stack.go') diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 39dbed5114..708a6ee2e5 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -85,19 +85,18 @@ const ( _FixedStack6 = _FixedStack5 | (_FixedStack5 >> 16) _FixedStack = _FixedStack6 + 1 + // stackNosplit is the maximum number of bytes that a chain of NOSPLIT + // functions can use. + // This arithmetic must match that in cmd/internal/objabi/stack.go:StackNosplit. + stackNosplit = abi.StackNosplitBase * sys.StackGuardMultiplier + // The stack guard is a pointer this many bytes above the // bottom of the stack. // - // The guard leaves enough room for one _StackSmall frame plus - // a _StackLimit chain of NOSPLIT calls plus _StackSystem - // bytes for the OS. - // This arithmetic must match that in cmd/internal/objabi/stack.go:StackLimit. - _StackGuard = 928*sys.StackGuardMultiplier + _StackSystem - - // The maximum number of bytes that a chain of NOSPLIT - // functions can use. + // The guard leaves enough room for a stackNosplit chain of NOSPLIT calls + // plus one stackSmall frame plus stackSystem bytes for the OS. // This arithmetic must match that in cmd/internal/objabi/stack.go:StackLimit. - _StackLimit = _StackGuard - _StackSystem - abi.StackSmall + _StackGuard = stackNosplit + _StackSystem + abi.StackSmall ) const ( @@ -1211,7 +1210,7 @@ func shrinkstack(gp *g) { // down to the SP plus the stack guard space that ensures // there's room for nosplit functions. avail := gp.stack.hi - gp.stack.lo - if used := gp.stack.hi - gp.sched.sp + _StackLimit; used >= avail/4 { + if used := gp.stack.hi - gp.sched.sp + stackNosplit; used >= avail/4 { return } -- cgit v1.3