From c115cda22c82e219654056f6864e9819b922febc Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Thu, 13 Mar 2014 19:04:00 +0400 Subject: [PATCH] runtime: improve efence Mark free memory blocks as unused. On amd64 it allows the process to eat all 128 GB of heap without killing the machine. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/74070043 --- src/pkg/runtime/mem_darwin.c | 2 +- src/pkg/runtime/mem_dragonfly.c | 2 +- src/pkg/runtime/mem_freebsd.c | 2 +- src/pkg/runtime/mem_linux.c | 2 +- src/pkg/runtime/mem_nacl.c | 2 +- src/pkg/runtime/mem_netbsd.c | 2 +- src/pkg/runtime/mem_openbsd.c | 2 +- src/pkg/runtime/mem_solaris.c | 2 +- src/pkg/runtime/mem_windows.c | 7 ++----- 9 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/pkg/runtime/mem_darwin.c b/src/pkg/runtime/mem_darwin.c index fe99c1aff1..47fe2a525f 100644 --- a/src/pkg/runtime/mem_darwin.c +++ b/src/pkg/runtime/mem_darwin.c @@ -44,7 +44,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_dragonfly.c b/src/pkg/runtime/mem_dragonfly.c index f19a39950b..ada820c2de 100644 --- a/src/pkg/runtime/mem_dragonfly.c +++ b/src/pkg/runtime/mem_dragonfly.c @@ -48,7 +48,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_freebsd.c b/src/pkg/runtime/mem_freebsd.c index b8895567d2..1d6024013b 100644 --- a/src/pkg/runtime/mem_freebsd.c +++ b/src/pkg/runtime/mem_freebsd.c @@ -48,7 +48,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_linux.c b/src/pkg/runtime/mem_linux.c index bab05011ff..2ead204101 100644 --- a/src/pkg/runtime/mem_linux.c +++ b/src/pkg/runtime/mem_linux.c @@ -95,7 +95,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_nacl.c b/src/pkg/runtime/mem_nacl.c index b3cf91d7f0..c743259cc0 100644 --- a/src/pkg/runtime/mem_nacl.c +++ b/src/pkg/runtime/mem_nacl.c @@ -56,7 +56,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_netbsd.c b/src/pkg/runtime/mem_netbsd.c index 5ad7937d0f..ed0a058369 100644 --- a/src/pkg/runtime/mem_netbsd.c +++ b/src/pkg/runtime/mem_netbsd.c @@ -48,7 +48,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_openbsd.c b/src/pkg/runtime/mem_openbsd.c index 5ad7937d0f..ed0a058369 100644 --- a/src/pkg/runtime/mem_openbsd.c +++ b/src/pkg/runtime/mem_openbsd.c @@ -48,7 +48,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_solaris.c b/src/pkg/runtime/mem_solaris.c index 2379cdff9f..f82a25b031 100644 --- a/src/pkg/runtime/mem_solaris.c +++ b/src/pkg/runtime/mem_solaris.c @@ -49,7 +49,7 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - runtime·mmap(v, n, PROT_NONE, 0, -1, 0); + runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); } void* diff --git a/src/pkg/runtime/mem_windows.c b/src/pkg/runtime/mem_windows.c index 3c6fef60cf..c082008259 100644 --- a/src/pkg/runtime/mem_windows.c +++ b/src/pkg/runtime/mem_windows.c @@ -66,11 +66,8 @@ runtime·SysFree(void *v, uintptr n, uint64 *stat) void runtime·SysFault(void *v, uintptr n) { - uintptr r, old; - - r = (uintptr)runtime·stdcall(runtime·VirtualProtect, 4, v, n, (uintptr)PAGE_NOACCESS, &old); - if(r == 0) - runtime·throw("runtime: failed to protect pages"); + // SysUnused makes the memory inaccessible and prevents its reuse + runtime·SysUnused(v, n); } void* -- 2.48.1