Commit c55eeeb7 authored by Tobias Klauser's avatar Tobias Klauser Committed by Brad Fitzpatrick

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: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
parent ea65d015
...@@ -87,6 +87,7 @@ const ( ...@@ -87,6 +87,7 @@ const (
_CTL_HW = 6 _CTL_HW = 6
_HW_NCPU = 3 _HW_NCPU = 3
_HW_PAGESIZE = 7 _HW_PAGESIZE = 7
_HW_NCPUONLINE = 25
) )
func sysctlInt(mib []uint32) (int32, bool) { func sysctlInt(mib []uint32) (int32, bool) {
...@@ -100,9 +101,14 @@ func sysctlInt(mib []uint32) (int32, bool) { ...@@ -100,9 +101,14 @@ func sysctlInt(mib []uint32) (int32, bool) {
} }
func getncpu() int32 { func getncpu() int32 {
// Fetch hw.ncpu via sysctl. // Try hw.ncpuonline first because hw.ncpu would report a number twice as
if ncpu, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPU}); ok { // high as the actual CPUs running on OpenBSD 6.4 with hyperthreading
return int32(ncpu) // 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 return 1
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment