From 314fd624343eaa2d110f9b5b192a0a8f354d63ed Mon Sep 17 00:00:00 2001 From: John Graham-Cumming Date: Sat, 24 Nov 2012 15:55:19 +1100 Subject: [PATCH] runtime: implement runtime.SysUnused on FreeBSD madvise was missing so implement it in assembler. This change needs to be extended to the other BSD variantes (Net and Open) Without this change the scavenger will attempt to pass memory back to the operating system when it has become idle, but the memory is not returned and for long running Go processes the total memory used can grow until OOM occurs. I have only been able to test the code on FreeBSD AMD64. The ARM platforms needs testing. R=golang-dev, mikioh.mikioh, dave, jgc, minux.ma CC=golang-dev https://golang.org/cl/6850081 --- src/pkg/runtime/defs_freebsd.go | 7 +++++-- src/pkg/runtime/defs_freebsd_386.h | 1 + src/pkg/runtime/defs_freebsd_amd64.h | 1 + src/pkg/runtime/defs_freebsd_arm.h | 1 + src/pkg/runtime/mem_freebsd.c | 4 +--- src/pkg/runtime/sys_freebsd_386.s | 7 +++++++ src/pkg/runtime/sys_freebsd_amd64.s | 11 +++++++++++ src/pkg/runtime/sys_freebsd_arm.s | 9 +++++++++ 8 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/pkg/runtime/defs_freebsd.go b/src/pkg/runtime/defs_freebsd.go index 306e32197e..0302527936 100644 --- a/src/pkg/runtime/defs_freebsd.go +++ b/src/pkg/runtime/defs_freebsd.go @@ -7,8 +7,9 @@ /* Input to cgo. -GOARCH=amd64 cgo -cdefs defs.go >amd64/defs.h -GOARCH=386 cgo -cdefs defs.go >386/defs.h +GOARCH=amd64 go tool cgo -cdefs defs_freebsd.go >defs_freebsd_amd64.h +GOARCH=386 go tool cgo -cdefs defs_freebsd.go >defs_freebsd_386.h +GOARCH=arm go tool cgo -cdefs defs_freebsd.go >defs_freebsd_arm.h */ package runtime @@ -38,6 +39,8 @@ const ( MAP_PRIVATE = C.MAP_PRIVATE MAP_FIXED = C.MAP_FIXED + MADV_FREE = C.MADV_FREE + SA_SIGINFO = C.SA_SIGINFO SA_RESTART = C.SA_RESTART SA_ONSTACK = C.SA_ONSTACK diff --git a/src/pkg/runtime/defs_freebsd_386.h b/src/pkg/runtime/defs_freebsd_386.h index 29fcb8b576..eb8c7f629f 100644 --- a/src/pkg/runtime/defs_freebsd_386.h +++ b/src/pkg/runtime/defs_freebsd_386.h @@ -11,6 +11,7 @@ enum { MAP_ANON = 0x1000, MAP_PRIVATE = 0x2, MAP_FIXED = 0x10, + MADV_FREE = 0x5, SA_SIGINFO = 0x40, SA_RESTART = 0x2, SA_ONSTACK = 0x1, diff --git a/src/pkg/runtime/defs_freebsd_amd64.h b/src/pkg/runtime/defs_freebsd_amd64.h index 8a222dca4f..a933a9c024 100644 --- a/src/pkg/runtime/defs_freebsd_amd64.h +++ b/src/pkg/runtime/defs_freebsd_amd64.h @@ -11,6 +11,7 @@ enum { MAP_ANON = 0x1000, MAP_PRIVATE = 0x2, MAP_FIXED = 0x10, + MADV_FREE = 0x5, SA_SIGINFO = 0x40, SA_RESTART = 0x2, SA_ONSTACK = 0x1, diff --git a/src/pkg/runtime/defs_freebsd_arm.h b/src/pkg/runtime/defs_freebsd_arm.h index 351259eee9..995129f291 100644 --- a/src/pkg/runtime/defs_freebsd_arm.h +++ b/src/pkg/runtime/defs_freebsd_arm.h @@ -11,6 +11,7 @@ enum { MAP_ANON = 0x1000, MAP_PRIVATE = 0x2, MAP_FIXED = 0x10, + MADV_FREE = 0x5, SA_SIGINFO = 0x40, SA_RESTART = 0x2, SA_ONSTACK = 0x1, diff --git a/src/pkg/runtime/mem_freebsd.c b/src/pkg/runtime/mem_freebsd.c index d1c22583dc..cc31711f8e 100644 --- a/src/pkg/runtime/mem_freebsd.c +++ b/src/pkg/runtime/mem_freebsd.c @@ -23,9 +23,7 @@ runtime·SysAlloc(uintptr n) void runtime·SysUnused(void *v, uintptr n) { - USED(v); - USED(n); - // TODO(rsc): call madvise MADV_DONTNEED + runtime·madvise(v, n, MADV_FREE); } void diff --git a/src/pkg/runtime/sys_freebsd_386.s b/src/pkg/runtime/sys_freebsd_386.s index c386268ff5..9049f1e75b 100644 --- a/src/pkg/runtime/sys_freebsd_386.s +++ b/src/pkg/runtime/sys_freebsd_386.s @@ -102,6 +102,13 @@ TEXT runtime·munmap(SB),7,$-4 MOVL $0xf1, 0xf1 // crash RET +TEXT runtime·madvise(SB),7,$-4 + MOVL $75, AX // madvise + INT $0x80 + JAE 2(PC) + MOVL $0xf1, 0xf1 // crash + RET + TEXT runtime·setitimer(SB), 7, $-4 MOVL $83, AX INT $0x80 diff --git a/src/pkg/runtime/sys_freebsd_amd64.s b/src/pkg/runtime/sys_freebsd_amd64.s index 3d25db2ce7..d66aed107c 100644 --- a/src/pkg/runtime/sys_freebsd_amd64.s +++ b/src/pkg/runtime/sys_freebsd_amd64.s @@ -184,6 +184,17 @@ TEXT runtime·munmap(SB),7,$0 MOVL $0xf1, 0xf1 // crash RET +TEXT runtime·madvise(SB),7,$0 + MOVQ 8(SP), DI + MOVQ 16(SP), SI + MOVQ 24(SP), DX + MOVQ $75, AX // madvise + SYSCALL + CMPQ AX, $0xfffffffffffff001 + JLS 2(PC) + MOVL $0xf1, 0xf1 // crash + RET + TEXT runtime·sigaltstack(SB),7,$-8 MOVQ new+8(SP), DI MOVQ old+16(SP), SI diff --git a/src/pkg/runtime/sys_freebsd_arm.s b/src/pkg/runtime/sys_freebsd_arm.s index 097fcd0457..1edf8071bb 100644 --- a/src/pkg/runtime/sys_freebsd_arm.s +++ b/src/pkg/runtime/sys_freebsd_arm.s @@ -187,6 +187,15 @@ TEXT runtime·munmap(SB),7,$0 MOVW.CS R9, (R9) RET +TEXT runtime·madvise(SB),7,$0 + MOVW 0(FP), R0 // arg 1 addr + MOVW 4(FP), R1 // arg 2 len + MOVW 8(FP), R2 // arg 3 flags + SWI $75 + MOVW.CS $0, R9 // crash on syscall failure + MOVW.CS R9, (R9) + RET + TEXT runtime·sigaltstack(SB),7,$-8 MOVW new+0(FP), R0 MOVW old+4(FP), R1 -- 2.48.1