aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2019-11-07 02:54:50 +0000
committerMichael Knyszek <mknyszek@google.com>2019-11-07 15:51:45 +0000
commit947f8504d950648fc1a291925bce142ddfc3b4fa (patch)
tree3abe7a7aa198819f26c1d65b36ddbf115b123ae0 /src/runtime
parentf7d0a4212167bf15d64fbcfb5587f3c5636e1874 (diff)
downloadgo-947f8504d950648fc1a291925bce142ddfc3b4fa.tar.xz
runtime: map reserved memory as NORESERVE on solaris
This changes makes it so that sysReserve, which creates a PROT_NONE mapping, maps that memory as NORESERVE. Before this change, relatively large PROT_NONE mappings could cause fork to fail with ENOMEM, reported as "not enough space". Presumably this refers to swap space, since adding this flag causes the failures to go away. This helps unblock page allocator work, since it allows us to make large PROT_NONE mappings on solaris safely. Updates #35112. Change-Id: Ic3cba310c626e93d5db0f27269e2569bb7bc393e Reviewed-on: https://go-review.googlesource.com/c/go/+/205759 Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/mem_bsd.go12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/runtime/mem_bsd.go b/src/runtime/mem_bsd.go
index ad23539523..4d860e7bd3 100644
--- a/src/runtime/mem_bsd.go
+++ b/src/runtime/mem_bsd.go
@@ -44,8 +44,18 @@ func sysFault(v unsafe.Pointer, n uintptr) {
mmap(v, n, _PROT_NONE, _MAP_ANON|_MAP_PRIVATE|_MAP_FIXED, -1, 0)
}
+// Indicates not to reserve swap space for the mapping.
+const _sunosMAP_NORESERVE = 0x40
+
func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer {
- p, err := mmap(v, n, _PROT_NONE, _MAP_ANON|_MAP_PRIVATE, -1, 0)
+ flags := int32(_MAP_ANON | _MAP_PRIVATE)
+ if GOOS == "solaris" || GOOS == "illumos" {
+ // Be explicit that we don't want to reserve swap space
+ // for PROT_NONE anonymous mappings. This avoids an issue
+ // wherein large mappings can cause fork to fail.
+ flags |= _sunosMAP_NORESERVE
+ }
+ p, err := mmap(v, n, _PROT_NONE, flags, -1, 0)
if err != 0 {
return nil
}