Detect the NetBSD version in osinit and only enable the workaround for
the kernel bug identified in #42515 for NetBSD versions older than 9.2.
For #42515
For #46495
Change-Id: I808846c7f8e47e5f7cc0a2f869246f4bd90d8e22
Reviewed-on: https://go-review.googlesource.com/c/go/+/324472
Trust: Tobias Klauser <tobias.klauser@gmail.com>
Trust: Benny Siegert <bsiegert@gmail.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
// From NetBSD's <sys/sysctl.h>
const (
+ _CTL_KERN = 1
+ _KERN_OSREV = 3
+
_CTL_HW = 6
_HW_NCPU = 3
_HW_PAGESIZE = 7
return 0
}
+func getOSRev() int {
+ if osrev, ok := sysctlInt([]uint32{_CTL_KERN, _KERN_OSREV}); ok {
+ return int(osrev)
+ }
+ return 0
+}
+
//go:nosplit
func semacreate(mp *m) {
}
if physPageSize == 0 {
physPageSize = getPageSize()
}
+ needSysmonWorkaround = getOSRev() < 902000000 // NetBSD 9.2
}
var urandom_dev = []byte("/dev/urandom\x00")
// This is a variable for testing purposes. It normally doesn't change.
var forcegcperiod int64 = 2 * 60 * 1e9
+// needSysmonWorkaround is true if the workaround for
+// golang.org/issue/42515 is needed on NetBSD.
+var needSysmonWorkaround bool = false
+
// Always runs without a P, so write barriers are not allowed.
//
//go:nowritebarrierrec
}
}
mDoFixup()
- if GOOS == "netbsd" {
+ if GOOS == "netbsd" && needSysmonWorkaround {
// netpoll is responsible for waiting for timer
// expiration, so we typically don't have to worry
// about starting an M to service timers. (Note that