From 17edb3310d8ce9d5f6c9e53f6c1f7d611c2a5a41 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 12 Feb 2020 20:35:50 -0800 Subject: [PATCH] runtime: on 32-bit systems, limit default GOMAXPROCS to 32 Otherwise we can easily run out of stack space for threads. The user can still override by setting GOMAXPROCS. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/219278 --- gcc/go/gofrontend/MERGE | 2 +- libgo/go/runtime/proc.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 27f4ce342e5..9916b02c57f 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -c94637ad6fd38d4814fb02d094a1a73f19323d71 +3e46519cee5c916a9b39480fbac13f4ffc6a93b0 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go index c0e85773098..e3f934ae7bd 100644 --- a/libgo/go/runtime/proc.go +++ b/libgo/go/runtime/proc.go @@ -563,6 +563,14 @@ func schedinit() { sched.lastpoll = uint64(nanotime()) procs := ncpu + + // In 32-bit mode, we can burn a lot of memory on thread stacks. + // Try to avoid this by limiting the number of threads we run + // by default. + if sys.PtrSize == 4 && procs > 32 { + procs = 32 + } + if n, ok := atoi32(gogetenv("GOMAXPROCS")); ok && n > 0 { procs = n } -- 2.30.2