Blob Blame History Raw
From 899d786bc8c3701e49def8e5d82080f8fc39ce1e Mon Sep 17 00:00:00 2001
Message-Id: <899d786bc8c3701e49def8e5d82080f8fc39ce1e@dist-git>
From: Andrea Bolognani <abologna@redhat.com>
Date: Tue, 18 Jul 2017 12:10:03 +0200
Subject: [PATCH] qemu: Use PHBs to fill holes in PCI bus numbering

PCI bus has to be numbered sequentially, and no index can be
missing, so libvirt will fill in the blanks automatically for
the user.

Up until now, it has done so using either pci-bridge, for machine
types based on legacy PCI, or pcie-root-port, for machine types
based on PCI Express. Neither choice is good for pSeries guests,
where PHBs (pci-root) should be used instead.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Laine Stump <laine@laine.org>
(cherry picked from commit 045515d36935e958a87745cb4723e401cb8b2cdd)

Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1280542

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/qemu/qemu_domain_address.c                           | 16 +++++++++++++---
 .../qemuxml2argv-pseries-many-buses-2.args               |  2 +-
 tests/qemuxml2argvtest.c                                 |  1 -
 .../qemuxml2xmlout-pseries-many-buses-2.xml              |  7 +++----
 tests/qemuxml2xmltest.c                                  |  1 -
 5 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 626d30d477..4de868abdf 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -1092,10 +1092,14 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
      * that don't yet have a corresponding controller in the domain
      * config.
      */
-    if (hasPCIeRoot)
+    if (qemuDomainIsPSeries(def)) {
+        /* pSeries guests should use PHBs (pci-root controllers) */
+        defaultModel = VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT;
+    } else if (hasPCIeRoot) {
         defaultModel = VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT;
-    else
+    } else {
         defaultModel = VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE;
+    }
 
     for (i = 1; i < addrs->nbuses; i++) {
 
@@ -2155,7 +2159,13 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
             dev.data.controller = def->controllers[contIndex];
             /* set connect flags so it will be properly addressed */
             qemuDomainFillDevicePCIConnectFlags(def, &dev, qemuCaps, driver);
-            if (qemuDomainPCIAddressReserveNextAddr(addrs,
+
+            /* Reserve an address for the controller. pci-root and pcie-root
+             * controllers don't plug into any other PCI controller, hence
+             * they should skip this step */
+            if (bus->model != VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT &&
+                bus->model != VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT &&
+                qemuDomainPCIAddressReserveNextAddr(addrs,
                                                     &dev.data.controller->info) < 0) {
                 goto cleanup;
             }
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args
index 1cb583132d..13fed02f80 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args
@@ -19,4 +19,4 @@ server,nowait \
 -mon chardev=charmonitor,id=monitor,mode=readline \
 -boot c \
 -device spapr-pci-host-bridge,index=1,id=pci.2 \
--device pci-bridge,chassis_nr=1,id=pci.1,bus=pci.0,addr=0x1
+-device spapr-pci-host-bridge,index=2,id=pci.1
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 52623bcd05..acbf15be91 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1775,7 +1775,6 @@ mymain(void)
     DO_TEST("pseries-many-buses-2",
             QEMU_CAPS_NODEFCONFIG,
             QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
-            QEMU_CAPS_DEVICE_PCI_BRIDGE,
             QEMU_CAPS_VIRTIO_SCSI);
     DO_TEST("pseries-hostdevs-1",
             QEMU_CAPS_NODEFCONFIG,
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml
index 75dfabfcab..14f3e36244 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml
@@ -23,10 +23,9 @@
       <target index='1'/>
     </controller>
     <controller type='usb' index='0' model='none'/>
-    <controller type='pci' index='1' model='pci-bridge'>
-      <model name='pci-bridge'/>
-      <target chassisNr='1'/>
-      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
+    <controller type='pci' index='1' model='pci-root'>
+      <model name='spapr-pci-host-bridge'/>
+      <target index='2'/>
     </controller>
     <memballoon model='none'/>
     <panic model='pseries'/>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 060bbf2f6b..84098b7ef3 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -686,7 +686,6 @@ mymain(void)
     DO_TEST("pseries-many-buses-2",
             QEMU_CAPS_NODEFCONFIG,
             QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
-            QEMU_CAPS_DEVICE_PCI_BRIDGE,
             QEMU_CAPS_VIRTIO_SCSI);
     DO_TEST("pseries-hostdevs-1",
             QEMU_CAPS_NODEFCONFIG,
-- 
2.13.3