Skip to content

Commit 19a4804

Browse files
tklausergopherbot
authored andcommitted
runtime: support MADV_DONTNEED on the BSDs and Solaris/Illumos
Like on Linux, use GODEBUG=madvdontneed=1 to enable madvise with MADV_DONTNEED instead of MADV_FREE. Based on previous work by Marcelo Araujo in CL 181498. Fixes #32519 Change-Id: Ib49faf05c42a65591b90e75f663146f213030529 Reviewed-on: https://go-review.googlesource.com/c/go/+/266937 Reviewed-by: Michael Knyszek <[email protected]> Auto-Submit: Tobias Klauser <[email protected]> Run-TryBot: Tobias Klauser <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Heschi Kreinick <[email protected]>
1 parent 121344a commit 19a4804

22 files changed

+49
-22
lines changed

src/runtime/defs1_netbsd_386.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const (
2020
_MAP_PRIVATE = 0x2
2121
_MAP_FIXED = 0x10
2222

23-
_MADV_FREE = 0x6
23+
_MADV_DONTNEED = 0x4
24+
_MADV_FREE = 0x6
2425

2526
_SA_SIGINFO = 0x40
2627
_SA_RESTART = 0x2

src/runtime/defs1_netbsd_amd64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const (
2020
_MAP_PRIVATE = 0x2
2121
_MAP_FIXED = 0x10
2222

23-
_MADV_FREE = 0x6
23+
_MADV_DONTNEED = 0x4
24+
_MADV_FREE = 0x6
2425

2526
_SA_SIGINFO = 0x40
2627
_SA_RESTART = 0x2

src/runtime/defs1_netbsd_arm.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const (
2020
_MAP_PRIVATE = 0x2
2121
_MAP_FIXED = 0x10
2222

23-
_MADV_FREE = 0x6
23+
_MADV_DONTNEED = 0x4
24+
_MADV_FREE = 0x6
2425

2526
_SA_SIGINFO = 0x40
2627
_SA_RESTART = 0x2

src/runtime/defs1_netbsd_arm64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const (
2020
_MAP_PRIVATE = 0x2
2121
_MAP_FIXED = 0x10
2222

23-
_MADV_FREE = 0x6
23+
_MADV_DONTNEED = 0x4
24+
_MADV_FREE = 0x6
2425

2526
_SA_SIGINFO = 0x40
2627
_SA_RESTART = 0x2

src/runtime/defs1_solaris_amd64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ const (
2323
_MAP_PRIVATE = 0x2
2424
_MAP_FIXED = 0x10
2525

26-
_MADV_FREE = 0x5
26+
_MADV_DONTNEED = 0x4
27+
_MADV_FREE = 0x5
2728

2829
_SA_SIGINFO = 0x8
2930
_SA_RESTART = 0x4

src/runtime/defs_dragonfly.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ const (
4444
MAP_PRIVATE = C.MAP_PRIVATE
4545
MAP_FIXED = C.MAP_FIXED
4646

47-
MADV_FREE = C.MADV_FREE
47+
MADV_DONTNEED = C.MADV_DONTNEED
48+
MADV_FREE = C.MADV_FREE
4849

4950
SA_SIGINFO = C.SA_SIGINFO
5051
SA_RESTART = C.SA_RESTART

src/runtime/defs_dragonfly_amd64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ const (
2323
_MAP_PRIVATE = 0x2
2424
_MAP_FIXED = 0x10
2525

26-
_MADV_FREE = 0x5
26+
_MADV_DONTNEED = 0x4
27+
_MADV_FREE = 0x5
2728

2829
_SA_SIGINFO = 0x40
2930
_SA_RESTART = 0x2

src/runtime/defs_freebsd.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ const (
6262
MAP_PRIVATE = C.MAP_PRIVATE
6363
MAP_FIXED = C.MAP_FIXED
6464

65-
MADV_FREE = C.MADV_FREE
65+
MADV_DONTNEED = C.MADV_DONTNEED
66+
MADV_FREE = C.MADV_FREE
6667

6768
SA_SIGINFO = C.SA_SIGINFO
6869
SA_RESTART = C.SA_RESTART

src/runtime/defs_freebsd_386.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ const (
3131
_MAP_PRIVATE = 0x2
3232
_MAP_FIXED = 0x10
3333

34-
_MADV_FREE = 0x5
34+
_MADV_DONTNEED = 0x4
35+
_MADV_FREE = 0x5
3536

3637
_SA_SIGINFO = 0x40
3738
_SA_RESTART = 0x2

src/runtime/defs_freebsd_amd64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ const (
3131
_MAP_PRIVATE = 0x2
3232
_MAP_FIXED = 0x10
3333

34-
_MADV_FREE = 0x5
34+
_MADV_DONTNEED = 0x4
35+
_MADV_FREE = 0x5
3536

3637
_SA_SIGINFO = 0x40
3738
_SA_RESTART = 0x2

src/runtime/defs_freebsd_arm.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ const (
3131
_MAP_PRIVATE = 0x2
3232
_MAP_FIXED = 0x10
3333

34-
_MADV_FREE = 0x5
34+
_MADV_DONTNEED = 0x4
35+
_MADV_FREE = 0x5
3536

3637
_SA_SIGINFO = 0x40
3738
_SA_RESTART = 0x2

src/runtime/defs_freebsd_arm64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ const (
3131
_MAP_PRIVATE = 0x2
3232
_MAP_FIXED = 0x10
3333

34-
_MADV_FREE = 0x5
34+
_MADV_DONTNEED = 0x4
35+
_MADV_FREE = 0x5
3536

3637
_SA_SIGINFO = 0x40
3738
_SA_RESTART = 0x2

src/runtime/defs_netbsd.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ const (
4646
MAP_PRIVATE = C.MAP_PRIVATE
4747
MAP_FIXED = C.MAP_FIXED
4848

49-
MADV_FREE = C.MADV_FREE
49+
MADV_DONTNEED = C.MADV_DONTNEED
50+
MADV_FREE = C.MADV_FREE
5051

5152
SA_SIGINFO = C.SA_SIGINFO
5253
SA_RESTART = C.SA_RESTART

src/runtime/defs_openbsd.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ const (
4848
MAP_FIXED = C.MAP_FIXED
4949
MAP_STACK = C.MAP_STACK
5050

51-
MADV_FREE = C.MADV_FREE
51+
MADV_DONTNEED = C.MADV_DONTNEED
52+
MADV_FREE = C.MADV_FREE
5253

5354
SA_SIGINFO = C.SA_SIGINFO
5455
SA_RESTART = C.SA_RESTART

src/runtime/defs_openbsd_386.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ const (
2323
_MAP_FIXED = 0x10
2424
_MAP_STACK = 0x4000
2525

26-
_MADV_FREE = 0x6
26+
_MADV_DONTNEED = 0x4
27+
_MADV_FREE = 0x6
2728

2829
_SA_SIGINFO = 0x40
2930
_SA_RESTART = 0x2

src/runtime/defs_openbsd_amd64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ const (
2323
_MAP_FIXED = 0x10
2424
_MAP_STACK = 0x4000
2525

26-
_MADV_FREE = 0x6
26+
_MADV_DONTNEED = 0x4
27+
_MADV_FREE = 0x6
2728

2829
_SA_SIGINFO = 0x40
2930
_SA_RESTART = 0x2

src/runtime/defs_openbsd_arm.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ const (
2323
_MAP_FIXED = 0x10
2424
_MAP_STACK = 0x4000
2525

26-
_MADV_FREE = 0x6
26+
_MADV_DONTNEED = 0x4
27+
_MADV_FREE = 0x6
2728

2829
_SA_SIGINFO = 0x40
2930
_SA_RESTART = 0x2

src/runtime/defs_openbsd_arm64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ const (
2424
_MAP_FIXED = 0x10
2525
_MAP_STACK = 0x4000
2626

27-
_MADV_FREE = 0x6
27+
_MADV_DONTNEED = 0x4
28+
_MADV_FREE = 0x6
2829

2930
_SA_SIGINFO = 0x40
3031
_SA_RESTART = 0x2

src/runtime/defs_openbsd_mips64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ const (
3030
_MAP_FIXED = 0x10
3131
_MAP_STACK = 0x4000
3232

33-
_MADV_FREE = 0x6
33+
_MADV_DONTNEED = 0x4
34+
_MADV_FREE = 0x6
3435

3536
_SA_SIGINFO = 0x40
3637
_SA_RESTART = 0x2

src/runtime/defs_solaris.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ const (
5353
MAP_PRIVATE = C.MAP_PRIVATE
5454
MAP_FIXED = C.MAP_FIXED
5555

56-
MADV_FREE = C.MADV_FREE
56+
MADV_DONTNEED = C.MADV_DONTNEED
57+
MADV_FREE = C.MADV_FREE
5758

5859
SA_SIGINFO = C.SA_SIGINFO
5960
SA_RESTART = C.SA_RESTART

src/runtime/extern.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ It is a comma-separated list of name=val pairs setting these named variables:
118118
madvdontneed: setting madvdontneed=0 will use MADV_FREE
119119
instead of MADV_DONTNEED on Linux when returning memory to the
120120
kernel. This is more efficient, but means RSS numbers will
121-
drop only when the OS is under memory pressure.
121+
drop only when the OS is under memory pressure. On the BSDs and
122+
Illumos/Solaris, setting madvdontneed=1 will use MADV_DONTNEED instead
123+
of MADV_FREE. This is less efficient, but causes RSS numbers to drop
124+
more quickly.
122125
123126
memprofilerate: setting memprofilerate=X will update the value of runtime.MemProfileRate.
124127
When set to 0 memory profiling is disabled. Refer to the description of

src/runtime/mem_bsd.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ func sysAllocOS(n uintptr) unsafe.Pointer {
2323
}
2424

2525
func sysUnusedOS(v unsafe.Pointer, n uintptr) {
26-
madvise(v, n, _MADV_FREE)
26+
if debug.madvdontneed != 0 {
27+
madvise(v, n, _MADV_DONTNEED)
28+
} else {
29+
madvise(v, n, _MADV_FREE)
30+
}
2731
}
2832

2933
func sysUsedOS(v unsafe.Pointer, n uintptr) {

0 commit comments

Comments
 (0)