John Baldwin 8d791e5af1 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.

Compared to the r298933, this version uses 'struct _cpuset' in
<sys/bus.h> instead of 'cpuset_t' to avoid requiring <sys/param.h>
(<sys/_cpuset.h> still requires <sys/param.h> for MAXCPU even though
<sys/_bitset.h> does not after recent changes).
2016-05-09 20:50:21 +00:00
..
2016-03-21 21:38:35 +00:00
2015-07-20 09:37:42 +00:00
2015-04-22 14:38:58 +00:00
2016-02-23 23:37:10 +00:00
2016-04-15 17:45:12 +00:00
2015-01-22 11:12:42 +00:00
2016-04-26 12:29:47 +00:00
2015-11-19 05:50:22 +00:00
2016-05-04 23:31:52 +00:00
2016-05-04 13:48:59 +00:00
2014-08-11 15:06:07 +00:00
2016-04-29 20:12:45 +00:00
2016-03-21 21:38:35 +00:00
2016-03-21 21:38:35 +00:00
2016-04-29 22:15:33 +00:00
2015-03-17 14:16:50 +00:00
2016-04-14 17:07:26 +00:00
2016-04-29 21:54:28 +00:00
2016-04-29 21:54:28 +00:00