Page MenuHomeFreeBSD

D59207.id185190.diff
No OneTemporary

D59207.id185190.diff

Index: sys/dev/acpica/acpi.c
===================================================================
--- sys/dev/acpica/acpi.c
+++ sys/dev/acpica/acpi.c
@@ -1402,20 +1402,19 @@
}
int
-acpi_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize,
- cpuset_t *cpuset)
+acpi_get_cpus_for_domain(device_t dev, device_t child, int domain,
+ enum cpu_sets op, size_t setsize, cpuset_t *cpuset)
{
- int d, error;
+ int error;
- d = acpi_pxm_parse(child);
- if (d < 0)
+ if (domain < 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];
+ *cpuset = cpuset_domain[domain];
return (0);
case INTR_CPUS:
error = bus_generic_get_cpus(dev, child, op, setsize, cpuset);
@@ -1423,13 +1422,22 @@
return (error);
if (setsize != sizeof(cpuset_t))
return (EINVAL);
- CPU_AND(cpuset, cpuset, &cpuset_domain[d]);
+ CPU_AND(cpuset, cpuset, &cpuset_domain[domain]);
return (0);
default:
return (bus_generic_get_cpus(dev, child, op, setsize, cpuset));
}
}
+int
+acpi_get_cpus(device_t dev, device_t child, enum cpu_sets op, size_t setsize,
+ cpuset_t *cpuset)
+{
+
+ return (acpi_get_cpus_for_domain(dev, child, acpi_pxm_parse(child), op,
+ setsize, cpuset));
+}
+
static int
acpi_get_domain_method(device_t dev, device_t child, int *domain)
{
Index: sys/dev/acpica/acpi_pci.c
===================================================================
--- sys/dev/acpica/acpi_pci.c
+++ sys/dev/acpica/acpi_pci.c
@@ -61,8 +61,12 @@
struct pci_devinfo ap_dinfo;
ACPI_HANDLE ap_handle;
int ap_flags;
+ int ap_domain;
};
+/* acpi_pxm_parse() returns -2, -1, or a non-negative domain. */
+#define ACPI_PCI_DOMAIN_UNSET (-3)
+
ACPI_SERIAL_DECL(pci_powerstate, "ACPI PCI power methods");
/* Be sure that ACPI and PCI power states are equivalent. */
@@ -132,6 +136,7 @@
struct acpi_pci_devinfo *dinfo;
dinfo = malloc(sizeof(*dinfo), M_DEVBUF, M_WAITOK | M_ZERO);
+ dinfo->ap_domain = ACPI_PCI_DOMAIN_UNSET;
return (&dinfo->ap_dinfo);
}
@@ -217,16 +222,38 @@
return (pf != NULL ? pf : child);
}
+/* Cache locality on its source device; all of a PF's VFs share its result. */
+static int
+acpi_pci_get_locality_domain(device_t child)
+{
+ struct acpi_pci_devinfo *dinfo;
+ device_t locality;
+ int domain;
+
+ locality = acpi_pci_get_locality_device(child);
+ dinfo = device_get_ivars(locality);
+ domain = dinfo->ap_domain;
+ if (domain == ACPI_PCI_DOMAIN_UNSET) {
+ domain = acpi_pxm_parse(locality);
+ /* Do not make a generic evaluation or mapping error permanent. */
+ if (domain != -1)
+ dinfo->ap_domain = domain;
+ }
+ return (domain);
+}
+
static int
acpi_pci_get_cpus(device_t dev, device_t child, enum cpu_sets op,
size_t setsize, cpuset_t *cpuset)
{
+ device_t locality;
/* BUS_GET_CPUS may preserve a descendant below the PCI function. */
if (device_get_parent(child) != dev)
return (acpi_get_cpus(dev, child, op, setsize, cpuset));
- child = acpi_pci_get_locality_device(child);
- return (acpi_get_cpus(dev, child, op, setsize, cpuset));
+ locality = acpi_pci_get_locality_device(child);
+ return (acpi_get_cpus_for_domain(dev, locality,
+ acpi_pci_get_locality_domain(locality), op, setsize, cpuset));
}
/*
@@ -242,8 +269,7 @@
{
int d;
- child = acpi_pci_get_locality_device(child);
- d = acpi_pxm_parse(child);
+ d = acpi_pci_get_locality_domain(child);
if (d >= 0) {
*domain = d;
return (0);
@@ -252,7 +278,8 @@
return (ENOENT);
/* No _PXM node; go up a level */
- return (bus_generic_get_domain(dev, child, domain));
+ return (bus_generic_get_domain(dev,
+ acpi_pci_get_locality_device(child), domain));
}
/*
Index: sys/dev/acpica/acpivar.h
===================================================================
--- sys/dev/acpica/acpivar.h
+++ sys/dev/acpica/acpivar.h
@@ -603,6 +603,9 @@
void acpi_pxm_set_cpu_locality(void);
int acpi_pxm_get_cpu_locality(int apic_id);
int acpi_pxm_parse(device_t dev);
+int acpi_get_cpus_for_domain(device_t dev, device_t child,
+ int domain, enum cpu_sets op, size_t setsize,
+ cpuset_t *cpuset);
/*
* Map a PXM to a VM domain.

File Metadata

Mime Type
text/plain
Expires
Tue, Sep 8, 4:15 PM (8 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38523961
Default Alt Text
D59207.id185190.diff (4 KB)

Event Timeline