mirror of
https://github.com/golang/go
synced 2024-11-23 05:00:07 -07:00
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
This commit is contained in:
parent
72a2539c38
commit
6c934238c9
@ -2162,11 +2162,11 @@ runtime·newproc1(FuncVal *fn, byte *argp, int32 narg, int32 nret, void *callerp
|
||||
siz = narg + nret;
|
||||
siz = (siz+7) & ~7;
|
||||
|
||||
// We could instead create a secondary stack frame
|
||||
// and make it look like goexit was on the original but
|
||||
// the call to the actual goroutine function was split.
|
||||
// We could allocate a larger initial stack if necessary.
|
||||
// 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");
|
||||
|
||||
p = g->m->p;
|
||||
|
@ -69,16 +69,19 @@ enum {
|
||||
#endif // Plan 9
|
||||
#endif // Windows
|
||||
|
||||
// The amount of extra stack to allocate beyond the size
|
||||
// needed for the single frame that triggered the split.
|
||||
StackExtra = 2048,
|
||||
// The minimum size of stack used by Go code
|
||||
StackMin = 2048,
|
||||
|
||||
// The minimum stack segment size to allocate.
|
||||
// If the amount needed for the splitting frame + StackExtra
|
||||
// is less than this number, the stack will have this size instead.
|
||||
StackMin = 8192,
|
||||
StackSystemRounded = StackSystem + (-StackSystem & (StackMin-1)),
|
||||
FixedStack = StackMin + StackSystemRounded,
|
||||
// The minimum stack size to allocate.
|
||||
// The hackery here rounds FixedStack0 up to a power of 2.
|
||||
FixedStack0 = StackMin + StackSystem,
|
||||
FixedStack1 = FixedStack0 - 1,
|
||||
FixedStack2 = FixedStack1 | (FixedStack1 >> 1),
|
||||
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
|
||||
// instruction to do the stack split check, to avoid overflow
|
||||
|
Loading…
Reference in New Issue
Block a user