diff options
| author | Michael Anthony Knyszek <mknyszek@google.com> | 2019-03-29 20:03:29 +0000 |
|---|---|---|
| committer | Michael Knyszek <mknyszek@google.com> | 2019-05-03 18:41:45 +0000 |
| commit | 1033065ee381da075e458de0420d0a5838e910cb (patch) | |
| tree | 67d8c179614cd267be7ec060101e1a138faefe8e /src/runtime/os_linux.go | |
| parent | 8b2bd6f5ff3edf24b39294c7d1a86afbd1cfc4f1 (diff) | |
| download | go-1033065ee381da075e458de0420d0a5838e910cb.tar.xz | |
runtime: add physHugePageSize
This change adds the global physHugePageSize which is initialized in
osinit(). physHugePageSize contains the system's transparent huge page
(or superpage) size in bytes.
For #30333.
Change-Id: I2f0198c40729dbbe6e6f2676cef1d57dd107562c
Reviewed-on: https://go-review.googlesource.com/c/go/+/170858
Run-TryBot: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/os_linux.go')
| -rw-r--r-- | src/runtime/os_linux.go | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index a817020c90..ad35b97251 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -261,8 +261,31 @@ func sysauxv(auxv []uintptr) int { return i / 2 } +var sysTHPSizePath = []byte("/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\x00") + +func getHugePageSize() uintptr { + var numbuf [20]byte + fd := open(&sysTHPSizePath[0], 0 /* O_RDONLY */, 0) + if fd < 0 { + return 0 + } + n := read(fd, noescape(unsafe.Pointer(&numbuf[0])), int32(len(numbuf))) + if n <= 0 { + closefd(fd) + return 0 + } + l := n - 1 // remove trailing newline + v, ok := atoi(slicebytetostringtmp(numbuf[:l])) + if !ok || v < 0 { + v = 0 + } + closefd(fd) + return uintptr(v) +} + func osinit() { ncpu = getproccount() + physHugePageSize = getHugePageSize() } var urandom_dev = []byte("/dev/urandom\x00") |
