Add a new bus method to fetch device-specific CPU sets.
authorjhb <jhb@FreeBSD.org>
Mon, 2 May 2016 18:00:38 +0000 (18:00 +0000)
committerjhb <jhb@FreeBSD.org>
Mon, 2 May 2016 18:00:38 +0000 (18:00 +0000)
commit2da46e01a05539481b75f253e51b8ecdd821e311
tree65727b36586900faeb960b9b98fb030c3ec20bd8
parent57a0ef83ece3439b0c3728418ba99fca6d994cb4
Add a new bus method to fetch device-specific CPU sets.

bus_get_cpus() returns a specified set of CPUs for a device.  It accepts
an enum for the second parameter that indicates the type of cpuset to
request.  Currently two valus are supported:

 - LOCAL_CPUS (on x86 this returns all the CPUs in the package closest to
   the device when DEVICE_NUMA is enabled)
 - INTR_CPUS (like LOCAL_CPUS but only returns 1 SMT thread for each core)

For systems that do not support NUMA (or if it is not enabled in the kernel
config), LOCAL_CPUS fails with EINVAL.  INTR_CPUS is mapped to 'all_cpus'
by default.  The idea is that INTR_CPUS should always return a valid set.

Device drivers which want to use per-CPU interrupts should start using
INTR_CPUS instead of simply assigning interrupts to all available CPUs.
In the future we may wish to add tunables to control the policy of
INTR_CPUS (e.g. should it be local-only or global, should it ignore
SMT threads or not).

The x86 nexus driver exposes the internal set of interrupt CPUs from the
the x86 interrupt code via INTR_CPUS.

The ACPI bus driver and PCI bridge drivers use _PXM to return a suitable
LOCAL_CPUS set when _PXM exists and DEVICE_NUMA is enabled.  They also and
the global INTR_CPUS set from the nexus driver with the per-domain set from
_PXM to generate a local INTR_CPUS set for child devices.

Reviewed by: wblock (manpage)
Differential Revision: https://reviews.freebsd.org/D5519
18 files changed:
share/man/man9/BUS_GET_CPUS.9 [new file with mode: 0644]
share/man/man9/Makefile
sys/amd64/include/intr_machdep.h
sys/dev/acpica/acpi.c
sys/dev/acpica/acpi_pci.c
sys/dev/acpica/acpi_pcib.c
sys/dev/acpica/acpi_pcib_acpi.c
sys/dev/acpica/acpi_pcib_pci.c
sys/dev/acpica/acpi_pcibvar.h
sys/dev/acpica/acpivar.h
sys/dev/drm2/drm_dp_iic_helper.c
sys/dev/drm2/i915/dvo.h
sys/kern/bus_if.m
sys/kern/subr_bus.c
sys/sys/bus.h
sys/x86/acpica/OsdEnvironment.c
sys/x86/x86/intr_machdep.c
sys/x86/x86/nexus.c