Add hw.ncpuonline to count the number of online CPUs.
authorcheloha <cheloha@openbsd.org>
Thu, 12 Jul 2018 01:23:38 +0000 (01:23 +0000)
committercheloha <cheloha@openbsd.org>
Thu, 12 Jul 2018 01:23:38 +0000 (01:23 +0000)
commitc71ddef4e977e565d25356bbc54b3876cbf432d2
treeb490dcb814f23972da3ddb68d992362aa1c16ddf
parent84a736751c9aed1852a13bcc6dd2021e5c4467aa
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
lib/libc/gen/sysconf.c
lib/libc/sys/sysctl.2
lib/libcxx/src/thread.cpp
sys/kern/kern_pledge.c
sys/kern/kern_sched.c
sys/kern/kern_sysctl.c
sys/sys/proc.h
sys/sys/sched.h
sys/sys/sysctl.h