]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use mincore correctly in addrspace_free
authorRuss Cox <rsc@golang.org>
Thu, 3 Apr 2014 23:04:47 +0000 (19:04 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 3 Apr 2014 23:04:47 +0000 (19:04 -0400)
Fixes #7476.

LGTM=iant
R=iant
CC=golang-codereviews
https://golang.org/cl/84000043

src/pkg/runtime/mem_linux.c

index 3f997be96b609292967688d7bf0cdbd53288130e..635594c3651065afed06b3c5a67f8326ed79d93e 100644 (file)
@@ -20,15 +20,22 @@ addrspace_free(void *v, uintptr n)
        int32 errval;
        uintptr chunk;
        uintptr off;
-       static byte vec[4096];
+       
+       // NOTE: vec must be just 1 byte long here.
+       // Mincore returns ENOMEM if any of the pages are unmapped,
+       // but we want to know that all of the pages are unmapped.
+       // To make these the same, we can only ask about one page
+       // at a time. See golang.org/issue/7476.
+       static byte vec[1];
 
        for(off = 0; off < n; off += chunk) {
                chunk = _PAGE_SIZE * sizeof vec;
                if(chunk > (n - off))
                        chunk = n - off;
                errval = runtime·mincore((int8*)v + off, chunk, vec);
-               // errval is 0 if success, or -(error_code) if error.
-               if (errval == 0 || errval != -ENOMEM)
+               // ENOMEM means unmapped, which is what we want.
+               // Anything else we assume means the pages are mapped.
+               if (errval != -ENOMEM)
                        return 0;
        }
        return 1;