From nobody Fri May 16 10:36:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1496419740218341.49291806843826; Fri, 2 Jun 2017 09:09:00 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0B43019CF24; Fri, 2 Jun 2017 16:08:58 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CDE2771C44; Fri, 2 Jun 2017 16:08:57 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id C59C541F81; Fri, 2 Jun 2017 16:08:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v52G8M4k011626 for ; Fri, 2 Jun 2017 12:08:22 -0400 Received: by smtp.corp.redhat.com (Postfix) id B1C148442F; Fri, 2 Jun 2017 16:08:22 +0000 (UTC) Received: from inaba.usersys.redhat.com (dhcp129-60.brq.redhat.com [10.34.129.60]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3A9EF8441E for ; Fri, 2 Jun 2017 16:08:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 0B43019CF24 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 0B43019CF24 From: Andrea Bolognani To: libvir-list@redhat.com Date: Fri, 2 Jun 2017 18:07:47 +0200 Message-Id: <1496419671-7600-23-git-send-email-abologna@redhat.com> In-Reply-To: <1496419671-7600-1-git-send-email-abologna@redhat.com> References: <1496419671-7600-1-git-send-email-abologna@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 22/26] qemu: Use PHBs when extending the guest PCI topology X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Fri, 02 Jun 2017 16:08:58 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" When looking for slots suitable for a PCI device, libvirt might need to add an extra PCI controller: for pSeries guests, we want that extra controller to be a PHB (pci-root) rather than a PCI bridge. --- Better viewed with 'git diff -w'. src/conf/domain_addr.c | 56 +++++++++-------- src/conf/domain_addr.h | 2 + src/qemu/qemu_domain_address.c | 4 ++ .../qemuxml2argv-pseries-many-buses-1.args | 4 +- .../qemuxml2argv-pseries-many-devices.args | 66 ++++++++++--------= -- tests/qemuxml2argvtest.c | 2 - .../qemuxml2xmlout-pseries-many-buses-1.xml | 7 +-- .../qemuxml2xmlout-pseries-many-devices.xml | 71 +++++++++++-------= ---- tests/qemuxml2xmltest.c | 2 - 9 files changed, 110 insertions(+), 104 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index d173766..e6a6399 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -383,33 +383,39 @@ virDomainPCIAddressSetGrow(virDomainPCIAddressSetPtr = addrs, */ =20 if (flags & VIR_PCI_CONNECT_TYPE_PCI_DEVICE) { - model =3D VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE; + if (addrs->multipleRootsSupported) { + /* Use a pci-root controller to expand the guest's PCI + * topology if it supports having more than one */ + model =3D VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT; + } else { + model =3D VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE; =20 - /* if there aren't yet any buses that will accept a - * pci-bridge, and the caller is asking for one, we'll need to - * add a dmi-to-pci-bridge first. - */ - needDMIToPCIBridge =3D true; - for (i =3D 0; i < addrs->nbuses; i++) { - if (addrs->buses[i].flags & VIR_PCI_CONNECT_TYPE_PCI_BRIDGE) { - needDMIToPCIBridge =3D false; - break; - } - } - if (needDMIToPCIBridge && add =3D=3D 1) { - /* We need to add a single pci-bridge to provide the bus - * our legacy PCI device will be plugged into; however, we - * have also determined that there isn't yet any proper - * place to connect that pci-bridge we're about to add (on - * a system with pcie-root, that "proper place" would be a - * dmi-to-pci-bridge". So, to give the pci-bridge a place - * to connect, we increase the count of buses to add, - * while also incrementing the bus number in the address - * for the device (since the pci-bridge will now be at an - * index 1 higher than the caller had anticipated). + /* if there aren't yet any buses that will accept a + * pci-bridge, and the caller is asking for one, we'll need to + * add a dmi-to-pci-bridge first. */ - add++; - addr->bus++; + needDMIToPCIBridge =3D true; + for (i =3D 0; i < addrs->nbuses; i++) { + if (addrs->buses[i].flags & VIR_PCI_CONNECT_TYPE_PCI_BRIDG= E) { + needDMIToPCIBridge =3D false; + break; + } + } + if (needDMIToPCIBridge && add =3D=3D 1) { + /* We need to add a single pci-bridge to provide the bus + * our legacy PCI device will be plugged into; however, we + * have also determined that there isn't yet any proper + * place to connect that pci-bridge we're about to add (on + * a system with pcie-root, that "proper place" would be a + * dmi-to-pci-bridge". So, to give the pci-bridge a place + * to connect, we increase the count of buses to add, + * while also incrementing the bus number in the address + * for the device (since the pci-bridge will now be at an + * index 1 higher than the caller had anticipated). + */ + add++; + addr->bus++; + } } } else if (flags & VIR_PCI_CONNECT_TYPE_PCI_BRIDGE && addrs->buses[0].model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_PC= IE_ROOT) { diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index 7704061..1849d2b 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -108,6 +108,8 @@ struct _virDomainPCIAddressSet { size_t nbuses; bool dryRun; /* on a dry run, new buses are auto-added and addresses aren't saved in device infos */ + /* If true, the guest can have multiple pci-root controllers */ + bool multipleRootsSupported; }; typedef struct _virDomainPCIAddressSet virDomainPCIAddressSet; typedef virDomainPCIAddressSet *virDomainPCIAddressSetPtr; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 9585fe5..08773c0 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -1056,6 +1056,10 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, =20 addrs->dryRun =3D dryRun; =20 + /* pSeries domains support multiple pci-root controllers */ + if (qemuDomainIsPSeries(def)) + addrs->multipleRootsSupported =3D true; + for (i =3D 0; i < def->ncontrollers; i++) { virDomainControllerDefPtr cont =3D def->controllers[i]; size_t idx =3D cont->idx; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-1.args = b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-1.args index bf78fc1..eb5ccbd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-1.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-1.args @@ -18,5 +18,5 @@ QEMU_AUDIO_DRV=3Dnone \ server,nowait \ -mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dreadline \ -boot c \ --device pci-bridge,chassis_nr=3D1,id=3Dpci.1,bus=3Dpci.0,addr=3D0x1 \ --device virtio-scsi-pci,id=3Dscsi0,bus=3Dpci.1,addr=3D0x1 +-device spapr-pci-host-bridge,index=3D1,id=3Dpci.1 \ +-device virtio-scsi-pci,id=3Dscsi0,bus=3Dpci.1.0,addr=3D0x1 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-devices.args = b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-devices.args index 1db4533..f20bc52 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-devices.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-devices.args @@ -18,36 +18,36 @@ QEMU_AUDIO_DRV=3Dnone \ server,nowait \ -mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dreadline \ -boot c \ --device pci-bridge,chassis_nr=3D1,id=3Dpci.1,bus=3Dpci.0,addr=3D0x1 \ --device virtio-scsi-pci,id=3Dscsi0,bus=3Dpci.0,addr=3D0x2 \ --device virtio-scsi-pci,id=3Dscsi1,bus=3Dpci.0,addr=3D0x3 \ --device virtio-scsi-pci,id=3Dscsi2,bus=3Dpci.0,addr=3D0x4 \ --device virtio-scsi-pci,id=3Dscsi3,bus=3Dpci.0,addr=3D0x5 \ --device virtio-scsi-pci,id=3Dscsi4,bus=3Dpci.0,addr=3D0x6 \ --device virtio-scsi-pci,id=3Dscsi5,bus=3Dpci.0,addr=3D0x7 \ --device virtio-scsi-pci,id=3Dscsi6,bus=3Dpci.0,addr=3D0x8 \ --device virtio-scsi-pci,id=3Dscsi7,bus=3Dpci.0,addr=3D0x9 \ --device virtio-scsi-pci,id=3Dscsi8,bus=3Dpci.0,addr=3D0xa \ --device virtio-scsi-pci,id=3Dscsi9,bus=3Dpci.0,addr=3D0xb \ --device virtio-scsi-pci,id=3Dscsi10,bus=3Dpci.0,addr=3D0xc \ --device virtio-scsi-pci,id=3Dscsi11,bus=3Dpci.0,addr=3D0xd \ --device virtio-scsi-pci,id=3Dscsi12,bus=3Dpci.0,addr=3D0xe \ --device virtio-scsi-pci,id=3Dscsi13,bus=3Dpci.0,addr=3D0xf \ --device virtio-scsi-pci,id=3Dscsi14,bus=3Dpci.0,addr=3D0x10 \ --device virtio-scsi-pci,id=3Dscsi15,bus=3Dpci.0,addr=3D0x11 \ --device virtio-scsi-pci,id=3Dscsi16,bus=3Dpci.0,addr=3D0x12 \ --device virtio-scsi-pci,id=3Dscsi17,bus=3Dpci.0,addr=3D0x13 \ --device virtio-scsi-pci,id=3Dscsi18,bus=3Dpci.0,addr=3D0x14 \ --device virtio-scsi-pci,id=3Dscsi19,bus=3Dpci.0,addr=3D0x15 \ --device virtio-scsi-pci,id=3Dscsi20,bus=3Dpci.0,addr=3D0x16 \ --device virtio-scsi-pci,id=3Dscsi21,bus=3Dpci.0,addr=3D0x17 \ --device virtio-scsi-pci,id=3Dscsi22,bus=3Dpci.0,addr=3D0x18 \ --device virtio-scsi-pci,id=3Dscsi23,bus=3Dpci.0,addr=3D0x19 \ --device virtio-scsi-pci,id=3Dscsi24,bus=3Dpci.0,addr=3D0x1a \ --device virtio-scsi-pci,id=3Dscsi25,bus=3Dpci.0,addr=3D0x1b \ --device virtio-scsi-pci,id=3Dscsi26,bus=3Dpci.0,addr=3D0x1c \ --device virtio-scsi-pci,id=3Dscsi27,bus=3Dpci.0,addr=3D0x1d \ --device virtio-scsi-pci,id=3Dscsi28,bus=3Dpci.0,addr=3D0x1e \ --device virtio-scsi-pci,id=3Dscsi29,bus=3Dpci.0,addr=3D0x1f \ --device virtio-scsi-pci,id=3Dscsi30,bus=3Dpci.1,addr=3D0x1 \ --device virtio-scsi-pci,id=3Dscsi31,bus=3Dpci.1,addr=3D0x2 +-device spapr-pci-host-bridge,index=3D1,id=3Dpci.1 \ +-device virtio-scsi-pci,id=3Dscsi0,bus=3Dpci.0,addr=3D0x1 \ +-device virtio-scsi-pci,id=3Dscsi1,bus=3Dpci.0,addr=3D0x2 \ +-device virtio-scsi-pci,id=3Dscsi2,bus=3Dpci.0,addr=3D0x3 \ +-device virtio-scsi-pci,id=3Dscsi3,bus=3Dpci.0,addr=3D0x4 \ +-device virtio-scsi-pci,id=3Dscsi4,bus=3Dpci.0,addr=3D0x5 \ +-device virtio-scsi-pci,id=3Dscsi5,bus=3Dpci.0,addr=3D0x6 \ +-device virtio-scsi-pci,id=3Dscsi6,bus=3Dpci.0,addr=3D0x7 \ +-device virtio-scsi-pci,id=3Dscsi7,bus=3Dpci.0,addr=3D0x8 \ +-device virtio-scsi-pci,id=3Dscsi8,bus=3Dpci.0,addr=3D0x9 \ +-device virtio-scsi-pci,id=3Dscsi9,bus=3Dpci.0,addr=3D0xa \ +-device virtio-scsi-pci,id=3Dscsi10,bus=3Dpci.0,addr=3D0xb \ +-device virtio-scsi-pci,id=3Dscsi11,bus=3Dpci.0,addr=3D0xc \ +-device virtio-scsi-pci,id=3Dscsi12,bus=3Dpci.0,addr=3D0xd \ +-device virtio-scsi-pci,id=3Dscsi13,bus=3Dpci.0,addr=3D0xe \ +-device virtio-scsi-pci,id=3Dscsi14,bus=3Dpci.0,addr=3D0xf \ +-device virtio-scsi-pci,id=3Dscsi15,bus=3Dpci.0,addr=3D0x10 \ +-device virtio-scsi-pci,id=3Dscsi16,bus=3Dpci.0,addr=3D0x11 \ +-device virtio-scsi-pci,id=3Dscsi17,bus=3Dpci.0,addr=3D0x12 \ +-device virtio-scsi-pci,id=3Dscsi18,bus=3Dpci.0,addr=3D0x13 \ +-device virtio-scsi-pci,id=3Dscsi19,bus=3Dpci.0,addr=3D0x14 \ +-device virtio-scsi-pci,id=3Dscsi20,bus=3Dpci.0,addr=3D0x15 \ +-device virtio-scsi-pci,id=3Dscsi21,bus=3Dpci.0,addr=3D0x16 \ +-device virtio-scsi-pci,id=3Dscsi22,bus=3Dpci.0,addr=3D0x17 \ +-device virtio-scsi-pci,id=3Dscsi23,bus=3Dpci.0,addr=3D0x18 \ +-device virtio-scsi-pci,id=3Dscsi24,bus=3Dpci.0,addr=3D0x19 \ +-device virtio-scsi-pci,id=3Dscsi25,bus=3Dpci.0,addr=3D0x1a \ +-device virtio-scsi-pci,id=3Dscsi26,bus=3Dpci.0,addr=3D0x1b \ +-device virtio-scsi-pci,id=3Dscsi27,bus=3Dpci.0,addr=3D0x1c \ +-device virtio-scsi-pci,id=3Dscsi28,bus=3Dpci.0,addr=3D0x1d \ +-device virtio-scsi-pci,id=3Dscsi29,bus=3Dpci.0,addr=3D0x1e \ +-device virtio-scsi-pci,id=3Dscsi30,bus=3Dpci.0,addr=3D0x1f \ +-device virtio-scsi-pci,id=3Dscsi31,bus=3Dpci.1.0,addr=3D0x1 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 7a6acd5..296c93b 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1706,12 +1706,10 @@ mymain(void) DO_TEST("pseries-many-devices", QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, - QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); DO_TEST("pseries-many-buses-1", QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, - QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); DO_TEST("pseries-many-buses-2", QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG, diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-1.x= ml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-1.xml index 010a3be..1b2845d 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-1.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-1.xml @@ -22,10 +22,9 @@
- - - -
+ + + diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-devices.x= ml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-devices.xml index 336373b..5a78590 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-devices.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-devices.xml @@ -19,106 +19,105 @@ -
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- - - -
+ + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index b75807c..15ac744 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -680,12 +680,10 @@ mymain(void) DO_TEST("pseries-many-devices", QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, - QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); DO_TEST("pseries-many-buses-1", QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE, - QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); DO_TEST("pseries-many-buses-2", QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG, --=20 2.7.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list