diff options
author | cheloha <cheloha@cvs.openbsd.org> | 2018-07-12 01:23:39 +0000 |
---|---|---|
committer | cheloha <cheloha@cvs.openbsd.org> | 2018-07-12 01:23:39 +0000 |
commit | 002672cb62f0ac2d4943a71f9ffdf5e1ec38e10d (patch) | |
tree | 1f01707e432a7f62f55ac7c1fa4880b4b059b9b5 /lib/libcxx | |
parent | 83a7dd06f8186000336c23fb99f58ba067be43b8 (diff) |
Add hw.ncpuonline to count the number of online CPUs.
The introduction of hw.smt means that logical CPUs can be disabled
after boot and prior to suspend/resume. If hw.smt=0 (the default),
there needs to be a way to count the number of hardware threads
available on the system at any given time.
So, import HW_NCPUONLINE/hw.ncpuonline from NetBSD and document it.
hw.ncpu becomes equal to the number of CPUs given to sched_init_cpu()
during boot, while hw.ncpuonline is equal to the number of CPUs available
to the scheduler in the cpuset "sched_all_cpus". Set_SC_NPROCESSORS_ONLN
equal to this new sysctl and keep _SC_NPROCESSORS_CONF equal to hw.ncpu.
This is preferable to adding a new sysctl to count the number of
configured CPUs and keeping hw.ncpu equal to the number of online
CPUs because such a change would break software in the ecosystem
that relies on HW_NCPU/hw.ncpu to measure CPU usage and the like.
Such software in base includes top(1), systat(1), and snmpd(8),
and perhaps others.
We don't need additional locking to count the cardinality of a cpuset
in this case because the only interfaces that can modify said cardinality
are sysctl(2) and ioctl(2), both of which are under the KERNEL_LOCK.
Software using HW_NCPU/hw.ncpu to determine optimal parallism will need
to be updated to use HW_NCPUONLINE/hw.ncpuonline. Until then, such software
may perform suboptimally. However, most changes will be similar to the
change included here for libcxx's std::thread:hardware_concurrency():
using HW_NCPUONLINE in lieu of HW_NCPU should be sufficient for determining
optimal parallelism for most software if the change to _SC_NPROCESSORS_ONLN
is insufficient.
Prompted by deraadt. Discussed at length with kettenis, deraadt, and sthen.
Lots of patch tweaks from kettenis.
ok kettenis, "proceed" deraadt
Diffstat (limited to 'lib/libcxx')
-rw-r--r-- | lib/libcxx/src/thread.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/libcxx/src/thread.cpp b/lib/libcxx/src/thread.cpp index 467402b6b42..d4977cd9a73 100644 --- a/lib/libcxx/src/thread.cpp +++ b/lib/libcxx/src/thread.cpp @@ -78,9 +78,9 @@ thread::detach() unsigned thread::hardware_concurrency() _NOEXCEPT { -#if defined(CTL_HW) && defined(HW_NCPU) +#if defined(CTL_HW) && defined(HW_NCPUONLINE) unsigned n; - int mib[2] = {CTL_HW, HW_NCPU}; + int mib[2] = {CTL_HW, HW_NCPUONLINE}; std::size_t s = sizeof(n); sysctl(mib, 2, &n, &s, 0, 0); return n; |