aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/debug/garbage_test.go4
-rw-r--r--src/runtime/mheap.go9
2 files changed, 13 insertions, 0 deletions
diff --git a/src/runtime/debug/garbage_test.go b/src/runtime/debug/garbage_test.go
index 54c33bd4f3..a392614b1f 100644
--- a/src/runtime/debug/garbage_test.go
+++ b/src/runtime/debug/garbage_test.go
@@ -88,6 +88,10 @@ func TestReadGCStats(t *testing.T) {
var big = make([]byte, 1<<20)
func TestFreeOSMemory(t *testing.T) {
+ switch runtime.GOARCH {
+ case "ppc64", "ppc64le", "nacl":
+ t.Skip("issue 9993; scavenger temporarily disabled on systems with 64k pages")
+ }
var ms1, ms2 runtime.MemStats
if big == nil {
diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go
index a05a570ff1..94ef4de56a 100644
--- a/src/runtime/mheap.go
+++ b/src/runtime/mheap.go
@@ -717,6 +717,15 @@ func mHeap_FreeSpanLocked(h *mheap, s *mspan, acctinuse, acctidle bool, unusedsi
}
func scavengelist(list *mspan, now, limit uint64) uintptr {
+ if _PhysPageSize > _PageSize {
+ // golang.org/issue/9993
+ // If the physical page size of the machine is larger than
+ // our logical heap page size the kernel may round up the
+ // amount to be freed to its page size and corrupt the heap
+ // pages surrounding the unused block.
+ return 0
+ }
+
if mSpanList_IsEmpty(list) {
return 0
}