]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add physHugePageSize
authorMichael Anthony Knyszek <mknyszek@google.com>
Fri, 29 Mar 2019 20:03:29 +0000 (20:03 +0000)
committerMichael Knyszek <mknyszek@google.com>
Fri, 3 May 2019 18:41:45 +0000 (18:41 +0000)
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>
src/runtime/malloc.go
src/runtime/os_linux.go

index c22c7aa7dc1f6675c74acfd20b918b5bc728f4b4..f2cb6085bc6fd46078241c32bfdd58c9268e251b 100644 (file)
@@ -324,6 +324,14 @@ const (
 // mallocinit.
 var physPageSize uintptr
 
+// physHugePageSize is the size in bytes of the OS's default physical huge
+// page size whose allocation is opaque to the application.
+//
+// If set, this must be set by the OS init code (typically in osinit) before
+// mallocinit. However, setting it at all is optional, and leaving the default
+// value is always safe (though potentially less efficient).
+var physHugePageSize uintptr
+
 // OS-defined helpers:
 //
 // sysAlloc obtains a large chunk of zeroed memory from the
index a817020c9026296353ab426a34ad6532c7c91110..ad35b9725107094b6b18619a7add05306bef7850 100644 (file)
@@ -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")