]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: improve efence
authorDmitriy Vyukov <dvyukov@google.com>
Thu, 13 Mar 2014 15:04:00 +0000 (19:04 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Thu, 13 Mar 2014 15:04:00 +0000 (19:04 +0400)
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
src/pkg/runtime/mem_dragonfly.c
src/pkg/runtime/mem_freebsd.c
src/pkg/runtime/mem_linux.c
src/pkg/runtime/mem_nacl.c
src/pkg/runtime/mem_netbsd.c
src/pkg/runtime/mem_openbsd.c
src/pkg/runtime/mem_solaris.c
src/pkg/runtime/mem_windows.c

index fe99c1aff157b4b3b4a872793c0d72293355795a..47fe2a525ffbd7f5b4152c00b24b6bf017da18b4 100644 (file)
@@ -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*
index f19a39950b250fca18d5da255f61b2b0b55d0612..ada820c2de814b134e11c2b7aace74da80543b95 100644 (file)
@@ -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*
index b8895567d2143ff26031d660bb43f50cb75a1f2a..1d6024013b8d5e7c1ffdd7a0242dfe49eeba993e 100644 (file)
@@ -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*
index bab05011ff1003ec053b493a59046b5a546f4f7c..2ead204101fb71ff38513689ec4bd0ba1e90cf72 100644 (file)
@@ -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*
index b3cf91d7f0e37294438fb29de7b450fa28f74ed3..c743259cc06d1d4129ab1f5a8a0046fc2c902580 100644 (file)
@@ -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*
index 5ad7937d0f281ec5022a263183757f501c083753..ed0a05836999fc7dc0651591d2b1bde11750088d 100644 (file)
@@ -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*
index 5ad7937d0f281ec5022a263183757f501c083753..ed0a05836999fc7dc0651591d2b1bde11750088d 100644 (file)
@@ -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*
index 2379cdff9f85dc7bfac6640814782a8c1dfd3d7b..f82a25b031275e443fa1263a17eb5f981f8278f1 100644 (file)
@@ -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*
index 3c6fef60cff75a71f29bccfe91f01cec90986c89..c08200825995c9a0628d16df40e80f69b44c1622 100644 (file)
@@ -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*