aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2019-02-08 09:25:05 +0100
committerBrad Fitzpatrick <bradfitz@golang.org>2019-02-26 22:56:59 +0000
commitc55eeeb718b0dfd008f0d722c8b8d05f8b02d62b (patch)
treeb2b67cd0ed74418c3cd976b65965a01cbc5ba674
parentea65d015b838f2ca75debacacbbb039fe5e96b26 (diff)
downloadgo-c55eeeb718b0dfd008f0d722c8b8d05f8b02d62b.tar.xz
runtime: use hw.ncpuonline sysctl in getncpu on openbsd
The number of CPUs reported by the hw.ncpu sysctl is twice as high as the actual number of CPUs running on OpenBSD 6.4. with hyperthreading disabled (hw.smt=0). Try hw.cpuonline first and fall back to hw.ncpu in case it fails (which is the case on older OpenBSD before 6.4). Fixes #30127 Change-Id: Id091234b8038cc9f7c40519d039fc1a05437c40d Reviewed-on: https://go-review.googlesource.com/c/161757 Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
-rw-r--r--src/runtime/os_openbsd.go18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go
index 96112cb25b..353a5d94ba 100644
--- a/src/runtime/os_openbsd.go
+++ b/src/runtime/os_openbsd.go
@@ -84,9 +84,10 @@ const (
_CTL_KERN = 1
_KERN_OSREV = 3
- _CTL_HW = 6
- _HW_NCPU = 3
- _HW_PAGESIZE = 7
+ _CTL_HW = 6
+ _HW_NCPU = 3
+ _HW_PAGESIZE = 7
+ _HW_NCPUONLINE = 25
)
func sysctlInt(mib []uint32) (int32, bool) {
@@ -100,9 +101,14 @@ func sysctlInt(mib []uint32) (int32, bool) {
}
func getncpu() int32 {
- // Fetch hw.ncpu via sysctl.
- if ncpu, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPU}); ok {
- return int32(ncpu)
+ // Try hw.ncpuonline first because hw.ncpu would report a number twice as
+ // high as the actual CPUs running on OpenBSD 6.4 with hyperthreading
+ // disabled (hw.smt=0). See https://golang.org/issue/30127
+ if n, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPUONLINE}); ok {
+ return int32(n)
+ }
+ if n, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPU}); ok {
+ return int32(n)
}
return 1
}