Commit 6c934238 authored by Keith Randall's avatar Keith Randall

runtime: change minimum stack size to 2K.

It will be 8K on windows because it needs 4K for the OS.
Similarly, plan9 will be 4K.

On linux/amd64, reduces size of 100,000 goroutines
from ~819MB to ~245MB.

Update #7514

LGTM=dvyukov
R=golang-codereviews, dvyukov, khr, aram
CC=golang-codereviews
https://golang.org/cl/145790043
parent 72a2539c
...@@ -2162,11 +2162,11 @@ runtime·newproc1(FuncVal *fn, byte *argp, int32 narg, int32 nret, void *callerp ...@@ -2162,11 +2162,11 @@ runtime·newproc1(FuncVal *fn, byte *argp, int32 narg, int32 nret, void *callerp
siz = narg + nret; siz = narg + nret;
siz = (siz+7) & ~7; siz = (siz+7) & ~7;
// We could instead create a secondary stack frame // We could allocate a larger initial stack if necessary.
// and make it look like goexit was on the original but
// the call to the actual goroutine function was split.
// Not worth it: this is almost always an error. // Not worth it: this is almost always an error.
if(siz > StackMin - 1024) // 4*sizeof(uintreg): extra space added below
// sizeof(uintreg): caller's LR (arm) or return address (x86, in gostartcall).
if(siz >= StackMin - 4*sizeof(uintreg) - sizeof(uintreg))
runtime·throw("runtime.newproc: function arguments too large for new goroutine"); runtime·throw("runtime.newproc: function arguments too large for new goroutine");
p = g->m->p; p = g->m->p;
......
...@@ -69,16 +69,19 @@ enum { ...@@ -69,16 +69,19 @@ enum {
#endif // Plan 9 #endif // Plan 9
#endif // Windows #endif // Windows
// The amount of extra stack to allocate beyond the size // The minimum size of stack used by Go code
// needed for the single frame that triggered the split. StackMin = 2048,
StackExtra = 2048,
// The minimum stack segment size to allocate. // The minimum stack size to allocate.
// If the amount needed for the splitting frame + StackExtra // The hackery here rounds FixedStack0 up to a power of 2.
// is less than this number, the stack will have this size instead. FixedStack0 = StackMin + StackSystem,
StackMin = 8192, FixedStack1 = FixedStack0 - 1,
StackSystemRounded = StackSystem + (-StackSystem & (StackMin-1)), FixedStack2 = FixedStack1 | (FixedStack1 >> 1),
FixedStack = StackMin + StackSystemRounded, FixedStack3 = FixedStack2 | (FixedStack2 >> 2),
FixedStack4 = FixedStack3 | (FixedStack3 >> 4),
FixedStack5 = FixedStack4 | (FixedStack4 >> 8),
FixedStack6 = FixedStack5 | (FixedStack5 >> 16),
FixedStack = FixedStack6 + 1,
// Functions that need frames bigger than this use an extra // Functions that need frames bigger than this use an extra
// instruction to do the stack split check, to avoid overflow // instruction to do the stack split check, to avoid overflow
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment