From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34883) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YNIT2-0003RQ-Kx for qemu-devel@nongnu.org; Mon, 16 Feb 2015 04:59:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YNIT1-0004QU-D5 for qemu-devel@nongnu.org; Mon, 16 Feb 2015 04:59:52 -0500 From: Marcel Apfelbaum Date: Mon, 16 Feb 2015 11:54:17 +0200 Message-Id: <1424080457-13752-18-git-send-email-marcel@redhat.com> In-Reply-To: <1424080457-13752-1-git-send-email-marcel@redhat.com> References: <1424080457-13752-1-git-send-email-marcel@redhat.com> Subject: [Qemu-devel] [PATCH RFC V2 17/17] hw/pxb: add numa_node parameter List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: seabios@seabios.org, kraxel@redhat.com, mst@redhat.com, quintela@redhat.com, agraf@suse.de, marcel@redhat.com, alex.williamson@redhat.com, kevin@koconnor.net, qemu-ppc@nongnu.org, hare@suse.de, imammedo@redhat.com, amit.shah@redhat.com, pbonzini@redhat.com, leon.alrae@imgtec.com, aurelien@aurel32.net, rth@twiddle.net The pxb can be attach to and existing numa node by specifying numa_node option that equals the desired numa nodeid. Signed-off-by: Marcel Apfelbaum --- hw/i386/acpi-build.c | 12 ++++++++++++ hw/pci-bridge/pci_expander_bridge.c | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index cee150b..3da1333 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -896,6 +896,7 @@ build_ssdt(AcpiAml *table_aml, GArray *linker, for (info = info_list; info; info = info->next) { PciInfo *bus_info = info->value; + PCIHostState *host; if (bus_info->bus == 0) { continue; @@ -912,6 +913,17 @@ build_ssdt(AcpiAml *table_aml, GArray *linker, aml_append(&dev, acpi_name_decl("_HID", acpi_string("PNP0A03"))); aml_append(&dev, acpi_name_decl("_BBN", acpi_int((uint8_t)bus_info->bus))); + + HOST_BRIDGE_FOREACH(host) { + if (pci_bus_num(host->bus) == bus_info->bus) { + int numa_node = pci_bus_numa_node(host->bus); + if (numa_node != NUMA_NODE_UNASSIGNED) { + aml_append(&dev, + acpi_name_decl("_PXM", acpi_int(numa_node))); + } + } + } + aml_append(&dev, build_prt()); crs = build_crs(pci, bus_info, &io_ranges, &mem_ranges); aml_append(&dev, acpi_name_decl("_CRS", crs)); diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c index 1126841..2e793e2 100644 --- a/hw/pci-bridge/pci_expander_bridge.c +++ b/hw/pci-bridge/pci_expander_bridge.c @@ -16,6 +16,7 @@ #include "hw/pci/pci_bus.h" #include "qemu/range.h" #include "qemu/error-report.h" +#include "sysemu/sysemu.h" #define TYPE_PXB_BUS "pxb-bus" #define PXB_BUS(obj) OBJECT_CHECK(PXBBus, (obj), TYPE_PXB_BUS) @@ -37,6 +38,7 @@ typedef struct PXBDev { /*< public >*/ uint8_t bus_nr; + uint16_t numa_node; } PXBDev; #define TYPE_PXB_HOST "pxb-host" @@ -53,12 +55,20 @@ static bool pxb_is_root(PCIBus *bus) return true; /* by definition */ } +static uint16_t pxb_bus_numa_node(PCIBus *bus) +{ + PXBDev *pxb = PXB_DEV(bus->parent_dev); + + return pxb->numa_node; +} + static void pxb_bus_class_init(ObjectClass *class, void *data) { PCIBusClass *pbc = PCI_BUS_CLASS(class); pbc->bus_num = pxb_bus_num; pbc->is_root = pxb_is_root; + pbc->numa_node = pxb_bus_numa_node; } static const TypeInfo pxb_bus_info = { @@ -126,6 +136,12 @@ static int pxb_dev_initfn(PCIDevice *dev) } } + if (pxb->numa_node != NUMA_NODE_UNASSIGNED && + pxb->numa_node >= nb_numa_nodes) { + error_report("Illegal numa node %d.", pxb->numa_node); + return -EINVAL; + } + if (dev->qdev.id && *dev->qdev.id) { dev_name = dev->qdev.id; } @@ -157,6 +173,7 @@ static int pxb_dev_initfn(PCIDevice *dev) static Property pxb_dev_properties[] = { /* Note: 0 is not a legal a PXB bus number. */ DEFINE_PROP_UINT8("bus_nr", PXBDev, bus_nr, 0), + DEFINE_PROP_UINT16("numa_node", PXBDev, numa_node, NUMA_NODE_UNASSIGNED), DEFINE_PROP_END_OF_LIST(), }; -- 2.1.0