Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144568106
D5519.id13960.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
18 KB
Referenced Files
None
Subscribers
None
D5519.id13960.diff
View Options
Index: share/man/man9/BUS_GET_CPUS.9
===================================================================
--- /dev/null
+++ share/man/man9/BUS_GET_CPUS.9
@@ -0,0 +1,101 @@
+.\" -*- nroff -*-
+.\"
+.\" Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd March 1, 2016
+.Dt BUS_GET_CPUS 9
+.Os
+.Sh NAME
+.Nm BUS_GET_CPUS ,
+.Nm bus_get_cpus
+.Nd "request a set of device-specific CPUs"
+.Sh SYNOPSIS
+.In sys/param.h
+.In sys/bus.h
+.Ft int
+.Fo BUS_GET_CPUS
+.Fa "device_t dev" "device_t child" "enum cpu_sets op" "size_t setsize"
+.Fa "cpuset_t *cpuset"
+.Fc
+.Ft int
+.Fo bus_get_cpus
+.Fa "device_t dev" "enum cpu_sets op" "size_t setsize" "cpuset_t *cpuset"
+.Fc
+.Sh DESCRIPTION
+The
+.Fn BUS_GET_CPUS
+method queries the parent bus device for a set of device-specific CPUs.
+The
+.Fa op
+argument specifies which set of CPUs to retrieve.
+If successful,
+the requested set of CPUs are returned in
+.Fa cpuset .
+The
+.Fa setsize
+argument specifies the size in bytes of the set passed in
+.Fa cpuset .
+.Pp
+The
+.Fn BUS_GET_CPUS
+method supports querying different types of CPU sets via the the
+.Fa op argument.
+Some set types may not be supported for every device.
+If a set type is not supported,
+.Fn BUS_GET_CPUS
+will fail with
+.Er EINVAL .
+The following set types are supported:
+.Bl -tag -width ".Dv LOCAL_CPUS"
+.It Dv LOCAL_CPUS
+The set of CPUs that are local to the device.
+If a device is closer to a specific memory domain in a non-uniform memory
+architecture system
+.Pq NUMA ,
+this will return the set of CPUs in that memory domain.
+.It Dv INTR_CPUS
+The preferred set of CPUs that this device should use for device interrupts.
+This set type must be supported by all bus drivers.
+.El
+.Pp
+The
+.Fn bus_get_cpus
+function is a simple wrapper around
+.Fn BUS_GET_CPUS .
+.Sh RETURN VALUES
+Zero is returned on success, otherwise an appropriate error is returned.
+.Sh SEE ALSO
+.Xr cpuset 2 ,
+.Xr BUS_BIND_INTR 9 ,
+.Xr device 9
+.Sh HISTORY
+The
+.Fn BUS_GET_CPUS
+method and
+.Fn bus_get_cpus
+functions first appeared in
+.Fx 11.0 .
Index: share/man/man9/Makefile
===================================================================
--- share/man/man9/Makefile
+++ share/man/man9/Makefile
@@ -40,6 +40,7 @@
bus_generic_print_child.9 \
bus_generic_read_ivar.9 \
bus_generic_shutdown.9 \
+ BUS_GET_CPUS.9 \
bus_get_resource.9 \
BUS_NEW_PASS.9 \
BUS_PRINT_CHILD.9 \
@@ -499,6 +500,7 @@
bus_dma.9 bus_dma_tag_create.9 \
bus_dma.9 bus_dma_tag_destroy.9
MLINKS+=bus_generic_read_ivar.9 bus_generic_write_ivar.9
+MLINKS+=BUS_GET_CPUS.9 bus_get_cpus.9
MLINKS+=BUS_READ_IVAR.9 BUS_WRITE_IVAR.9
MLINKS+=BUS_SETUP_INTR.9 bus_setup_intr.9 \
BUS_SETUP_INTR.9 BUS_TEARDOWN_INTR.9 \
Index: sys/amd64/include/intr_machdep.h
===================================================================
--- sys/amd64/include/intr_machdep.h
+++ sys/amd64/include/intr_machdep.h
@@ -143,6 +143,9 @@
register_t __padding; /* pad to 16 bytes */
};
+#ifdef SMP
+extern cpuset_t intr_cpus;
+#endif
extern struct mtx icu_lock;
extern int elcr_found;
Index: sys/dev/acpica/acpi.c
===================================================================
--- sys/dev/acpica/acpi.c
+++ sys/dev/acpica/acpi.c
@@ -209,6 +209,7 @@
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
DEVMETHOD(bus_hint_device_unit, acpi_hint_device_unit),
+ DEVMETHOD(bus_get_cpus, acpi_get_cpus),
DEVMETHOD(bus_get_domain, acpi_get_domain),
/* ACPI bus */
@@ -1077,52 +1078,79 @@
}
/*
- * Fetch the VM domain for the given device 'dev'.
- *
- * Return 1 + domain if there's a domain, 0 if not found;
- * -1 upon an error.
+ * Fetch the NUMA domain for a device by mapping the value returned by
+ * _PXM to a NUMA domain. If the device does not have a _PXM method,
+ * -2 is returned. If any other error occurs, -1 is returned.
*/
-int
-acpi_parse_pxm(device_t dev, int *domain)
+static int
+acpi_parse_pxm(device_t dev)
{
#if MAXMEMDOM > 1
- ACPI_HANDLE h;
- int d, pxm;
-
- h = acpi_get_handle(dev);
- if ((h != NULL) &&
- ACPI_SUCCESS(acpi_GetInteger(h, "_PXM", &pxm))) {
- d = acpi_map_pxm_to_vm_domainid(pxm);
- if (d < 0)
- return (-1);
- *domain = d;
- return (1);
- }
+ ACPI_HANDLE handle;
+ ACPI_STATUS status;
+ int pxm;
+
+ handle = acpi_get_handle(dev);
+ if (handle == NULL)
+ return (-2);
+ status = acpi_GetInteger(handle, "_PXM", &pxm);
+ if (ACPI_SUCCESS(status))
+ return (acpi_map_pxm_to_vm_domainid(pxm));
+ if (status == AE_NOT_FOUND)
+ return (-2);
#endif
+ return (-1);
+}
- return (0);
+int
+acpi_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize,
+ cpuset_t *cpuset)
+{
+ int d, error;
+
+ d = acpi_parse_pxm(child);
+ if (d < 0)
+ return (bus_generic_get_cpus(dev, child, op, setsize, cpuset));
+
+ switch (op) {
+ case LOCAL_CPUS:
+ if (setsize != sizeof(cpuset_t))
+ return (EINVAL);
+ *cpuset = cpuset_domain[d];
+ return (0);
+ case INTR_CPUS:
+ error = bus_generic_get_cpus(dev, child, op, setsize, cpuset);
+ if (error != 0)
+ return (error);
+ if (setsize != sizeof(cpuset_t))
+ return (EINVAL);
+ CPU_AND(cpuset, &cpuset_domain[d]);
+ return (0);
+ default:
+ return (bus_generic_get_cpus(dev, child, op, setsize, cpuset));
+ }
}
/*
- * Fetch the NUMA domain for the given device.
+ * Fetch the NUMA domain for the given device 'dev'.
*
* If a device has a _PXM method, map that to a NUMA domain.
- *
- * If none is found, then it'll call the parent method.
- * If there's no domain, return ENOENT.
+ * Otherwise, pass the request up to the parent.
+ * If there's no matching domain or the domain cannot be
+ * determined, return ENOENT.
*/
int
acpi_get_domain(device_t dev, device_t child, int *domain)
{
- int ret;
+ int d;
- ret = acpi_parse_pxm(child, domain);
- /* Error */
- if (ret == -1)
- return (ENOENT);
- /* Found */
- if (ret == 1)
+ d = acpi_parse_pxm(child);
+ if (d >= 0) {
+ *domain = d;
return (0);
+ }
+ if (d == -1)
+ return (ENOENT);
/* No _PXM node; go up a level */
return (bus_generic_get_domain(dev, child, domain));
Index: sys/dev/acpica/acpi_pci.c
===================================================================
--- sys/dev/acpica/acpi_pci.c
+++ sys/dev/acpica/acpi_pci.c
@@ -98,6 +98,7 @@
DEVMETHOD(bus_read_ivar, acpi_pci_read_ivar),
DEVMETHOD(bus_write_ivar, acpi_pci_write_ivar),
DEVMETHOD(bus_child_location_str, acpi_pci_child_location_str_method),
+ DEVMETHOD(bus_get_cpus, acpi_get_cpus),
DEVMETHOD(bus_get_dma_tag, acpi_pci_get_dma_tag),
DEVMETHOD(bus_get_domain, acpi_get_domain),
Index: sys/dev/acpica/acpi_pcib.c
===================================================================
--- sys/dev/acpica/acpi_pcib.c
+++ sys/dev/acpica/acpi_pcib.c
@@ -277,3 +277,11 @@
acpi_device_pwr_for_sleep(acpi_dev, dev, pstate);
return (0);
}
+
+int
+acpi_pcib_get_cpus(device_t pcib, device_t dev, enum cpu_sets op,
+ size_t setsize, cpuset_t *cpuset)
+{
+
+ return (bus_get_cpus(pcib, op, setsize, cpuset));
+}
Index: sys/dev/acpica/acpi_pcib_acpi.c
===================================================================
--- sys/dev/acpica/acpi_pcib_acpi.c
+++ sys/dev/acpica/acpi_pcib_acpi.c
@@ -130,6 +130,7 @@
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
+ DEVMETHOD(bus_get_cpus, acpi_pcib_get_cpus),
/* pcib interface */
DEVMETHOD(pcib_maxslots, pcib_maxslots),
Index: sys/dev/acpica/acpi_pcib_pci.c
===================================================================
--- sys/dev/acpica/acpi_pcib_pci.c
+++ sys/dev/acpica/acpi_pcib_pci.c
@@ -78,6 +78,7 @@
/* Bus interface */
DEVMETHOD(bus_read_ivar, acpi_pcib_read_ivar),
+ DEVMETHOD(bus_get_cpus, acpi_pcib_get_cpus),
/* pcib interface */
DEVMETHOD(pcib_route_interrupt, acpi_pcib_pci_route_interrupt),
Index: sys/dev/acpica/acpi_pcibvar.h
===================================================================
--- sys/dev/acpica/acpi_pcibvar.h
+++ sys/dev/acpica/acpi_pcibvar.h
@@ -36,6 +36,8 @@
int slot, int pin);
int acpi_pci_link_route_interrupt(device_t dev, int index);
int acpi_pcib_attach(device_t bus, ACPI_BUFFER *prt, int busno);
+int acpi_pcib_get_cpus(device_t pcib, device_t dev, enum cpu_sets op,
+ size_t setsize, cpuset_t *cpuset);
int acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
ACPI_BUFFER *prtbuf);
int acpi_pcib_power_for_sleep(device_t pcib, device_t dev,
Index: sys/dev/acpica/acpivar.h
===================================================================
--- sys/dev/acpica/acpivar.h
+++ sys/dev/acpica/acpivar.h
@@ -503,10 +503,12 @@
* Returns the VM domain ID if found, or -1 if not found / invalid.
*/
#if MAXMEMDOM > 1
-extern int acpi_map_pxm_to_vm_domainid(int pxm);
+int acpi_map_pxm_to_vm_domainid(int pxm);
#endif
-extern int acpi_get_domain(device_t dev, device_t child, int *domain);
-extern int acpi_parse_pxm(device_t dev, int *domain);
+
+int acpi_get_cpus(device_t dev, device_t child, enum cpu_sets op,
+ size_t setsize, cpuset_t *cpuset);
+int acpi_get_domain(device_t dev, device_t child, int *domain);
#endif /* _KERNEL */
#endif /* !_ACPIVAR_H_ */
Index: sys/dev/drm2/drm_dp_iic_helper.c
===================================================================
--- sys/dev/drm2/drm_dp_iic_helper.c
+++ sys/dev/drm2/drm_dp_iic_helper.c
@@ -23,7 +23,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/types.h>
+#include <sys/param.h>
#include <sys/kobj.h>
#include <sys/bus.h>
#include <dev/iicbus/iic.h>
Index: sys/kern/bus_if.m
===================================================================
--- sys/kern/bus_if.m
+++ sys/kern/bus_if.m
@@ -718,3 +718,21 @@
device_t _child;
int *_domain;
} DEFAULT bus_generic_get_domain;
+
+/**
+ * @brief Request a set of CPUs
+ *
+ * @param _dev the bus device
+ * @param _child the child device
+ * @param _op type of CPUs to request
+ * @param _setsize the size of the set passed in _cpuset
+ * @param _cpuset a pointer to a cpuset to receive the requested
+ * set of CPUs
+ */
+METHOD int get_cpus {
+ device_t _dev;
+ device_t _child;
+ enum cpu_sets _op;
+ size_t _setsize;
+ cpuset_t *_cpuset;
+} DEFAULT bus_generic_get_cpus;
Index: sys/kern/subr_bus.c
===================================================================
--- sys/kern/subr_bus.c
+++ sys/kern/subr_bus.c
@@ -47,8 +47,10 @@
#include <machine/bus.h>
#include <sys/random.h>
#include <sys/rman.h>
+#include <sys/sbuf.h>
#include <sys/selinfo.h>
#include <sys/signalvar.h>
+#include <sys/smp.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/uio.h>
@@ -134,6 +136,10 @@
struct sysctl_ctx_list sysctl_ctx; /**< state for sysctl variables */
struct sysctl_oid *sysctl_tree; /**< state for sysctl variables */
+
+ /* XXX: Temporary for testing */
+ cpuset_t intr_cpus;
+ cpuset_t local_cpus;
};
static MALLOC_DEFINE(M_BUS, "bus", "Bus data structures");
@@ -274,6 +280,31 @@
return (error);
}
+static int
+device_cpuset_handler(SYSCTL_HANDLER_ARGS)
+{
+ cpuset_t *set;
+ struct sbuf *sb;
+ int cpu, error, once;
+
+ set = arg1;
+ sb = sbuf_new_for_sysctl(NULL, NULL, 128, req);
+ for (once = 0, cpu = 0; cpu < CPU_SETSIZE; cpu++) {
+ if (CPU_ISSET(cpu, set)) {
+ if (once == 0) {
+ sbuf_printf(sb, "%d", cpu);
+ once = 1;
+ } else
+ sbuf_printf(sb, ",%d", cpu);
+ }
+ }
+ if (once == 0)
+ sbuf_printf(sb, "<none>");
+ error = sbuf_finish(sb);
+ sbuf_delete(sb);
+ return (error);
+}
+
static void
device_sysctl_init(device_t dev)
{
@@ -312,6 +343,20 @@
SYSCTL_ADD_INT(&dev->sysctl_ctx,
SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%domain",
CTLFLAG_RD, NULL, domain, "NUMA domain");
+
+ /* XXX: For testing. */
+ if (bus_get_cpus(dev, INTR_CPUS, sizeof(dev->intr_cpus),
+ &dev->intr_cpus) == 0)
+ SYSCTL_ADD_PROC(&dev->sysctl_ctx,
+ SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%intr_cpus",
+ CTLTYPE_STRING | CTLFLAG_RD, &dev->intr_cpus, 0,
+ device_cpuset_handler, "A", "Interrupt CPUs");
+ if (bus_get_cpus(dev, LOCAL_CPUS, sizeof(dev->local_cpus),
+ &dev->local_cpus) == 0)
+ SYSCTL_ADD_PROC(&dev->sysctl_ctx,
+ SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%local_cpus",
+ CTLTYPE_STRING | CTLFLAG_RD, &dev->local_cpus, 0,
+ device_cpuset_handler, "A", "Interrupt CPUs");
}
static void
@@ -4079,6 +4124,23 @@
}
/**
+ * @brief Helper function for implementing BUS_GET_CPUS().
+ *
+ * This simple implementation of BUS_GET_CPUS() simply calls the
+ * BUS_GET_CPUS() method of the parent of @p dev.
+ */
+int
+bus_generic_get_cpus(device_t dev, device_t child, enum cpu_sets op,
+ size_t setsize, cpuset_t *cpuset)
+{
+
+ /* Propagate up the bus hierarchy until someone handles it. */
+ if (dev->parent != NULL)
+ return (BUS_GET_CPUS(dev->parent, child, op, setsize, cpuset));
+ return (EINVAL);
+}
+
+/**
* @brief Helper function for implementing BUS_GET_DMA_TAG().
*
* This simple implementation of BUS_GET_DMA_TAG() simply calls the
@@ -4575,6 +4637,23 @@
}
/**
+ * @brief Wrapper function for BUS_GET_CPUS().
+ *
+ * This function simply calls the BUS_GET_CPUS() method of the
+ * parent of @p dev.
+ */
+int
+bus_get_cpus(device_t dev, enum cpu_sets op, size_t setsize, cpuset_t *cpuset)
+{
+ device_t parent;
+
+ parent = device_get_parent(dev);
+ if (parent == NULL)
+ return (EINVAL);
+ return (BUS_GET_CPUS(parent, dev, op, setsize, cpuset));
+}
+
+/**
* @brief Wrapper function for BUS_GET_DMA_TAG().
*
* This function simply calls the BUS_GET_DMA_TAG() method of the
@@ -4666,6 +4745,23 @@
return (-1);
}
+static int
+root_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize,
+ cpuset_t *cpuset)
+{
+
+ switch (op) {
+ case INTR_CPUS:
+ /* Default to returning the set of all CPUs. */
+ if (setsize != sizeof(cpuset_t))
+ return (EINVAL);
+ *cpuset = all_cpus;
+ return (0);
+ default:
+ return (EINVAL);
+ }
+}
+
static kobj_method_t root_methods[] = {
/* Device interface */
KOBJMETHOD(device_shutdown, bus_generic_shutdown),
@@ -4678,6 +4774,7 @@
KOBJMETHOD(bus_write_ivar, bus_generic_write_ivar),
KOBJMETHOD(bus_setup_intr, root_setup_intr),
KOBJMETHOD(bus_child_present, root_child_present),
+ KOBJMETHOD(bus_get_cpus, root_get_cpus),
KOBJMETHOD_END
};
Index: sys/sys/bus.h
===================================================================
--- sys/sys/bus.h
+++ sys/sys/bus.h
@@ -32,6 +32,7 @@
#include <machine/_limits.h>
#include <machine/_bus.h>
#include <sys/_bus_dma.h>
+#include <sys/_cpuset.h>
#include <sys/ioccom.h>
/**
@@ -266,6 +267,16 @@
INTR_POLARITY_LOW = 2
};
+/**
+ * CPU sets supported by bus_get_cpus(). Note that not all sets may be
+ * supported for a given device. If a request is not supported by a
+ * device (or its parents), then bus_get_cpus() will fail with EINVAL.
+ */
+enum cpu_sets {
+ LOCAL_CPUS = 0,
+ INTR_CPUS
+};
+
typedef int (*devop_t)(void);
/**
@@ -382,6 +393,8 @@
int rid, struct resource *r);
int bus_generic_detach(device_t dev);
void bus_generic_driver_added(device_t dev, driver_t *driver);
+int bus_generic_get_cpus(device_t dev, device_t child, enum cpu_sets op,
+ size_t setsize, cpuset_t *cpuset);
bus_dma_tag_t
bus_generic_get_dma_tag(device_t dev, device_t child);
bus_space_tag_t
@@ -450,6 +463,8 @@
struct resource *r);
int bus_deactivate_resource(device_t dev, int type, int rid,
struct resource *r);
+int bus_get_cpus(device_t dev, enum cpu_sets op, size_t setsize,
+ cpuset_t *cpuset);
bus_dma_tag_t bus_get_dma_tag(device_t dev);
bus_space_tag_t bus_get_bus_tag(device_t dev);
int bus_get_domain(device_t dev, int *domain);
Index: sys/x86/acpica/OsdEnvironment.c
===================================================================
--- sys/x86/acpica/OsdEnvironment.c
+++ sys/x86/acpica/OsdEnvironment.c
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/types.h>
+#include <sys/param.h>
#include <sys/bus.h>
#include <sys/sysctl.h>
Index: sys/x86/x86/intr_machdep.c
===================================================================
--- sys/x86/x86/intr_machdep.c
+++ sys/x86/x86/intr_machdep.c
@@ -475,7 +475,7 @@
* allocate CPUs round-robin.
*/
-static cpuset_t intr_cpus = CPUSET_T_INITIALIZER(0x1);
+cpuset_t intr_cpus = CPUSET_T_INITIALIZER(0x1);
static int current_cpu;
/*
Index: sys/x86/x86/nexus.c
===================================================================
--- sys/x86/x86/nexus.c
+++ sys/x86/x86/nexus.c
@@ -127,6 +127,8 @@
static int nexus_get_resource(device_t, device_t, int, int,
rman_res_t *, rman_res_t *);
static void nexus_delete_resource(device_t, device_t, int, int);
+static int nexus_get_cpus(device_t, device_t, enum cpu_sets, size_t,
+ cpuset_t *);
#ifdef DEV_APIC
static int nexus_alloc_msi(device_t pcib, device_t dev, int count, int maxcount, int *irqs);
static int nexus_release_msi(device_t pcib, device_t dev, int count, int *irqs);
@@ -163,6 +165,7 @@
DEVMETHOD(bus_set_resource, nexus_set_resource),
DEVMETHOD(bus_get_resource, nexus_get_resource),
DEVMETHOD(bus_delete_resource, nexus_delete_resource),
+ DEVMETHOD(bus_get_cpus, nexus_get_cpus),
/* pcib interface */
#ifdef DEV_APIC
@@ -619,6 +622,24 @@
resource_list_delete(rl, type, rid);
}
+static int
+nexus_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize,
+ cpuset_t *cpuset)
+{
+
+ switch (op) {
+#ifdef SMP
+ case INTR_CPUS:
+ if (setsize != sizeof(cpuset_t))
+ return (EINVAL);
+ *cpuset = intr_cpus;
+ return (0);
+#endif
+ default:
+ return (bus_generic_get_cpus(dev, child, op, setsize, cpuset));
+ }
+}
+
/* Called from the MSI code to add new IRQs to the IRQ rman. */
void
nexus_add_irq(u_long irq)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Feb 10, 4:40 PM (19 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28628245
Default Alt Text
D5519.id13960.diff (18 KB)
Attached To
Mode
D5519: Add a new bus method to fetch device-specific CPU sets.
Attached
Detach File
Event Timeline
Log In to Comment