From: Laine Stump Date: Tue, 11 Aug 2015 18:56:21 +0000 (-0400) Subject: qemu: fix qemuDomainSupportsPCI() for ARM machines of "virt" machinetype X-Git-Tag: v1.2.19-rc1~88 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9bd16ad3b4dbe4bf8301c2b60fe77c36aa9b4f15;p=thirdparty%2Flibvirt.git qemu: fix qemuDomainSupportsPCI() for ARM machines of "virt" machinetype Commit e8d5517 updated the domain post-parse to automatically add pcie-root et al for certain ARM "virt" machinetypes, but didn't update the function qemuDomainSupportsPCI() which is called later on when we are auto-assigning PCI addresses and default settings for the PCI controller and attributes. The result was that PCI addresses weren't assigned, and the controllers didn't have their attribute default values set, leading to an error when the domain was started, e.g.: internal error: autogenerated dmi-to-pci-bridge options not set This patch adds the same check made in the earlier patch to qemuDomainSupportsPCI(), so that PCI address auto-assignment and target/model default values will be set. --- diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ae0361840a..84cbfe1b4d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1742,7 +1742,7 @@ qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, } static bool -qemuDomainSupportsPCI(virDomainDefPtr def) +qemuDomainSupportsPCI(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) { if ((def->os.arch != VIR_ARCH_ARMV7L) && (def->os.arch != VIR_ARCH_AARCH64)) return true; @@ -1750,6 +1750,11 @@ qemuDomainSupportsPCI(virDomainDefPtr def) if (STREQ(def->os.machine, "versatilepb")) return true; + if ((STREQ(def->os.machine, "virt") || + STRPREFIX(def->os.machine, "virt-")) && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_GPEX)) + return true; + return false; } @@ -2267,7 +2272,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false))) goto cleanup; - if (qemuDomainSupportsPCI(def)) { + if (qemuDomainSupportsPCI(def, qemuCaps)) { if (qemuValidateDevicePCISlotsChipsets(def, qemuCaps, addrs) < 0) goto cleanup; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ad9a8ac1aa..abf52c9c38 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1093,6 +1093,9 @@ qemuDomainDefPostParse(virDomainDefPtr def, def, VIR_DOMAIN_CONTROLLER_TYPE_SATA, 0, -1) < 0) goto cleanup; + /* NB: any machine that sets addPCIRoot to true must also return + * true from the function qemuDomainSupportsPCI(). + */ if (addPCIRoot && virDomainDefMaybeAddController( def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, @@ -1102,6 +1105,9 @@ qemuDomainDefPostParse(virDomainDefPtr def, /* When a machine has a pcie-root, make sure that there is always * a dmi-to-pci-bridge controller added as bus 1, and a pci-bridge * as bus 2, so that standard PCI devices can be connected + * + * NB: any machine that sets addPCIeRoot to true must also return + * true from the function qemuDomainSupportsPCI(). */ if (addPCIeRoot) { if (virDomainDefMaybeAddController(