[libvirt] [PATCH v2 00/11] qemu: add PCI bridge support

Add new 'pci' controller type with two models: pci-root - auto-added to a pc* machine, providing pci bus 0 pci-bridge - auto-added if the devices would not leave at least one slot empty on bus 0 or bus >0 is specified Ján Tomko (10): qemu: make qemuComparePCIDevice aware of multiple buses qemu: print PCI address hexadecimally in errors qemu: QEMU_PCI constant consistency qemu: move PCI address check out of qemuPCIAddressAsString qemu: switch PCI address set from hash table to an array qemu: rename CheckSlot to SlotInUse conf: add model attribute to virDomainDefMaybeAddController conf: add PCI controllers qemu: auto-add bridges and allow using them qemu: auto-add pci-root controller for pc machine types liguang (1): qemu: build command line for pci-bridge device docs/schemas/domaincommon.rng | 3 + src/conf/domain_conf.c | 63 ++- src/conf/domain_conf.h | 14 + src/libvirt_private.syms | 1 + src/qemu/qemu_capabilities.c | 3 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 477 +++++++++++++-------- src/qemu/qemu_command.h | 4 +- src/qemu/qemu_domain.c | 37 ++ src/qemu/qemu_hotplug.c | 4 +- tests/domainsnapshotxml2xmlout/disk_snapshot.xml | 1 + tests/domainsnapshotxml2xmlout/external_vm.xml | 1 + tests/domainsnapshotxml2xmlout/full_domain.xml | 1 + tests/domainsnapshotxml2xmlout/metadata.xml | 1 + tests/qemuhelptest.c | 21 +- .../qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml | 1 + .../qemuxml2argv-blkiotune-device.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-blkiotune.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 1 + .../qemuxml2argv-boot-menu-disable.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-boot-network.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 1 + .../qemuxml2argv-channel-guestfwd.xml | 1 + .../qemuxml2argv-channel-virtio.xml | 1 + .../qemuxml2argv-clock-localtime.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml | 1 + .../qemuxml2argv-console-compat.xml | 1 + .../qemuxml2argv-console-virtio-many.xml | 1 + .../qemuxml2argv-controller-order.xml | 1 + .../qemuxml2argv-cpu-eoi-disabled.xml | 1 + .../qemuxml2argv-cpu-eoi-enabled.xml | 1 + .../qemuxml2argv-cpu-host-kvmclock.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-cputune.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 1 + .../qemuxml2argv-disk-cdrom-empty.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 1 + .../qemuxml2argv-disk-drive-boot-cdrom.xml | 1 + .../qemuxml2argv-disk-drive-boot-disk.xml | 1 + .../qemuxml2argv-disk-drive-cache-directsync.xml | 1 + .../qemuxml2argv-disk-drive-cache-unsafe.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-none.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-none.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 1 + ...muxml2argv-disk-drive-error-policy-enospace.xml | 1 + .../qemuxml2argv-disk-drive-error-policy-stop.xml | 1 + ...rgv-disk-drive-error-policy-wreport-rignore.xml | 1 + .../qemuxml2argv-disk-drive-fat.xml | 1 + .../qemuxml2argv-disk-drive-fmt-qcow.xml | 1 + .../qemuxml2argv-disk-drive-network-gluster.xml | 1 + .../qemuxml2argv-disk-drive-network-iscsi-auth.xml | 1 + .../qemuxml2argv-disk-drive-network-iscsi.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-export.xml | 1 + ...xml2argv-disk-drive-network-nbd-ipv6-export.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-ipv6.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-unix.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd.xml | 1 + ...emuxml2argv-disk-drive-network-rbd-ceph-env.xml | 1 + .../qemuxml2argv-disk-drive-network-rbd-ipv6.xml | 1 + .../qemuxml2argv-disk-drive-network-rbd.xml | 1 + .../qemuxml2argv-disk-drive-network-sheepdog.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-mirror.xml | 1 + .../qemuxml2argv-disk-scsi-device.xml | 1 + .../qemuxml2argv-disk-scsi-disk-vpd.xml | 1 + ...qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml | 1 + .../qemuxml2argv-disk-scsi-megasas.xml | 1 + .../qemuxml2argv-disk-scsi-virtio-scsi.xml | 1 + .../qemuxml2argv-disk-scsi-vscsi.xml | 1 + .../qemuxml2argv-disk-source-pool.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml | 1 + .../qemuxml2argv-disk-virtio-scsi-num_queues.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 1 + .../qemuxml2argv-encrypted-disk.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 1 + .../qemuxml2argv-floppy-drive-fat.xml | 1 + .../qemuxml2argv-graphics-listen-network.xml | 1 + .../qemuxml2argv-graphics-sdl-fullscreen.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml | 1 + .../qemuxml2argv-graphics-spice-compression.xml | 1 + .../qemuxml2argv-graphics-spice-qxl-vga.xml | 1 + .../qemuxml2argv-graphics-spice.xml | 1 + .../qemuxml2argv-graphics-vnc-sasl.xml | 1 + .../qemuxml2argv-graphics-vnc-socket.xml | 1 + .../qemuxml2argv-graphics-vnc-tls.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml | 1 + .../qemuxml2argv-hostdev-pci-address.xml | 1 + .../qemuxml2argv-hostdev-usb-address.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml | 1 + .../qemuxml2argv-input-usbmouse.xml | 1 + .../qemuxml2argv-input-usbtablet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 1 + .../qemuxml2argv-machine-core-off.xml | 1 + .../qemuxml2argv-machine-core-on.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-migrate.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-minimal.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml | 1 + .../qemuxml2argv-misc-disable-s3.xml | 1 + .../qemuxml2argv-misc-disable-suspends.xml | 1 + .../qemuxml2argv-misc-enable-s4.xml | 1 + .../qemuxml2argv-misc-no-reboot.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml | 1 + .../qemuxml2argv-net-bandwidth.xml | 1 + .../qemuxml2argv-net-eth-ifname.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml | 1 + .../qemuxml2argv-net-openvswitch.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-user.xml | 1 + .../qemuxml2argv-net-virtio-device.xml | 1 + .../qemuxml2argv-net-virtio-network-portgroup.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml | 1 + .../qemuxml2argv-nographics-vga.xml | 1 + .../qemuxml2argv-numad-static-vcpu-no-numatune.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml | 1 + .../qemuxml2argv-qemu-ns-no-env.xml | 1 + .../qemuxml2argv-reboot-timeout-disabled.xml | 1 + .../qemuxml2argv-reboot-timeout-enabled.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml | 1 + .../qemuxml2argv-seclabel-dynamic-baselabel.xml | 1 + .../qemuxml2argv-seclabel-dynamic-override.xml | 1 + .../qemuxml2argv-seclabel-none.xml | 1 + .../qemuxml2argv-seclabel-static.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-file.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-many.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml | 1 + .../qemuxml2argv-serial-tcp-telnet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-unix.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-sound-device.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-sound.xml | 1 + .../qemuxml2argv-tpm-passthrough.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml | 1 + .../qemuxml2argv-virtio-rng-egd.xml | 1 + .../qemuxml2argv-virtio-rng-random.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml | 1 + .../qemuxml2xmlout-balloon-device-auto.xml | 1 + .../qemuxml2xmlout-channel-virtio-auto.xml | 1 + .../qemuxml2xmlout-console-compat-auto.xml | 1 + .../qemuxml2xmlout-console-virtio.xml | 1 + .../qemuxml2xmlout-disk-mirror.xml | 1 + .../qemuxml2xmlout-disk-scsi-device-auto.xml | 1 + .../qemuxml2xmlout-graphics-listen-network2.xml | 1 + .../qemuxml2xmlout-graphics-spice-timeout.xml | 1 + .../qemuxml2xmloutdata/qemuxml2xmlout-memtune.xml | 1 + .../qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml | 1 + ...emuxml2xmlout-numad-auto-memory-vcpu-cpuset.xml | 1 + ...ad-auto-memory-vcpu-no-cpuset-and-placement.xml | 1 + .../qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml | 1 + .../qemuxml2xmlout-serial-target-port-auto.xml | 1 + .../qemuxml2xmlout-usb-ich9-ehci-addr.xml | 1 + 168 files changed, 574 insertions(+), 211 deletions(-) -- 1.8.1.5

Bus and domain need to be checked as well, otherwise we might get false positives when searching for multi-function devices. --- src/qemu/qemu_hotplug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index a6c75cb..fb78af3 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1999,7 +1999,9 @@ static int qemuComparePCIDevice(virDomainDefPtr def ATTRIBUTE_UNUSED, info2->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) return 0; - if (info1->addr.pci.slot == info2->addr.pci.slot && + if (info1->addr.pci.domain == info2->addr.pci.domain && + info1->addr.pci.bus == info2->addr.pci.bus && + info1->addr.pci.slot == info2->addr.pci.slot && info1->addr.pci.function != info2->addr.pci.function) return -1; return 0; -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Bus and domain need to be checked as well, otherwise we might get false positives when searching for multi-function devices. --- src/qemu/qemu_hotplug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
ACK.
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index a6c75cb..fb78af3 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1999,7 +1999,9 @@ static int qemuComparePCIDevice(virDomainDefPtr def ATTRIBUTE_UNUSED, info2->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) return 0;
- if (info1->addr.pci.slot == info2->addr.pci.slot && + if (info1->addr.pci.domain == info2->addr.pci.domain && + info1->addr.pci.bus == info2->addr.pci.bus && + info1->addr.pci.slot == info2->addr.pci.slot && info1->addr.pci.function != info2->addr.pci.function) return -1; return 0;
-- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Use the same formatting as we do for XML in error and debug outputs. --- src/qemu/qemu_command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 009d42d..ac5e1f3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1204,7 +1204,7 @@ static char *qemuPCIAddressAsString(virDevicePCIAddressPtr addr) return NULL; } - if (virAsprintf(&str, "%d:%d:%d.%d", + if (virAsprintf(&str, "%.4x:%.2x:%.2x.%.1x", addr->domain, addr->bus, addr->slot, -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Use the same formatting as we do for XML in error and debug outputs. --- src/qemu/qemu_command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
ACK; qemuPCIAddressAsString is only used for hash lookups, and is not something directly handed to qemu.
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 009d42d..ac5e1f3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1204,7 +1204,7 @@ static char *qemuPCIAddressAsString(virDevicePCIAddressPtr addr) return NULL; }
- if (virAsprintf(&str, "%d:%d:%d.%d", + if (virAsprintf(&str, "%.4x:%.2x:%.2x.%.1x", addr->domain, addr->bus, addr->slot,
-- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Change QEMU_PCI_ADDRESS_LAST_SLOT to the number of slots in the bus, not the maximum slot value, to match QEMU_PCI_ADDRESS_LAST_FUNCTION and rename them both to have _LAST at the end. --- src/qemu/qemu_command.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ac5e1f3..119fd86 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1185,8 +1185,8 @@ cleanup: return ret; } -#define QEMU_PCI_ADDRESS_LAST_SLOT 31 -#define QEMU_PCI_ADDRESS_LAST_FUNCTION 8 +#define QEMU_PCI_ADDRESS_SLOT_LAST 32 +#define QEMU_PCI_ADDRESS_FUNCTION_LAST 8 struct _qemuDomainPCIAddressSet { virHashTablePtr used; virDevicePCIAddress lastaddr; @@ -1263,7 +1263,7 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, virDevicePCIAddress tmp_addr = info->addr.pci; unsigned int *func = &tmp_addr.function; - for (*func = 1; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + for (*func = 1; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { addr = qemuPCIAddressAsString(&tmp_addr); if (!addr) goto cleanup; @@ -1385,7 +1385,7 @@ static int qemuDomainPCIAddressCheckSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddress tmp_addr = *addr; unsigned int *func = &(tmp_addr.function); - for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { str = qemuPCIAddressAsString(&tmp_addr); if (!str) return -1; @@ -1437,7 +1437,7 @@ int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, unsigned int *func = &tmp_addr.function; unsigned int last; - for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) goto cleanup; } @@ -1498,7 +1498,7 @@ int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddress tmp_addr = *addr; unsigned int *func = &tmp_addr.function; - for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { str = qemuPCIAddressAsString(&tmp_addr); if (!str) return -1; @@ -1536,8 +1536,8 @@ qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, char *addr; tmp_addr.slot++; - for (i = 0; i <= QEMU_PCI_ADDRESS_LAST_SLOT; i++, tmp_addr.slot++) { - if (QEMU_PCI_ADDRESS_LAST_SLOT < tmp_addr.slot) { + for (i = 0; i < QEMU_PCI_ADDRESS_SLOT_LAST; i++, tmp_addr.slot++) { + if (QEMU_PCI_ADDRESS_SLOT_LAST <= tmp_addr.slot) { tmp_addr.slot = 0; } @@ -1692,7 +1692,7 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, */ memset(&tmp_addr, 0, sizeof(tmp_addr)); tmp_addr.slot = 1; - for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { if ((*func == 1 && reservedIDE) || (*func == 2 && reservedUSB)) /* we have reserved this pci address */ -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Change QEMU_PCI_ADDRESS_LAST_SLOT to the number of slots in the bus, not the maximum slot value, to match QEMU_PCI_ADDRESS_LAST_FUNCTION and rename them both to have _LAST at the end. --- src/qemu/qemu_command.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Create a new function qemuPCIAddressValidate and call it everywhere the user might supply an incorrect address: * qemuCollectPCIAddress for domain definition * qemuDomainPCIAddressEnsureAddr and ReleaseSlot for hotplug Slot and function shouldn't be wrong at this point, since values out of range should be rejected by the XML parser. --- src/qemu/qemu_command.c | 103 ++++++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 119fd86..8f766c5 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1193,17 +1193,43 @@ struct _qemuDomainPCIAddressSet { }; +/* + * Check that the PCI address is valid for use + * with the specified PCI address set. + */ +static bool qemuPCIAddressValidate(qemuDomainPCIAddressSetPtr addrs ATTRIBUTE_UNUSED, + virDevicePCIAddressPtr addr) +{ + if (addr->domain != 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Only PCI domain 0 is available")); + return false; + } + if (addr->bus != 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Only PCI bus 0 is available")); + return false; + } + if (addr->function >= QEMU_PCI_ADDRESS_FUNCTION_LAST) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid PCI address: function must be < %u"), + QEMU_PCI_ADDRESS_FUNCTION_LAST); + return false; + } + if (addr->slot >= QEMU_PCI_ADDRESS_SLOT_LAST) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid PCI address: slot must be < %u"), + QEMU_PCI_ADDRESS_SLOT_LAST); + return false; + } + return true; +} + + static char *qemuPCIAddressAsString(virDevicePCIAddressPtr addr) { char *str; - if (addr->domain != 0 || - addr->bus != 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Only PCI domain 0 and bus 0 are available")); - return NULL; - } - if (virAsprintf(&str, "%.4x:%.2x:%.2x.%.1x", addr->domain, addr->bus, @@ -1222,7 +1248,8 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, void *opaque) { int ret = -1; - char *addr = NULL; + char *str = NULL; + virDevicePCIAddressPtr addr = &info->addr.pci; qemuDomainPCIAddressSetPtr addrs = opaque; if ((info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) @@ -1235,57 +1262,58 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return 0; } - addr = qemuPCIAddressAsString(&info->addr.pci); - if (!addr) + if (!qemuPCIAddressValidate(addrs, addr)) + return -1; + + if (!(str = qemuPCIAddressAsString(addr))) goto cleanup; - if (virHashLookup(addrs->used, addr)) { + if (virHashLookup(addrs->used, str)) { if (info->addr.pci.function != 0) { virReportError(VIR_ERR_XML_ERROR, _("Attempted double use of PCI Address '%s' " "(may need \"multifunction='on'\" for device on function 0)"), - addr); + str); } else { virReportError(VIR_ERR_XML_ERROR, - _("Attempted double use of PCI Address '%s'"), addr); + _("Attempted double use of PCI Address '%s'"), str); } goto cleanup; } - VIR_DEBUG("Remembering PCI addr %s", addr); - if (virHashAddEntry(addrs->used, addr, addr) < 0) + VIR_DEBUG("Remembering PCI addr %s", str); + if (virHashAddEntry(addrs->used, str, str) < 0) goto cleanup; - addr = NULL; + str = NULL; if ((info->addr.pci.function == 0) && (info->addr.pci.multi != VIR_DEVICE_ADDRESS_PCI_MULTI_ON)) { /* a function 0 w/o multifunction=on must reserve the entire slot */ - virDevicePCIAddress tmp_addr = info->addr.pci; + virDevicePCIAddress tmp_addr = *addr; unsigned int *func = &tmp_addr.function; for (*func = 1; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { - addr = qemuPCIAddressAsString(&tmp_addr); - if (!addr) + if (!(str = qemuPCIAddressAsString(&tmp_addr))) goto cleanup; - if (virHashLookup(addrs->used, addr)) { + if (virHashLookup(addrs->used, str)) { virReportError(VIR_ERR_XML_ERROR, _("Attempted double use of PCI Address '%s' " "(need \"multifunction='off'\" for device " "on function 0)"), - addr); + str); goto cleanup; } - VIR_DEBUG("Remembering PCI addr %s (multifunction=off for function 0)", addr); - if (virHashAddEntry(addrs->used, addr, addr)) + VIR_DEBUG("Remembering PCI addr %s (multifunction=off for function 0)", str); + if (virHashAddEntry(addrs->used, str, str)) goto cleanup; - addr = NULL; + str = NULL; } } ret = 0; cleanup: - VIR_FREE(addr); + VIR_FREE(str); return ret; } @@ -1465,6 +1493,9 @@ int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, return -1; } + if (!qemuPCIAddressValidate(addrs, &dev->addr.pci)) + return -1; + ret = qemuDomainPCIAddressReserveSlot(addrs, &dev->addr.pci); } else { ret = qemuDomainPCIAddressSetNextAddr(addrs, dev); @@ -1498,6 +1529,9 @@ int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddress tmp_addr = *addr; unsigned int *func = &tmp_addr.function; + if (!qemuPCIAddressValidate(addrs, addr)) + return -1; + for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { str = qemuPCIAddressAsString(&tmp_addr); if (!str) @@ -1965,24 +1999,7 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, virQEMUCapsPtr qemuCaps) { if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { - if (info->addr.pci.domain != 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Only PCI device addresses with domain=0 are supported")); - return -1; - } - if (info->addr.pci.bus != 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Only PCI device addresses with bus=0 are supported")); - return -1; - } - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIFUNCTION)) { - if (info->addr.pci.function > 7) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("The function of PCI device addresses must " - "be less than 8")); - return -1; - } - } else { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIFUNCTION)) { if (info->addr.pci.function != 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Only PCI device addresses with function=0 " -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Create a new function qemuPCIAddressValidate and call it everywhere the user might supply an incorrect address: * qemuCollectPCIAddress for domain definition * qemuDomainPCIAddressEnsureAddr and ReleaseSlot for hotplug
Slot and function shouldn't be wrong at this point, since values out of range should be rejected by the XML parser. --- src/qemu/qemu_command.c | 103 ++++++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 43 deletions(-)
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Each bus is represented as an array of 32 8-bit integers where each bit represents a PCI function and each byte represents a PCI slot. Uses just one bus so far. --- src/qemu/qemu_command.c | 152 ++++++++++++++---------------------------------- 1 file changed, 45 insertions(+), 107 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 8f766c5..c51c336 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1187,8 +1187,14 @@ cleanup: #define QEMU_PCI_ADDRESS_SLOT_LAST 32 #define QEMU_PCI_ADDRESS_FUNCTION_LAST 8 + +/* + * Each bit represents a function + * Each byte represents a slot + */ +typedef uint8_t qemuDomainPCIAddressBus[QEMU_PCI_ADDRESS_SLOT_LAST]; struct _qemuDomainPCIAddressSet { - virHashTablePtr used; + qemuDomainPCIAddressBus *used; virDevicePCIAddress lastaddr; }; @@ -1268,7 +1274,7 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, if (!(str = qemuPCIAddressAsString(addr))) goto cleanup; - if (virHashLookup(addrs->used, str)) { + if (addrs->used[addr->bus][addr->slot] & 1 << addr->function) { if (info->addr.pci.function != 0) { virReportError(VIR_ERR_XML_ERROR, _("Attempted double use of PCI Address '%s' " @@ -1281,35 +1287,22 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, goto cleanup; } - VIR_DEBUG("Remembering PCI addr %s", str); - if (virHashAddEntry(addrs->used, str, str) < 0) - goto cleanup; - str = NULL; - if ((info->addr.pci.function == 0) && (info->addr.pci.multi != VIR_DEVICE_ADDRESS_PCI_MULTI_ON)) { /* a function 0 w/o multifunction=on must reserve the entire slot */ - virDevicePCIAddress tmp_addr = *addr; - unsigned int *func = &tmp_addr.function; - - for (*func = 1; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { - if (!(str = qemuPCIAddressAsString(&tmp_addr))) - goto cleanup; - - if (virHashLookup(addrs->used, str)) { - virReportError(VIR_ERR_XML_ERROR, - _("Attempted double use of PCI Address '%s' " - "(need \"multifunction='off'\" for device " - "on function 0)"), - str); - goto cleanup; - } - - VIR_DEBUG("Remembering PCI addr %s (multifunction=off for function 0)", str); - if (virHashAddEntry(addrs->used, str, str)) - goto cleanup; - str = NULL; + if (addrs->used[addr->bus][addr->slot]) { + virReportError(VIR_ERR_XML_ERROR, + _("Attempted double use of PCI Address on slot '%s' " + "(need \"multifunction='off'\" for device " + "on function 0)"), + str); + goto cleanup; } + addrs->used[addr->bus][addr->slot] = 0xFF; + VIR_DEBUG("Remembering PCI slot: %s (multifunction=off)", str); + } else { + VIR_DEBUG("Remembering PCI addr: %s", str); + addrs->used[addr->bus][addr->slot] |= 1 << addr->function; } ret = 0; cleanup: @@ -1373,13 +1366,6 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, return qemuDomainAssignPCIAddresses(def, qemuCaps, obj); } -static void -qemuDomainPCIAddressSetFreeEntry(void *payload, - const void *name ATTRIBUTE_UNUSED) -{ - VIR_FREE(payload); -} - qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def) { qemuDomainPCIAddressSetPtr addrs; @@ -1387,8 +1373,8 @@ qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def) if (VIR_ALLOC(addrs) < 0) goto no_memory; - if (!(addrs->used = virHashCreate(10, qemuDomainPCIAddressSetFreeEntry))) - goto error; + if (VIR_ALLOC_N(addrs->used, 1) < 0) + goto no_memory; if (virDomainDeviceInfoIterate(def, qemuCollectPCIAddress, addrs) < 0) goto error; @@ -1409,24 +1395,7 @@ error: static int qemuDomainPCIAddressCheckSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr) { - char *str; - virDevicePCIAddress tmp_addr = *addr; - unsigned int *func = &(tmp_addr.function); - - for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { - str = qemuPCIAddressAsString(&tmp_addr); - if (!str) - return -1; - - if (virHashLookup(addrs->used, str)) { - VIR_FREE(str); - return -1; - } - - VIR_FREE(str); - } - - return 0; + return addrs->used[addr->bus][addr->slot] ? -1 : 0; } int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, @@ -1434,48 +1403,47 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, { char *str; - str = qemuPCIAddressAsString(addr); - if (!str) + if (!(str = qemuPCIAddressAsString(addr))) return -1; VIR_DEBUG("Reserving PCI addr %s", str); - if (virHashLookup(addrs->used, str)) { + if (addrs->used[addr->bus][addr->slot] & 1 << addr->function) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to reserve PCI address %s"), str); VIR_FREE(str); return -1; } - if (virHashAddEntry(addrs->used, str, str)) { - VIR_FREE(str); - return -1; - } + VIR_FREE(str); addrs->lastaddr = *addr; addrs->lastaddr.function = 0; addrs->lastaddr.multi = 0; + addrs->used[addr->bus][addr->slot] |= 1 << addr->function; return 0; } int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr) { - virDevicePCIAddress tmp_addr = *addr; - unsigned int *func = &tmp_addr.function; - unsigned int last; + char *str; - for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { - if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) - goto cleanup; + if (!(str = qemuPCIAddressAsString(addr))) + return -1; + + VIR_DEBUG("Reserving PCI slot %s", str); + + if (addrs->used[addr->bus][addr->slot]) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to reserve PCI slot %s"), str); + VIR_FREE(str); + return -1; } + VIR_FREE(str); + addrs->used[addr->bus][addr->slot] = 0xFF; return 0; - -cleanup: - for (last = *func, *func = 0; *func < last; (*func)++) - qemuDomainPCIAddressReleaseAddr(addrs, &tmp_addr); - return -1; } int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, @@ -1507,48 +1475,18 @@ int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr) { - char *str; - int ret; - - str = qemuPCIAddressAsString(addr); - if (!str) - return -1; - - ret = virHashRemoveEntry(addrs->used, str); - - VIR_FREE(str); - - return ret; + addrs->used[addr->bus][addr->slot] &= ~(1 << addr->function); + return 0; } int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr) { - char *str; - int ret = 0; - virDevicePCIAddress tmp_addr = *addr; - unsigned int *func = &tmp_addr.function; - if (!qemuPCIAddressValidate(addrs, addr)) return -1; - for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { - str = qemuPCIAddressAsString(&tmp_addr); - if (!str) - return -1; - - if (!virHashLookup(addrs->used, str)) { - VIR_FREE(str); - continue; - } - - VIR_FREE(str); - - if (qemuDomainPCIAddressReleaseAddr(addrs, &tmp_addr) < 0) - ret = -1; - } - - return ret; + addrs->used[addr->bus][addr->slot] = 0; + return 0; } void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) @@ -1556,7 +1494,7 @@ void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) if (!addrs) return; - virHashFree(addrs->used); + VIR_FREE(addrs->used); VIR_FREE(addrs); } -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Each bus is represented as an array of 32 8-bit integers where each bit represents a PCI function and each byte represents a PCI slot.
Uses just one bus so far. --- src/qemu/qemu_command.c | 152 ++++++++++++++---------------------------------- 1 file changed, 45 insertions(+), 107 deletions(-)
Less code to represent less in-memory storage - nice :)
@@ -1268,7 +1274,7 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, if (!(str = qemuPCIAddressAsString(addr))) goto cleanup;
- if (virHashLookup(addrs->used, str)) { + if (addrs->used[addr->bus][addr->slot] & 1 << addr->function) {
I had to remind myself that << has higher precedence than &; adding () might help, although not strictly necessary.
@@ -1434,48 +1403,47 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, { char *str;
- str = qemuPCIAddressAsString(addr); - if (!str) + if (!(str = qemuPCIAddressAsString(addr))) return -1;
VIR_DEBUG("Reserving PCI addr %s", str);
- if (virHashLookup(addrs->used, str)) { + if (addrs->used[addr->bus][addr->slot] & 1 << addr->function) {
Same comment. ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Also change its return value from int to bool. --- src/qemu/qemu_command.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c51c336..1b9d940 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1388,14 +1388,13 @@ error: return NULL; } -/* check whether the slot is used by the other device - * Return 0 if the slot is not used by the other device, or -1 if the slot - * is used by the other device. +/* + * Check if the PCI slot is used by another device. */ -static int qemuDomainPCIAddressCheckSlot(qemuDomainPCIAddressSetPtr addrs, - virDevicePCIAddressPtr addr) +static bool qemuDomainPCIAddressSlotInUse(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr) { - return addrs->used[addr->bus][addr->slot] ? -1 : 0; + return addrs->used[addr->bus][addr->slot] ? true : false; } int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, @@ -1516,7 +1515,7 @@ qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, if (!(addr = qemuPCIAddressAsString(&tmp_addr))) return -1; - if (qemuDomainPCIAddressCheckSlot(addrs, &tmp_addr) < 0) { + if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { VIR_DEBUG("PCI addr %s already in use", addr); VIR_FREE(addr); continue; @@ -1684,7 +1683,7 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, primaryVideo->info.addr.pci.function = 0; addrptr = &primaryVideo->info.addr.pci; - if (qemuDomainPCIAddressCheckSlot(addrs, addrptr) < 0) { + if (qemuDomainPCIAddressSlotInUse(addrs, addrptr)) { if (qemuDeviceVideoUsable) { virResetLastError(); if (qemuDomainPCIAddressSetNextAddr(addrs, &primaryVideo->info) < 0) @@ -1714,7 +1713,7 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, memset(&tmp_addr, 0, sizeof(tmp_addr)); tmp_addr.slot = 2; - if (qemuDomainPCIAddressCheckSlot(addrs, &tmp_addr) < 0) { + if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { VIR_DEBUG("PCI address 0:0:2.0 in use, future addition of a video" " device will not be possible without manual" " intervention"); -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Also change its return value from int to bool. --- src/qemu/qemu_command.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
+static bool qemuDomainPCIAddressSlotInUse(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr) { - return addrs->used[addr->bus][addr->slot] ? -1 : 0; + return addrs->used[addr->bus][addr->slot] ? true : false;
I'm not a fan of 'cond ? true : false' - it is overkill compared to shorter things like '!!cond'. C99 guarantees that 'return int' in a bool function will return 0 or 1; but because we are using gnulib's <stdbool.h>, we can't take that shortcut (gnulib's implementation of stdbool on top of C89 compilers might return > 1, with potential confusion downstream when you have a value out of range of bool). But what you have is is correct, so up to you if you go for a shorter representation. ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

--- src/conf/domain_conf.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 548368e..cf0f1c4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9747,21 +9747,18 @@ virDomainLookupVcpuPin(virDomainDefPtr def, static int virDomainDefMaybeAddController(virDomainDefPtr def, int type, - int idx) + int idx, + int model) { - int found = 0; int i; virDomainControllerDefPtr cont; - for (i = 0 ; (i < def->ncontrollers) && !found; i++) { + for (i = 0; i < def->ncontrollers; i++) { if (def->controllers[i]->type == type && def->controllers[i]->idx == idx) - found = 1; + return 0; } - if (found) - return 0; - if (VIR_ALLOC(cont) < 0) { virReportOOMError(); return -1; @@ -9769,21 +9766,17 @@ static int virDomainDefMaybeAddController(virDomainDefPtr def, cont->type = type; cont->idx = idx; - cont->model = -1; + cont->model = model; if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) { cont->opts.vioserial.ports = -1; cont->opts.vioserial.vectors = -1; } - - if (VIR_REALLOC_N(def->controllers, def->ncontrollers+1) < 0) { + if (VIR_APPEND_ELEMENT(def->controllers, def->ncontrollers, cont) < 0) { VIR_FREE(cont); - virReportOOMError(); return -1; } - def->controllers[def->ncontrollers] = cont; - def->ncontrollers++; return 0; } @@ -10839,7 +10832,7 @@ virDomainDefParseXML(xmlDocPtr xml, if (def->virtType == VIR_DOMAIN_VIRT_QEMU || def->virtType == VIR_DOMAIN_VIRT_KQEMU || def->virtType == VIR_DOMAIN_VIRT_KVM) - if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0) < 0) + if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0, -1) < 0) goto error; /* analysis of the resource leases */ @@ -12718,7 +12711,7 @@ virDomainDefAddDiskControllersForType(virDomainDefPtr def, } for (i = 0 ; i <= maxController ; i++) { - if (virDomainDefMaybeAddController(def, controllerType, i) < 0) + if (virDomainDefMaybeAddController(def, controllerType, i, -1) < 0) return -1; } @@ -12741,7 +12734,7 @@ virDomainDefMaybeAddVirtioSerialController(virDomainDefPtr def) idx = channel->info.addr.vioserial.controller; if (virDomainDefMaybeAddController(def, - VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, idx) < 0) + VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, idx, -1) < 0) return -1; } } @@ -12756,7 +12749,7 @@ virDomainDefMaybeAddVirtioSerialController(virDomainDefPtr def) idx = console->info.addr.vioserial.controller; if (virDomainDefMaybeAddController(def, - VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, idx) < 0) + VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, idx, -1) < 0) return -1; } } @@ -12796,7 +12789,7 @@ virDomainDefMaybeAddSmartcardController(virDomainDefPtr def) if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_CCID, - idx) < 0) + idx, -1) < 0) return -1; } -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
--- src/conf/domain_conf.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-)
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Add new controller type 'pci' with models 'pci-root' and 'pci-bridge'. --- docs/schemas/domaincommon.rng | 3 +++ src/conf/domain_conf.c | 21 ++++++++++++++++++++- src/conf/domain_conf.h | 9 +++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 468c49c..a66a289 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1413,6 +1413,7 @@ <value>sata</value> <value>ccid</value> <value>usb</value> + <value>pci</value> </choice> </attribute> </optional> @@ -1459,6 +1460,8 @@ <value>pci-ohci</value> <value>nec-xhci</value> <value>none</value> + <value>pci-root</value> + <value>pci-bridge</value> </choice> </attribute> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cf0f1c4..a5764fb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -300,7 +300,12 @@ VIR_ENUM_IMPL(virDomainController, VIR_DOMAIN_CONTROLLER_TYPE_LAST, "sata", "virtio-serial", "ccid", - "usb") + "usb", + "pci") + +VIR_ENUM_IMPL(virDomainControllerModelPCI, VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST, + "pci-root", + "pci-bridge") VIR_ENUM_IMPL(virDomainControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST, "auto", @@ -5144,6 +5149,8 @@ virDomainControllerModelTypeFromString(const virDomainControllerDefPtr def, return virDomainControllerModelSCSITypeFromString(model); else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) return virDomainControllerModelUSBTypeFromString(model); + else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + return virDomainControllerModelPCITypeFromString(model); return -1; } @@ -5261,6 +5268,16 @@ virDomainControllerDefParseXML(xmlNodePtr node, } break; } + case VIR_DOMAIN_CONTROLLER_TYPE_PCI: + switch (def->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("pci-root controller should not " + "have an address")); + goto error; + } + } default: break; @@ -13487,6 +13504,8 @@ virDomainControllerModelTypeToString(virDomainControllerDefPtr def, return virDomainControllerModelSCSITypeToString(model); else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) return virDomainControllerModelUSBTypeToString(model); + else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + return virDomainControllerModelPCITypeToString(model); return NULL; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f1f01fa..e2fd079 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -696,11 +696,19 @@ enum virDomainControllerType { VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, VIR_DOMAIN_CONTROLLER_TYPE_CCID, VIR_DOMAIN_CONTROLLER_TYPE_USB, + VIR_DOMAIN_CONTROLLER_TYPE_PCI, VIR_DOMAIN_CONTROLLER_TYPE_LAST }; +enum virDomainControllerModelPCI { + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE, + + VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST +}; + enum virDomainControllerModelSCSI { VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC, @@ -2420,6 +2428,7 @@ VIR_ENUM_DECL(virDomainIoEventFd) VIR_ENUM_DECL(virDomainVirtioEventIdx) VIR_ENUM_DECL(virDomainDiskCopyOnRead) VIR_ENUM_DECL(virDomainController) +VIR_ENUM_DECL(virDomainControllerModelPCI) VIR_ENUM_DECL(virDomainControllerModelSCSI) VIR_ENUM_DECL(virDomainControllerModelUSB) VIR_ENUM_DECL(virDomainFS) -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Add new controller type 'pci' with models 'pci-root' and 'pci-bridge'. --- docs/schemas/domaincommon.rng | 3 +++ src/conf/domain_conf.c | 21 ++++++++++++++++++++- src/conf/domain_conf.h | 9 +++++++++ 3 files changed, 32 insertions(+), 1 deletion(-)
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 04/17/2013 05:12 PM, Eric Blake wrote:
On 04/17/2013 01:00 PM, Ján Tomko wrote:
Add new controller type 'pci' with models 'pci-root' and 'pci-bridge'. --- docs/schemas/domaincommon.rng | 3 +++ src/conf/domain_conf.c | 21 ++++++++++++++++++++- src/conf/domain_conf.h | 9 +++++++++ 3 files changed, 32 insertions(+), 1 deletion(-)
ACK.
Spoke too soon - any time we touch domaincommon.rng, we should also document the changes in docs/formatdomain.html.in. I want to make sure we have documentation before this series is pushed, even if it is easier to add it on at the tail of the series rather than rebased into this particular patch. I'm also hoping that later in the series adds some tests to prove the RNG grammar validates the new XML. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 04/17/2013 03:00 PM, Ján Tomko wrote:
Add new controller type 'pci' with models 'pci-root' and 'pci-bridge'. --- docs/schemas/domaincommon.rng | 3 +++ src/conf/domain_conf.c | 21 ++++++++++++++++++++- src/conf/domain_conf.h | 9 +++++++++ 3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 468c49c..a66a289 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1413,6 +1413,7 @@ <value>sata</value> <value>ccid</value> <value>usb</value> + <value>pci</value> </choice> </attribute> </optional> @@ -1459,6 +1460,8 @@ <value>pci-ohci</value> <value>nec-xhci</value> <value>none</value> + <value>pci-root</value> + <value>pci-bridge</value> </choice> </attribute> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cf0f1c4..a5764fb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -300,7 +300,12 @@ VIR_ENUM_IMPL(virDomainController, VIR_DOMAIN_CONTROLLER_TYPE_LAST, "sata", "virtio-serial", "ccid", - "usb") + "usb", + "pci") + +VIR_ENUM_IMPL(virDomainControllerModelPCI, VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST, + "pci-root", + "pci-bridge")
Ah, how did I miss that? When I was talking about adding different models of pci controllers, I had "modeled" it after the models in <interface>, where it is a separate element, e.g. <interface type='network'> <model type='virtio'/> ... but now I see that usb controllers already *have* "model" directly as an attribute of <controller>, thanks to the different types of usb controllers. Even though that's not consistent with models in <interface>, I actually like it better because it keeps the model closer to the type (and anyway, it's already a done deal, so it doesn't really matter :-) I'll repeat Eric's ACK, but also with the same qualification he later made that it be documented in formatdomain.html.in (and I think it should go into this patch, rather than later in the series).

On 04/17/2013 03:00 PM, Ján Tomko wrote:
Add new controller type 'pci' with models 'pci-root' and 'pci-bridge'. --- docs/schemas/domaincommon.rng | 3 +++ src/conf/domain_conf.c | 21 ++++++++++++++++++++- src/conf/domain_conf.h | 9 +++++++++ 3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 468c49c..a66a289 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1413,6 +1413,7 @@ <value>sata</value> <value>ccid</value> <value>usb</value> + <value>pci</value> </choice> </attribute> </optional> @@ -1459,6 +1460,8 @@ <value>pci-ohci</value> <value>nec-xhci</value> <value>none</value> + <value>pci-root</value> + <value>pci-bridge</value> </choice> </attribute>
It occurred to me that we should only allow model='pci-root|pci-bridge' if type='pci', and when I went back to look at the rng directly (instead of just the diff), I noticed that there is already a separate set of attributes/values allowable for type='virtio-serial'. So, especially because there is already a precedent, I think there should be a separate <group> for type='pci', just as there is for type='virtio-serial', and it should allow model='pci-root|pci-bridge'. Of course this means that the other attribute list will have to be moved inside the existing <group> (and ideally, that group should be split into a separate group for each type) I just made a patch that cleans up the controller rng as described above: http://www.redhat.com/archives/libvir-list/2013-April/msg01320.html Once it has been applied, you can just make the following change to domaincommon.rng instead of what you did above: diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 26523a7..e6af27b 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1475,6 +1475,18 @@ <ref name="usbmaster"/> </optional> </group> + <!-- pci has an optional attribute "model" --> + <group> + <attribute name="type"> + <value>pci</value> + </attribute> + <attribute name="model"> + <choice> + <value>pci-root</value> + <value>pci-bridge</value> + </choice> + </attribute> + </group> <!-- virtio-serial has optional "ports" and "vectors" --> <group> <attribute name="type">

On 04/17/2013 10:38 PM, Laine Stump wrote:
It occurred to me that we should only allow model='pci-root|pci-bridge' if type='pci', and when I went back to look at the rng directly (instead of just the diff), I noticed that there is already a separate set of attributes/values allowable for type='virtio-serial'. So, especially because there is already a precedent, I think there should be a separate <group> for type='pci', just as there is for type='virtio-serial', and it should allow model='pci-root|pci-bridge'. Of course this means that the other attribute list will have to be moved inside the existing <group> (and ideally, that group should be split into a separate group for each type)
I just made a patch that cleans up the controller rng as described above:
http://www.redhat.com/archives/libvir-list/2013-April/msg01320.html
Once it has been applied, you can just make the following change to domaincommon.rng instead of what you did above:
Yes, this is much nicer, as it means RNG won't validate a model for the wrong controller. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

From: liguang <lig.fnst@cn.fujitsu.com> --- src/qemu/qemu_capabilities.c | 3 +++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 44 ++++++++++++++++++++++++++++++++++++++++---- tests/qemuhelptest.c | 21 ++++++++++++++------- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index d10c8aa..4a86d81 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -220,6 +220,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "machine-usb-opt", "tpm-passthrough", "tpm-tis", + + "pci-bridge", /* 140 */ ); struct _virQEMUCaps { @@ -1346,6 +1348,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "virtio-rng-ccw", QEMU_CAPS_DEVICE_VIRTIO_RNG }, { "rng-random", QEMU_CAPS_OBJECT_RNG_RANDOM }, { "rng-egd", QEMU_CAPS_OBJECT_RNG_EGD }, + { "pci-bridge", QEMU_CAPS_DEVICE_PCI_BRIDGE }, }; static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 4e76799..9c11157 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -178,6 +178,7 @@ enum virQEMUCapsFlags { QEMU_CAPS_MACHINE_USB_OPT = 137, /* -machine xxx,usb=on/off */ QEMU_CAPS_DEVICE_TPM_PASSTHROUGH = 138, /* -tpmdev passthrough */ QEMU_CAPS_DEVICE_TPM_TIS = 139, /* -device tpm_tis */ + QEMU_CAPS_DEVICE_PCI_BRIDGE = 140, /* -device pci-bridge */ QEMU_CAPS_LAST, /* this must always be the last item */ }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 1b9d940..ce86eea 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1957,10 +1957,21 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, * When QEMU grows support for > 1 PCI domain, then pci.0 change * to pciNN.0 where NN is the domain number */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS)) - virBufferAsprintf(buf, ",bus=pci.0"); - else - virBufferAsprintf(buf, ",bus=pci"); + if (info->addr.pci.bus != 0) { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) { + virBufferAsprintf(buf, ",bus=pci.%u", info->addr.pci.bus); + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Multiple PCI buses are not supported " + "with this QEMU binary")); + return -1; + } + } else { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS)) + virBufferAsprintf(buf, ",bus=pci.0"); + else + virBufferAsprintf(buf, ",bus=pci"); + } if (info->addr.pci.multi == VIR_DEVICE_ADDRESS_PCI_MULTI_ON) virBufferAddLit(buf, ",multifunction=on"); else if (info->addr.pci.multi == VIR_DEVICE_ADDRESS_PCI_MULTI_OFF) @@ -3606,6 +3617,24 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, break; + case VIR_DOMAIN_CONTROLLER_TYPE_PCI: + switch (def->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + if (def->idx == 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridge index should be > 0")); + goto error; + } + virBufferAsprintf(&buf, "pci-bridge,chassis_nr=%d,id=pci.%d", + def->idx, def->idx); + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("wrong function called for pci-root")); + return NULL; + } + break; + /* We always get an IDE controller, whether we want it or not. */ case VIR_DOMAIN_CONTROLLER_TYPE_IDE: default: @@ -5792,6 +5821,7 @@ qemuBuildCommandLine(virConnectPtr conn, /* We don't add an explicit IDE or FD controller because the * provided PIIX4 device already includes one. It isn't possible to * remove the PIIX4. */ + VIR_DOMAIN_CONTROLLER_TYPE_PCI, VIR_DOMAIN_CONTROLLER_TYPE_USB, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, VIR_DOMAIN_CONTROLLER_TYPE_SATA, @@ -6405,6 +6435,12 @@ qemuBuildCommandLine(virConnectPtr conn, continue; } + /* Skip pci-root */ + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) { + continue; + } + /* Only recent QEMU implements a SATA (AHCI) controller */ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) { diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index 7290183..eeba4d4 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -398,7 +398,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-0.12.3", 12003, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -507,7 +508,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-0.12.1.2-rhel61", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -572,7 +574,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -644,7 +647,8 @@ mymain(void) QEMU_CAPS_VNC, QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_VGA, - QEMU_CAPS_DEVICE_CIRRUS_VGA); + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-1.0", 1000000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -816,7 +820,8 @@ mymain(void) QEMU_CAPS_DEVICE_USB_SERIAL, QEMU_CAPS_DEVICE_USB_NET, QEMU_CAPS_DTB, - QEMU_CAPS_IPV6_MIGRATION); + QEMU_CAPS_IPV6_MIGRATION, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-1.2.0", 1002000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -919,7 +924,8 @@ mymain(void) QEMU_CAPS_DEVICE_USB_NET, QEMU_CAPS_DTB, QEMU_CAPS_SCSI_MEGASAS, - QEMU_CAPS_IPV6_MIGRATION); + QEMU_CAPS_IPV6_MIGRATION, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-1.2.0", 1002000, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -1027,7 +1033,8 @@ mymain(void) QEMU_CAPS_DEVICE_USB_NET, QEMU_CAPS_DTB, QEMU_CAPS_SCSI_MEGASAS, - QEMU_CAPS_IPV6_MIGRATION); + QEMU_CAPS_IPV6_MIGRATION, + QEMU_CAPS_DEVICE_PCI_BRIDGE); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 1.8.1.5

On 04/17/2013 03:00 PM, Ján Tomko wrote:
From: liguang <lig.fnst@cn.fujitsu.com>
--- src/qemu/qemu_capabilities.c | 3 +++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 44 ++++++++++++++++++++++++++++++++++++++++---- tests/qemuhelptest.c | 21 ++++++++++++++------- 4 files changed, 58 insertions(+), 11 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index d10c8aa..4a86d81 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -220,6 +220,8 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "machine-usb-opt", "tpm-passthrough", "tpm-tis", + + "pci-bridge", /* 140 */ );
struct _virQEMUCaps { @@ -1346,6 +1348,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "virtio-rng-ccw", QEMU_CAPS_DEVICE_VIRTIO_RNG }, { "rng-random", QEMU_CAPS_OBJECT_RNG_RANDOM }, { "rng-egd", QEMU_CAPS_OBJECT_RNG_EGD }, + { "pci-bridge", QEMU_CAPS_DEVICE_PCI_BRIDGE }, };
static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 4e76799..9c11157 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -178,6 +178,7 @@ enum virQEMUCapsFlags { QEMU_CAPS_MACHINE_USB_OPT = 137, /* -machine xxx,usb=on/off */ QEMU_CAPS_DEVICE_TPM_PASSTHROUGH = 138, /* -tpmdev passthrough */ QEMU_CAPS_DEVICE_TPM_TIS = 139, /* -device tpm_tis */ + QEMU_CAPS_DEVICE_PCI_BRIDGE = 140, /* -device pci-bridge */
QEMU_CAPS_LAST, /* this must always be the last item */ }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 1b9d940..ce86eea 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1957,10 +1957,21 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, * When QEMU grows support for > 1 PCI domain, then pci.0 change * to pciNN.0 where NN is the domain number */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS)) - virBufferAsprintf(buf, ",bus=pci.0"); - else - virBufferAsprintf(buf, ",bus=pci"); + if (info->addr.pci.bus != 0) { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) { + virBufferAsprintf(buf, ",bus=pci.%u", info->addr.pci.bus); + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Multiple PCI buses are not supported " + "with this QEMU binary")); + return -1; + } + } else { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS)) + virBufferAsprintf(buf, ",bus=pci.0"); + else + virBufferAsprintf(buf, ",bus=pci"); + }
Well, really this hunk is supporting *other* devices that plug into a pci-bridge device, not the pci-bridge device itself. I think this hunk would be better put into 10/10 instead of here. (But it *is* commandline changes related to the presence of a pci-bridge, and one is pointless without the other, so I'm not going to complain too much if you leave it here. :-))
if (info->addr.pci.multi == VIR_DEVICE_ADDRESS_PCI_MULTI_ON) virBufferAddLit(buf, ",multifunction=on"); else if (info->addr.pci.multi == VIR_DEVICE_ADDRESS_PCI_MULTI_OFF) @@ -3606,6 +3617,24 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef,
break;
+ case VIR_DOMAIN_CONTROLLER_TYPE_PCI: + switch (def->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE: + if (def->idx == 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridge index should be > 0")); + goto error; + } + virBufferAsprintf(&buf, "pci-bridge,chassis_nr=%d,id=pci.%d", + def->idx, def->idx); + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("wrong function called for pci-root")); + return NULL; + } + break; + /* We always get an IDE controller, whether we want it or not. */ case VIR_DOMAIN_CONTROLLER_TYPE_IDE: default: @@ -5792,6 +5821,7 @@ qemuBuildCommandLine(virConnectPtr conn, /* We don't add an explicit IDE or FD controller because the * provided PIIX4 device already includes one. It isn't possible to * remove the PIIX4. */
You should include mention of the pci-root pci controller in that comment.
+ VIR_DOMAIN_CONTROLLER_TYPE_PCI, VIR_DOMAIN_CONTROLLER_TYPE_USB, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, VIR_DOMAIN_CONTROLLER_TYPE_SATA, @@ -6405,6 +6435,12 @@ qemuBuildCommandLine(virConnectPtr conn, continue; }
+ /* Skip pci-root */ + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) { + continue; + } + /* Only recent QEMU implements a SATA (AHCI) controller */ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) { diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c index 7290183..eeba4d4 100644 --- a/tests/qemuhelptest.c +++ b/tests/qemuhelptest.c @@ -398,7 +398,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-0.12.3", 12003, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -507,7 +508,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-0.12.1.2-rhel61", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -572,7 +574,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DEVICE_VMWARE_SVGA, QEMU_CAPS_DEVICE_USB_SERIAL, - QEMU_CAPS_DEVICE_USB_NET); + QEMU_CAPS_DEVICE_USB_NET, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -644,7 +647,8 @@ mymain(void) QEMU_CAPS_VNC, QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_VGA, - QEMU_CAPS_DEVICE_CIRRUS_VGA); + QEMU_CAPS_DEVICE_CIRRUS_VGA, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-1.0", 1000000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -816,7 +820,8 @@ mymain(void) QEMU_CAPS_DEVICE_USB_SERIAL, QEMU_CAPS_DEVICE_USB_NET, QEMU_CAPS_DTB, - QEMU_CAPS_IPV6_MIGRATION); + QEMU_CAPS_IPV6_MIGRATION, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-1.2.0", 1002000, 0, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -919,7 +924,8 @@ mymain(void) QEMU_CAPS_DEVICE_USB_NET, QEMU_CAPS_DTB, QEMU_CAPS_SCSI_MEGASAS, - QEMU_CAPS_IPV6_MIGRATION); + QEMU_CAPS_IPV6_MIGRATION, + QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("qemu-kvm-1.2.0", 1002000, 1, 0, QEMU_CAPS_VNC_COLON, QEMU_CAPS_NO_REBOOT, @@ -1027,7 +1033,8 @@ mymain(void) QEMU_CAPS_DEVICE_USB_NET, QEMU_CAPS_DTB, QEMU_CAPS_SCSI_MEGASAS, - QEMU_CAPS_IPV6_MIGRATION); + QEMU_CAPS_IPV6_MIGRATION, + QEMU_CAPS_DEVICE_PCI_BRIDGE);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }
ACK with the comment changed (and that one hunk moved to 10/10 if it's not too big a trouble).

Add a "dry run" address allocation to figure out how many bridges will be needed for all the devices without explicit addresses. Auto-add just enough bridges to put all the devices on, or up to the bridge with the largest specified index. --- src/conf/domain_conf.c | 9 +-- src/conf/domain_conf.h | 5 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 177 +++++++++++++++++++++++++++++++++++++++-------- src/qemu/qemu_command.h | 4 +- 5 files changed, 161 insertions(+), 35 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a5764fb..68518a7 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9762,10 +9762,11 @@ virDomainLookupVcpuPin(virDomainDefPtr def, return NULL; } -static int virDomainDefMaybeAddController(virDomainDefPtr def, - int type, - int idx, - int model) +int +virDomainDefMaybeAddController(virDomainDefPtr def, + int type, + int idx, + int model) { int i; virDomainControllerDefPtr cont; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e2fd079..72603bf 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2548,6 +2548,11 @@ int virDomainObjListExport(virDomainObjListPtr doms, virDomainVcpuPinDefPtr virDomainLookupVcpuPin(virDomainDefPtr def, int vcpuid); +int virDomainDefMaybeAddController(virDomainDefPtr def, + int type, + int idx, + int model); + char *virDomainDefGetDefaultEmulator(virDomainDefPtr def, virCapsPtr caps); #endif /* __DOMAIN_CONF_H */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 30fdcd7..a749500 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -116,6 +116,7 @@ virDomainDefFree; virDomainDefGenSecurityLabelDef; virDomainDefGetDefaultEmulator; virDomainDefGetSecurityLabelDef; +virDomainDefMaybeAddController; virDomainDefParseFile; virDomainDefParseNode; virDomainDefParseString; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ce86eea..df0077a 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1195,6 +1195,9 @@ cleanup: typedef uint8_t qemuDomainPCIAddressBus[QEMU_PCI_ADDRESS_SLOT_LAST]; struct _qemuDomainPCIAddressSet { qemuDomainPCIAddressBus *used; + size_t nbuses; /* allocation of used */ + bool dryRun; /* on a dry run, new buses are auto-added + and addresses aren't saved in device infos */ virDevicePCIAddress lastaddr; }; @@ -1211,9 +1214,10 @@ static bool qemuPCIAddressValidate(qemuDomainPCIAddressSetPtr addrs ATTRIBUTE_UN _("Only PCI domain 0 is available")); return false; } - if (addr->bus != 0) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Only PCI bus 0 is available")); + if (addr->bus >= addrs->nbuses) { + virReportError(VIR_ERR_XML_ERROR, _("Only PCI buses up to %u are" + " available"), + (unsigned int) addrs->nbuses - 1); return false; } if (addr->function >= QEMU_PCI_ADDRESS_FUNCTION_LAST) { @@ -1228,9 +1232,44 @@ static bool qemuPCIAddressValidate(qemuDomainPCIAddressSetPtr addrs ATTRIBUTE_UN QEMU_PCI_ADDRESS_SLOT_LAST); return false; } + if (addr->slot == 0) { + if (addr->bus) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Slot 0 is unusable on PCI bridges")); + return false; + } else { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Slot 0 on bus 0 is reserved for the host bridge")); + return false; + } + } return true; } +/* grows the address set to fit addr in + * -1 = OOM + * 0 = no action required + * >0 = number of buses added + */ +static int qemuPCIAddressSetGrow(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr) +{ + int add, i; + + add = addr->bus - addrs->nbuses + 1; + i = addrs->nbuses; + if (add <= 0) + return 0; + if (VIR_EXPAND_N(addrs->used, addrs->nbuses, add) < 0) { + virReportOOMError(); + return -1; + } + /* reserve slot 0 on the new buses */ + for (; i < addrs->nbuses; i++) + addrs->used[i][0] = 0xFF; + return add; +} + static char *qemuPCIAddressAsString(virDevicePCIAddressPtr addr) { @@ -1268,6 +1307,9 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return 0; } + if (addrs->dryRun && qemuPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!qemuPCIAddressValidate(addrs, addr)) return -1; @@ -1321,7 +1363,39 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (!(addrs = qemuDomainPCIAddressSetCreate(def))) + int nbuses = 1; + int i; + int rv; + + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && + def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE) + nbuses++; + } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) { + virDomainDeviceInfo info; + /* 1st pass to figure out how many PCI bridges we need */ + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true))) + goto cleanup; + if (nbuses && qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + goto cleanup; + /* Reserve 1 extra slot for a (potential) bridge */ + if (qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0) + goto cleanup; + + for (i = 1; i < addrs->nbuses; i++) { + if ((rv = virDomainDefMaybeAddController( + def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, + i, VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE)) < 0) + goto cleanup; + /* If we added a new bridge, we will need one more address */ + if (rv > 0 && qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0) + goto cleanup; + } + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + } + if (!(addrs = qemuDomainPCIAddressSetCreate(def, addrs->nbuses, false))) goto cleanup; if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) @@ -1366,15 +1440,25 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, return qemuDomainAssignPCIAddresses(def, qemuCaps, obj); } -qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def) +qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + unsigned int nbuses, + bool dryRun) { qemuDomainPCIAddressSetPtr addrs; + int i; if (VIR_ALLOC(addrs) < 0) goto no_memory; - if (VIR_ALLOC_N(addrs->used, 1) < 0) + if (VIR_ALLOC_N(addrs->used, nbuses) < 0) goto no_memory; + addrs->nbuses = nbuses; + addrs->dryRun = dryRun; + + /* reserve slot 0 in every bus - it's used by the host bridge on bus 0 + * and unusable on PCI bridges */ + for (i = 0; i < nbuses; i++) + addrs->used[i][0] = 0xFF; if (virDomainDeviceInfoIterate(def, qemuCollectPCIAddress, addrs) < 0) goto error; @@ -1402,6 +1486,9 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, { char *str; + if (addrs->dryRun && qemuPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1; @@ -1428,6 +1515,9 @@ int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, { char *str; + if (addrs->dryRun && qemuPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1; @@ -1503,30 +1593,44 @@ qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; + int i,j; char *addr; tmp_addr.slot++; - for (i = 0; i < QEMU_PCI_ADDRESS_SLOT_LAST; i++, tmp_addr.slot++) { - if (QEMU_PCI_ADDRESS_SLOT_LAST <= tmp_addr.slot) { - tmp_addr.slot = 0; - } + for (j = 0; j < addrs->nbuses; j++) { + for (i = 0; i < QEMU_PCI_ADDRESS_SLOT_LAST; i++, tmp_addr.slot++) { + if (QEMU_PCI_ADDRESS_SLOT_LAST <= tmp_addr.slot) { + /* slot 0 is unusable */ + tmp_addr.slot = 1; + i++; + } - if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + if (!(addr = qemuPCIAddressAsString(&tmp_addr))) + return -1; - if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - VIR_DEBUG("PCI addr %s already in use", addr); - VIR_FREE(addr); - continue; - } + if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { + VIR_DEBUG("PCI addr %s already in use", addr); + VIR_FREE(addr); + continue; + } - VIR_DEBUG("Found free PCI addr %s", addr); - VIR_FREE(addr); + VIR_DEBUG("Found free PCI addr %s", addr); + VIR_FREE(addr); - addrs->lastaddr = tmp_addr; - *next_addr = tmp_addr; - return 0; + addrs->lastaddr = tmp_addr; + *next_addr = tmp_addr; + return 0; + } + tmp_addr.bus++; + if (addrs->nbuses <= tmp_addr.bus) { + if (addrs->dryRun) { + if (qemuPCIAddressSetGrow(addrs, &tmp_addr) < 0) + return -1; + } else { + tmp_addr.bus = 0; + } + tmp_addr.slot = 1; + } } virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1544,8 +1648,10 @@ int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, if (qemuDomainPCIAddressReserveSlot(addrs, &addr) < 0) return -1; - dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; - dev->addr.pci = addr; + if (!addrs->dryRun) { + dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; + dev->addr.pci = addr; + } addrs->lastaddr = addr; return 0; @@ -1605,11 +1711,6 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, unsigned int *func = &tmp_addr.function; - /* Reserve slot 0 for the host bridge */ - memset(&tmp_addr, 0, sizeof(tmp_addr)); - if (qemuDomainPCIAddressReserveSlot(addrs, &tmp_addr) < 0) - goto error; - /* Verify that first IDE and USB controllers (if any) is on the PIIX3, fn 1 */ for (i = 0; i < def->ncontrollers ; i++) { /* First IDE controller lives on the PIIX3 at slot=1, function=1 */ @@ -1723,6 +1824,18 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, } } + /* PCI controllers */ + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) + continue; + if (def->controllers[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) + continue; + if (qemuDomainPCIAddressSetNextAddr(addrs, &def->controllers[i]->info) < 0) + goto error; + } + } + for (i = 0; i < def->nfss ; i++) { if (def->fss[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) continue; @@ -1762,6 +1875,10 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* Device controllers (SCSI, USB, but not IDE, FDC or CCID) */ for (i = 0; i < def->ncontrollers ; i++) { + /* PCI controllers have been dealt with earlier */ + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + continue; + /* FDC lives behind the ISA bridge; CCID is a usb device */ if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC || def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_CCID) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 1789c20..5f04001 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -196,7 +196,9 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def, int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, virDomainObjPtr obj); -qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def); +qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + unsigned int nbuses, + bool dryRun); int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, -- 1.8.1.5

On 04/17/2013 01:00 PM, Ján Tomko wrote:
Add a "dry run" address allocation to figure out how many bridges will be needed for all the devices without explicit addresses.
Auto-add just enough bridges to put all the devices on, or up to the bridge with the largest specified index. --- src/conf/domain_conf.c | 9 +-- src/conf/domain_conf.h | 5 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 177 +++++++++++++++++++++++++++++++++++++++-------- src/qemu/qemu_command.h | 4 +- 5 files changed, 161 insertions(+), 35 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a5764fb..68518a7 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9762,10 +9762,11 @@ virDomainLookupVcpuPin(virDomainDefPtr def, return NULL; }
-static int virDomainDefMaybeAddController(virDomainDefPtr def, - int type, - int idx, - int model) +int +virDomainDefMaybeAddController(virDomainDefPtr def, + int type, + int idx, + int model)
I wonder if it's worth squashing the indentation change into 7/11, leaving only the s/static// for this patch. Then again, it's the same net number of line changes.
+++ b/src/qemu/qemu_command.c @@ -1195,6 +1195,9 @@ cleanup: typedef uint8_t qemuDomainPCIAddressBus[QEMU_PCI_ADDRESS_SLOT_LAST]; struct _qemuDomainPCIAddressSet { qemuDomainPCIAddressBus *used; + size_t nbuses; /* allocation of used */ + bool dryRun; /* on a dry run, new buses are auto-added + and addresses aren't saved in device infos */ virDevicePCIAddress lastaddr; };
@@ -1211,9 +1214,10 @@ static bool qemuPCIAddressValidate(qemuDomainPCIAddressSetPtr addrs ATTRIBUTE_UN _("Only PCI domain 0 is available")); return false; } - if (addr->bus != 0) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Only PCI bus 0 is available")); + if (addr->bus >= addrs->nbuses) { + virReportError(VIR_ERR_XML_ERROR, _("Only PCI buses up to %u are" + " available"),
If you write this as: if (addr->bus >= addrs->nbuses) { virReportError(VIR_ERR_XML_ERROR, _("Only PCI buses up to %u are available"), then you don't have to split the string.
+ (unsigned int) addrs->nbuses - 1);
Instead of casting, use %zu (since addrs->nbuses is size_t).
+/* grows the address set to fit addr in
I did a double-take reading that; how about: Ensure addr fits in the address set, by expanding it if needed.
+ * -1 = OOM + * 0 = no action required + * >0 = number of buses added + */ +static int qemuPCIAddressSetGrow(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr)
static int qemuPCIAddressSetGrow(...
@@ -1321,7 +1363,39 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (!(addrs = qemuDomainPCIAddressSetCreate(def))) + int nbuses = 1; + int i; + int rv; + + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && + def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE) + nbuses++; + } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) { + virDomainDeviceInfo info; + /* 1st pass to figure out how many PCI bridges we need */ + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true))) + goto cleanup; + if (nbuses && qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + goto cleanup; + /* Reserve 1 extra slot for a (potential) bridge */ + if (qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0) + goto cleanup; + + for (i = 1; i < addrs->nbuses; i++) { + if ((rv = virDomainDefMaybeAddController( + def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, + i, VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE)) < 0) + goto cleanup; + /* If we added a new bridge, we will need one more address */ + if (rv > 0 && qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0) + goto cleanup; + } + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + }
Do we need an else that fails if we have no pci bridge support, but more than one pci controller is present?
+ if (!(addrs = qemuDomainPCIAddressSetCreate(def, addrs->nbuses, false))) goto cleanup;
if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) @@ -1366,15 +1440,25 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, return qemuDomainAssignPCIAddresses(def, qemuCaps, obj); }
-qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def) +qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + unsigned int nbuses, + bool dryRun) { qemuDomainPCIAddressSetPtr addrs; + int i;
if (VIR_ALLOC(addrs) < 0) goto no_memory;
- if (VIR_ALLOC_N(addrs->used, 1) < 0) + if (VIR_ALLOC_N(addrs->used, nbuses) < 0) goto no_memory; + addrs->nbuses = nbuses; + addrs->dryRun = dryRun; + + /* reserve slot 0 in every bus - it's used by the host bridge on bus 0 + * and unusable on PCI bridges */ + for (i = 0; i < nbuses; i++) + addrs->used[i][0] = 0xFF;
if (virDomainDeviceInfoIterate(def, qemuCollectPCIAddress, addrs) < 0) goto error; @@ -1402,6 +1486,9 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, { char *str;
+ if (addrs->dryRun && qemuPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1;
@@ -1428,6 +1515,9 @@ int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, { char *str;
+ if (addrs->dryRun && qemuPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1;
@@ -1503,30 +1593,44 @@ qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; + int i,j;
Space after comma.
char *addr;
tmp_addr.slot++; - for (i = 0; i < QEMU_PCI_ADDRESS_SLOT_LAST; i++, tmp_addr.slot++) { - if (QEMU_PCI_ADDRESS_SLOT_LAST <= tmp_addr.slot) { - tmp_addr.slot = 0; - } + for (j = 0; j < addrs->nbuses; j++) { + for (i = 0; i < QEMU_PCI_ADDRESS_SLOT_LAST; i++, tmp_addr.slot++) { + if (QEMU_PCI_ADDRESS_SLOT_LAST <= tmp_addr.slot) { + /* slot 0 is unusable */ + tmp_addr.slot = 1; + i++; + }
I found this use of 'i' a bit confusing - any time you change the iteration conditions inside the loop body, it becomes trickier to follow the logic. I think you got it right, in that basically you want to iterate over 31 slots, instead of 32 (by skipping slot 0), but where the slot you probe starts from addrs->lastaddr and wraps around rather than starting at 1. Would it be any clearer if the inner loop iterated over i=1; i < SLOT_LAST, so that the only increment of i is in the loop header? Also, I think I see why keeping this cache logic is essential for bus 0 for back-compat reasons (we want to avoid hot-plugging a new device into a previously-used but now unplugged slot, at least until we have run out of unique slots to plug into, in order to minimize guest confusion about different devices trying to reuse a slot). But do we really need to extend it to bus 1? That is, if one call fills the last slot of bus 0 and sets addrs->lastaddr to 5, do we really want the next call to start at slot 5 of bus 1, or even though nothing has ever probed slots 1-4 of bus 1? I'm worried that your caching of last-used slot is not quite right; in fact, I wonder if you need to cache both last-used bus and last-used slot on that bus, or even last-used slot on all buses, rather than just a single last-used slot without relation to bus.
- if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + if (!(addr = qemuPCIAddressAsString(&tmp_addr))) + return -1;
- if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - VIR_DEBUG("PCI addr %s already in use", addr); - VIR_FREE(addr); - continue; - } + if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { + VIR_DEBUG("PCI addr %s already in use", addr); + VIR_FREE(addr); + continue; + }
- VIR_DEBUG("Found free PCI addr %s", addr); - VIR_FREE(addr); + VIR_DEBUG("Found free PCI addr %s", addr); + VIR_FREE(addr);
- addrs->lastaddr = tmp_addr; - *next_addr = tmp_addr; - return 0; + addrs->lastaddr = tmp_addr; + *next_addr = tmp_addr; + return 0;
Again, thinking about last-used slot, it seems like if this filled up all available slots on the bus, wouldn't it be better to set addrs->lastaddr to 1 (to start the next bus correctly)? Does the outer loop (on 'j') need to start iterating from the last-used bus instead of starting at bus 0 and finding all 31 slots full? Or is caching the last-used slot something that we can completely avoid in the case of a multibus support, and only worry about it for older qemu?
+ } + tmp_addr.bus++; + if (addrs->nbuses <= tmp_addr.bus) { + if (addrs->dryRun) { + if (qemuPCIAddressSetGrow(addrs, &tmp_addr) < 0) + return -1; + } else { + tmp_addr.bus = 0; + } + tmp_addr.slot = 1; + } }
virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1544,8 +1648,10 @@ int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs,
I didn't spot any other logic questions, but making sure we get next address allocation done correctly is probably still worth a v3. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 04/19/2013 01:02 AM, Eric Blake wrote:
On 04/17/2013 01:00 PM, Ján Tomko wrote:
@@ -1321,7 +1363,39 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (!(addrs = qemuDomainPCIAddressSetCreate(def))) + int nbuses = 1; + int i; + int rv; + + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && + def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE) + nbuses++; + } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) { + virDomainDeviceInfo info; + /* 1st pass to figure out how many PCI bridges we need */ + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true))) + goto cleanup; + if (nbuses && qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + goto cleanup; + /* Reserve 1 extra slot for a (potential) bridge */ + if (qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0) + goto cleanup; + + for (i = 1; i < addrs->nbuses; i++) { + if ((rv = virDomainDefMaybeAddController( + def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, + i, VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE)) < 0) + goto cleanup; + /* If we added a new bridge, we will need one more address */ + if (rv > 0 && qemuDomainPCIAddressSetNextAddr(addrs, &info) < 0) + goto cleanup; + } + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + }
Do we need an else that fails if we have no pci bridge support, but more than one pci controller is present?
I'd rather disallow multiple PCI controllers with the same index (and check if pci-root has index 0). Specifying two bridges with indexes 1 and 3 also doesn't mean that buses 0-2 are available (which is what my code above would think if bus 3 would be unused). And it would also be nice to add them to qemu command line without referencing bridges that don't exist yet by requiring that bus < index in the bridge address and inserting them in order (but I'm worried that doing so in virDomainDefMaybeAddController might break other things).
+ if (!(addrs = qemuDomainPCIAddressSetCreate(def, addrs->nbuses, false))) goto cleanup;
if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
@@ -1503,30 +1593,44 @@ qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; + int i,j;
Space after comma.
char *addr;
tmp_addr.slot++; - for (i = 0; i < QEMU_PCI_ADDRESS_SLOT_LAST; i++, tmp_addr.slot++) { - if (QEMU_PCI_ADDRESS_SLOT_LAST <= tmp_addr.slot) { - tmp_addr.slot = 0; - } + for (j = 0; j < addrs->nbuses; j++) { + for (i = 0; i < QEMU_PCI_ADDRESS_SLOT_LAST; i++, tmp_addr.slot++) { + if (QEMU_PCI_ADDRESS_SLOT_LAST <= tmp_addr.slot) { + /* slot 0 is unusable */ + tmp_addr.slot = 1; + i++; + }
I found this use of 'i' a bit confusing - any time you change the iteration conditions inside the loop body, it becomes trickier to follow the logic. I think you got it right, in that basically you want to iterate over 31 slots, instead of 32 (by skipping slot 0), but where the slot you probe starts from addrs->lastaddr and wraps around rather than starting at 1.
Would it be any clearer if the inner loop iterated over i=1; i < SLOT_LAST, so that the only increment of i is in the loop header?
Yes, that would make it slightly less disgusting. Or maybe i=0; i < SLOT_LAST-1?
Also, I think I see why keeping this cache logic is essential for bus 0 for back-compat reasons (we want to avoid hot-plugging a new device into a previously-used but now unplugged slot, at least until we have run out of unique slots to plug into, in order to minimize guest confusion about different devices trying to reuse a slot). But do we really need to extend it to bus 1? That is, if one call fills the last slot of bus 0 and sets addrs->lastaddr to 5, do we really want the next call to start at slot 5 of bus 1, or even though nothing has ever probed slots 1-4 of bus 1? I'm worried that your caching of last-used slot is not quite right; in fact, I wonder if you need to cache both last-used bus and last-used slot on that bus, or even last-used slot on all buses, rather than just a single last-used slot without relation to bus.
It does cache the domain, bus and slot.
- if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + if (!(addr = qemuPCIAddressAsString(&tmp_addr))) + return -1;
- if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - VIR_DEBUG("PCI addr %s already in use", addr); - VIR_FREE(addr); - continue; - } + if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { + VIR_DEBUG("PCI addr %s already in use", addr); + VIR_FREE(addr); + continue; + }
- VIR_DEBUG("Found free PCI addr %s", addr); - VIR_FREE(addr); + VIR_DEBUG("Found free PCI addr %s", addr); + VIR_FREE(addr);
- addrs->lastaddr = tmp_addr; - *next_addr = tmp_addr; - return 0; + addrs->lastaddr = tmp_addr; + *next_addr = tmp_addr; + return 0;
Again, thinking about last-used slot, it seems like if this filled up all available slots on the bus, wouldn't it be better to set addrs->lastaddr to 1 (to start the next bus correctly)? Does the outer loop (on 'j') need to start iterating from the last-used bus instead of starting at bus 0 and finding all 31 slots full?
j is just there to make sure we stop if all the buses are full. tmp_addr.bus will be set to whatever bus was in lastaddr and yes, advancing to the next bus and starting from slot 1 would make more sense. And it might even make the loop look like it's from this planet.
Or is caching the last-used slot something that we can completely avoid in the case of a multibus support, and only worry about it for older qemu?
Without it, we'd need to go over all the buses every time a new address is needed. But I'm not sure if we want to cache reservation of slot 7 when slot 6 is empty (which could only happen with hotplug, since addresses from the XML config are not cached and the rest is assigned sequentially). (Btw: I accidentally removed the caching from ReserveSlot in 5/11 which is where explicitly specified addresses of hotplugged devices are cached).
+ } + tmp_addr.bus++; + if (addrs->nbuses <= tmp_addr.bus) { + if (addrs->dryRun) { + if (qemuPCIAddressSetGrow(addrs, &tmp_addr) < 0) + return -1; + } else { + tmp_addr.bus = 0; + } + tmp_addr.slot = 1; + } }
virReportError(VIR_ERR_INTERNAL_ERROR,

<controller type='pci' index='0' model='pci-root'/> is auto-added to pc* machine types. Without this controller PCI bus 0 is not available and no PCI addresses are assigned by default. Since older libvirt supported PCI bus 0 even without this controller, it is removed from the XML when migrating. --- src/conf/domain_conf.c | 8 ++++- src/qemu/qemu_command.c | 18 ++++++++--- src/qemu/qemu_domain.c | 37 ++++++++++++++++++++++ tests/domainsnapshotxml2xmlout/disk_snapshot.xml | 1 + tests/domainsnapshotxml2xmlout/external_vm.xml | 1 + tests/domainsnapshotxml2xmlout/full_domain.xml | 1 + tests/domainsnapshotxml2xmlout/metadata.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml | 1 + .../qemuxml2argv-blkiotune-device.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-blkiotune.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 1 + .../qemuxml2argv-boot-menu-disable.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-boot-network.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 1 + .../qemuxml2argv-channel-guestfwd.xml | 1 + .../qemuxml2argv-channel-virtio.xml | 1 + .../qemuxml2argv-clock-localtime.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml | 1 + .../qemuxml2argv-console-compat.xml | 1 + .../qemuxml2argv-console-virtio-many.xml | 1 + .../qemuxml2argv-controller-order.xml | 1 + .../qemuxml2argv-cpu-eoi-disabled.xml | 1 + .../qemuxml2argv-cpu-eoi-enabled.xml | 1 + .../qemuxml2argv-cpu-host-kvmclock.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-cputune.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 1 + .../qemuxml2argv-disk-cdrom-empty.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 1 + .../qemuxml2argv-disk-drive-boot-cdrom.xml | 1 + .../qemuxml2argv-disk-drive-boot-disk.xml | 1 + .../qemuxml2argv-disk-drive-cache-directsync.xml | 1 + .../qemuxml2argv-disk-drive-cache-unsafe.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-none.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-none.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 1 + ...muxml2argv-disk-drive-error-policy-enospace.xml | 1 + .../qemuxml2argv-disk-drive-error-policy-stop.xml | 1 + ...rgv-disk-drive-error-policy-wreport-rignore.xml | 1 + .../qemuxml2argv-disk-drive-fat.xml | 1 + .../qemuxml2argv-disk-drive-fmt-qcow.xml | 1 + .../qemuxml2argv-disk-drive-network-gluster.xml | 1 + .../qemuxml2argv-disk-drive-network-iscsi-auth.xml | 1 + .../qemuxml2argv-disk-drive-network-iscsi.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-export.xml | 1 + ...xml2argv-disk-drive-network-nbd-ipv6-export.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-ipv6.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-unix.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd.xml | 1 + ...emuxml2argv-disk-drive-network-rbd-ceph-env.xml | 1 + .../qemuxml2argv-disk-drive-network-rbd-ipv6.xml | 1 + .../qemuxml2argv-disk-drive-network-rbd.xml | 1 + .../qemuxml2argv-disk-drive-network-sheepdog.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-mirror.xml | 1 + .../qemuxml2argv-disk-scsi-device.xml | 1 + .../qemuxml2argv-disk-scsi-disk-vpd.xml | 1 + ...qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml | 1 + .../qemuxml2argv-disk-scsi-megasas.xml | 1 + .../qemuxml2argv-disk-scsi-virtio-scsi.xml | 1 + .../qemuxml2argv-disk-scsi-vscsi.xml | 1 + .../qemuxml2argv-disk-source-pool.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml | 1 + .../qemuxml2argv-disk-virtio-scsi-num_queues.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 1 + .../qemuxml2argv-encrypted-disk.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 1 + .../qemuxml2argv-floppy-drive-fat.xml | 1 + .../qemuxml2argv-graphics-listen-network.xml | 1 + .../qemuxml2argv-graphics-sdl-fullscreen.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml | 1 + .../qemuxml2argv-graphics-spice-compression.xml | 1 + .../qemuxml2argv-graphics-spice-qxl-vga.xml | 1 + .../qemuxml2argv-graphics-spice.xml | 1 + .../qemuxml2argv-graphics-vnc-sasl.xml | 1 + .../qemuxml2argv-graphics-vnc-socket.xml | 1 + .../qemuxml2argv-graphics-vnc-tls.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml | 1 + .../qemuxml2argv-hostdev-pci-address.xml | 1 + .../qemuxml2argv-hostdev-usb-address.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml | 1 + .../qemuxml2argv-input-usbmouse.xml | 1 + .../qemuxml2argv-input-usbtablet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 1 + .../qemuxml2argv-machine-core-off.xml | 1 + .../qemuxml2argv-machine-core-on.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-migrate.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-minimal.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml | 1 + .../qemuxml2argv-misc-disable-s3.xml | 1 + .../qemuxml2argv-misc-disable-suspends.xml | 1 + .../qemuxml2argv-misc-enable-s4.xml | 1 + .../qemuxml2argv-misc-no-reboot.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml | 1 + .../qemuxml2argv-net-bandwidth.xml | 1 + .../qemuxml2argv-net-eth-ifname.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml | 1 + .../qemuxml2argv-net-openvswitch.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-user.xml | 1 + .../qemuxml2argv-net-virtio-device.xml | 1 + .../qemuxml2argv-net-virtio-network-portgroup.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml | 1 + .../qemuxml2argv-nographics-vga.xml | 1 + .../qemuxml2argv-numad-static-vcpu-no-numatune.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml | 1 + .../qemuxml2argv-qemu-ns-no-env.xml | 1 + .../qemuxml2argv-reboot-timeout-disabled.xml | 1 + .../qemuxml2argv-reboot-timeout-enabled.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml | 1 + .../qemuxml2argv-seclabel-dynamic-baselabel.xml | 1 + .../qemuxml2argv-seclabel-dynamic-override.xml | 1 + .../qemuxml2argv-seclabel-none.xml | 1 + .../qemuxml2argv-seclabel-static.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-file.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-many.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml | 1 + .../qemuxml2argv-serial-tcp-telnet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-unix.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-sound-device.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-sound.xml | 1 + .../qemuxml2argv-tpm-passthrough.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml | 1 + .../qemuxml2argv-virtio-rng-egd.xml | 1 + .../qemuxml2argv-virtio-rng-random.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml | 1 + .../qemuxml2xmlout-balloon-device-auto.xml | 1 + .../qemuxml2xmlout-channel-virtio-auto.xml | 1 + .../qemuxml2xmlout-console-compat-auto.xml | 1 + .../qemuxml2xmlout-console-virtio.xml | 1 + .../qemuxml2xmlout-disk-mirror.xml | 1 + .../qemuxml2xmlout-disk-scsi-device-auto.xml | 1 + .../qemuxml2xmlout-graphics-listen-network2.xml | 1 + .../qemuxml2xmlout-graphics-spice-timeout.xml | 1 + .../qemuxml2xmloutdata/qemuxml2xmlout-memtune.xml | 1 + .../qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml | 1 + ...emuxml2xmlout-numad-auto-memory-vcpu-cpuset.xml | 1 + ...ad-auto-memory-vcpu-no-cpuset-and-placement.xml | 1 + .../qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml | 1 + .../qemuxml2xmlout-serial-target-port-auto.xml | 1 + .../qemuxml2xmlout-usb-ich9-ehci-addr.xml | 1 + 160 files changed, 215 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 68518a7..a2179aa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10849,9 +10849,15 @@ virDomainDefParseXML(xmlDocPtr xml, if (def->virtType == VIR_DOMAIN_VIRT_QEMU || def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) + def->virtType == VIR_DOMAIN_VIRT_KVM) { if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0, -1) < 0) goto error; + if (STRPREFIX(def->os.machine,"pc")) { + if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } + } /* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index df0077a..21da6b6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1209,6 +1209,10 @@ struct _qemuDomainPCIAddressSet { static bool qemuPCIAddressValidate(qemuDomainPCIAddressSetPtr addrs ATTRIBUTE_UNUSED, virDevicePCIAddressPtr addr) { + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return false; + } if (addr->domain != 0) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Only PCI domain 0 is available")); @@ -1363,15 +1367,15 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - int nbuses = 1; + int nbuses = 0; int i; int rv; for (i = 0; i < def->ncontrollers; i++) { - if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && - def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE) + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) nbuses++; } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) { virDomainDeviceInfo info; /* 1st pass to figure out how many PCI bridges we need */ @@ -1398,7 +1402,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def, addrs->nbuses, false))) goto cleanup; - if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + if (nbuses && qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) goto cleanup; } @@ -10146,6 +10150,12 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (virDomainDefAddImplicitControllers(def) < 0) goto error; + if (STRPREFIX(def->os.machine,"pc")) { + if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } + if (cmd->num_args || cmd->num_env) { def->ns = *virDomainXMLOptionGetNamespace(xmlopt); def->namespaceData = cmd; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a7aabdf..9d6db05 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1255,6 +1255,7 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, if ((flags & VIR_DOMAIN_XML_MIGRATABLE)) { int i; + int idx = -1; virDomainControllerDefPtr usb = NULL; /* If only the default USB controller is present, we can remove it @@ -1288,6 +1289,42 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, def->controllers[def->ncontrollers++] = controllers[i]; } } + + /* Remove the default PCI controller if there is only one present + * and its model is pci-root */ + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (idx >= 0) { + idx = -1; + break; + } + idx = i; + } + } + if (idx >= 0 && def->controllers[idx]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) { + VIR_DEBUG("Removing default 'pci-root' from domain '%s'" + " for migration compatibility", def->name); + if (usb) { + if (VIR_DELETE_ELEMENT(def->controllers, idx, def->ncontrollers) < 0) { + virReportOOMError(); + goto cleanup; + } + } else { + controllers = def->controllers; + ncontrollers = def->ncontrollers; + if (VIR_ALLOC_N(def->controllers, ncontrollers - 1) < 0) { + controllers = NULL; + virReportOOMError(); + goto cleanup; + } + + def->ncontrollers = 0; + for (i = 0; i < ncontrollers; i++) { + if (i != idx) + def->controllers[def->ncontrollers++] = controllers[i]; + } + } + } } ret = virDomainDefFormatInternal(def, flags, buf); diff --git a/tests/domainsnapshotxml2xmlout/disk_snapshot.xml b/tests/domainsnapshotxml2xmlout/disk_snapshot.xml index 57aef16..5f42bf5 100644 --- a/tests/domainsnapshotxml2xmlout/disk_snapshot.xml +++ b/tests/domainsnapshotxml2xmlout/disk_snapshot.xml @@ -72,6 +72,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/domainsnapshotxml2xmlout/external_vm.xml b/tests/domainsnapshotxml2xmlout/external_vm.xml index 8814bce..5a87ba6 100644 --- a/tests/domainsnapshotxml2xmlout/external_vm.xml +++ b/tests/domainsnapshotxml2xmlout/external_vm.xml @@ -37,6 +37,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/domainsnapshotxml2xmlout/full_domain.xml b/tests/domainsnapshotxml2xmlout/full_domain.xml index 65d1469..3a9e24d 100644 --- a/tests/domainsnapshotxml2xmlout/full_domain.xml +++ b/tests/domainsnapshotxml2xmlout/full_domain.xml @@ -30,6 +30,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/domainsnapshotxml2xmlout/metadata.xml b/tests/domainsnapshotxml2xmlout/metadata.xml index f961458..b385141 100644 --- a/tests/domainsnapshotxml2xmlout/metadata.xml +++ b/tests/domainsnapshotxml2xmlout/metadata.xml @@ -34,6 +34,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml b/tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml index 0f48917..5d61b72 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml @@ -37,6 +37,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-blkiotune-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-blkiotune-device.xml index f21e68a..743cf29 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-blkiotune-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-blkiotune-device.xml @@ -32,6 +32,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-blkiotune.xml b/tests/qemuxml2argvdata/qemuxml2argv-blkiotune.xml index a0445bb..87c6e50 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-blkiotune.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-blkiotune.xml @@ -24,6 +24,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml index 6cb941d..183a8c7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml @@ -22,6 +22,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml index 5c50e09..6afc8e3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml @@ -27,6 +27,7 @@ <controller type='usb' index='0'/> <controller type='fdc' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml index 38df8fe..62f562d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml @@ -23,6 +23,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml index 0cd2a1b..bfae80e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml index 0d29608..6147399 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml index 3ac8517..c54ee52 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml @@ -43,6 +43,7 @@ <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='fdc' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='00:11:22:33:44:55'/> <model type='virtio'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-channel-guestfwd.xml b/tests/qemuxml2argvdata/qemuxml2argv-channel-guestfwd.xml index 60e853c..2aea70a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-channel-guestfwd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-channel-guestfwd.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <channel type='pipe'> <source path='/tmp/guestfwd'/> <target type='guestfwd' address='10.0.2.1' port='4600'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.xml index a280842..0d15ed5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.xml @@ -24,6 +24,7 @@ <controller type='virtio-serial' index='1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </controller> + <controller type='pci' index='0' model='pci-root'/> <channel type='pty'> <target type='virtio' name='org.linux-kvm.port.foo'/> <address type='virtio-serial' controller='1' bus='0' port='3'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml b/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml index 96058f1..77978bb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml b/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml index c4d483a..6aed326 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml b/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml index e3821cd..1eca2a9 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='pty'> <target port='0'/> </serial> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many.xml b/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many.xml index 6028a2c..6d5a917 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many.xml @@ -22,6 +22,7 @@ <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='virtio-serial' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='pty'> <target port='0'/> </serial> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-controller-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-controller-order.xml index 6a98eaa..a31dbbd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-controller-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-controller-order.xml @@ -46,6 +46,7 @@ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> </controller> <controller type='ccid' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='52:54:00:4d:4b:19'/> <model type='virtio'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml index 5e5bc04..ed6a2eb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml @@ -23,6 +23,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml index ecc542e..dc43def 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml @@ -23,6 +23,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-kvmclock.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-kvmclock.xml index 16d71a3..89153a5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-kvmclock.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-kvmclock.xml @@ -19,6 +19,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.xml index 0bbe8e0..7d66eb0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.xml @@ -20,6 +20,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml index 593e650..813d201 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml index 1f43938..ce4ef93 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml index f885be1..6d6d096 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml index e8c9949..8d6ba70 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml @@ -27,6 +27,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml index 532dbc4..9d8f02d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml index 016afad..b71505a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml index 55e84fb..0b85fb1 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml index d56dab6..4bd8e24 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml index 82ba249..7fe9082 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml index 7c16352..f0e7df4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml index 9358e19..5e0896a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml index 69e9c24..0beda48 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml index 6915798..00730f7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml index 4c6b2b3..6ee75aa 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml index d7cf3d0..92fcd8a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml index ae85d04..83d5dd0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml index db0391a..ded9cd1 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fat.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fat.xml index ecdc2ed..9cfa44f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fat.xml @@ -23,6 +23,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml index 38cb230..85fe2a9 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml index e509b1b..7c1fdb1 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml @@ -29,6 +29,7 @@ <target dev='vdb' bus='virtio'/> </disk> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi-auth.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi-auth.xml index acaa503..ee87bdf 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi-auth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi-auth.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi.xml index 7db3426..a6b13ab 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi.xml @@ -29,6 +29,7 @@ <target dev='vdb' bus='virtio'/> </disk> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-export.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-export.xml index 7a84604..dd52c39 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-export.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-export.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6-export.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6-export.xml index c063db8..c3bfa34 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6-export.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6-export.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6.xml index 540aa02..8087f90 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.xml index a4126f5..0955fee 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd.xml index 36301a9..e74b95f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.xml index 8309cae..64a6ebb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.xml @@ -30,6 +30,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ipv6.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ipv6.xml index be4edbf..06e852d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ipv6.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ipv6.xml @@ -32,6 +32,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml index 081f9a6..bba512e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.xml @@ -31,6 +31,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-sheepdog.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-sheepdog.xml index ac89dd7..d20ca3e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-sheepdog.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-sheepdog.xml @@ -29,6 +29,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml index c0c6629..b229c79 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml @@ -32,6 +32,7 @@ <controller type='usb' index='0'/> <controller type='fdc' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml index ba044d1..52ac285 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml @@ -36,6 +36,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-mirror.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-mirror.xml index bec18f2..aa16a7e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-mirror.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-mirror.xml @@ -37,6 +37,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device.xml index 1285811..d3d8892 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device.xml @@ -27,6 +27,7 @@ <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='scsi' index='0' model='lsilogic'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-vpd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-vpd.xml index 96786e3..a0e1105 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-vpd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-vpd.xml @@ -33,6 +33,7 @@ <controller type='usb' index='0'/> <controller type='scsi' index='0' model='virtio-scsi'/> <controller type='scsi' index='1' model='lsilogic'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml index eecf609..7cf57ec 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml @@ -27,6 +27,7 @@ <controller type='scsi' index='0' model='virtio-scsi'/> <controller type='scsi' index='1' model='lsilogic'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-megasas.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-megasas.xml index 9a496ae..801207d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-megasas.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-megasas.xml @@ -27,6 +27,7 @@ <controller type='ide' index='0'/> <controller type='scsi' index='0' model='lsisas1078'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-virtio-scsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-virtio-scsi.xml index 1cb5cb2..2d8df2f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-virtio-scsi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-virtio-scsi.xml @@ -27,6 +27,7 @@ <controller type='ide' index='0'/> <controller type='scsi' index='0' model='virtio-scsi'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.xml index d9ca230..a175b2d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.xml @@ -27,6 +27,7 @@ <controller type='ide' index='0'/> <controller type='scsi' index='0' model='ibmvscsi'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml index acf9753..465a539 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-source-pool.xml @@ -32,6 +32,7 @@ <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='ide' index='1'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml index d401d7d..6cf06a0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml @@ -25,6 +25,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml index dfa9cf1..0b0b656 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='scsi' index='0' model='virtio-scsi' num_queues='8'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml index 29f406e..b3d8c59 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml @@ -35,6 +35,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml index 0795fe3..73e8ffa 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml @@ -35,6 +35,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-encrypted-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-encrypted-disk.xml index edea441..60fecb8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-encrypted-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-encrypted-disk.xml @@ -24,6 +24,7 @@ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml index 3173a41..10a8843 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml @@ -20,6 +20,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml index 22f0803..5d1e9dc 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml @@ -20,6 +20,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml index 22e388f..b3b7e89 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml @@ -34,6 +34,7 @@ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </controller> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='52:54:00:e5:48:58'/> <model type='virtio'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml index 0c8ae45..360a7fd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml @@ -24,6 +24,7 @@ <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='fdc' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-listen-network.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-listen-network.xml index d17bda8..b005440 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-listen-network.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-listen-network.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5903' autoport='no'> <listen type='network' network='Bobsnetwork'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml index d0e9d77..da17b88 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='sdl' display=':0.1' xauth='/root/.Xauthority' fullscreen='yes'/> <video> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml index f3cdf69..7172fb0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='sdl' display=':0.1' xauth='/root/.Xauthority'/> <video> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml index a8c4ad8..5da94c2 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml index 563d371..99d2996 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml index 9a36660..b22fbcc 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1' defaultMode='secure'> <listen type='address' address='127.0.0.1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml index 70a7ce3..fa0ea2c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5903' autoport='no' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml index 8ef7d05..bd026b3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' socket='/tmp/foo.socket'/> <video> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml index 70a7ce3..fa0ea2c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5903' autoport='no' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml index 663b547..6608054 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5903' autoport='no' listen='2001:1:2:3:4:5:1234:1234'> <listen type='address' address='2001:1:2:3:4:5:1234:1234'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml index 3c69f83..8f46aca 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml index 811e987..ad83474 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <hostdev mode='subsystem' type='usb' managed='no'> <source> <address bus='14' device='6'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml b/tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml index b5a9816..0822b57 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml @@ -24,6 +24,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml b/tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml index 9b7d8f2..0d5d0c7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml @@ -21,6 +21,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml b/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml index 6548c30..72aad83 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='usb'/> <memballoon model='virtio'/> </devices> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml b/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml index 345bdb3..2d84ccb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='tablet' bus='usb'/> <memballoon model='virtio'/> </devices> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml b/tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml index 8abcb51..a187aaa 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml @@ -20,6 +20,7 @@ <devices> <emulator>/usr/bin/kvm</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml index a9b311d..564f0b4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml @@ -27,6 +27,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <lease> <lockspace>somearea</lockspace> <key>thequickbrownfoxjumpedoverthelazydog</key> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml index 5ef3da0..8fef50f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml index b2cfe23..e504bbf 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml b/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml index 961e5af..1d29fa7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-minimal.xml b/tests/qemuxml2argvdata/qemuxml2argv-minimal.xml index 26fdf0d..4a938b3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-minimal.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-minimal.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml index 9c8e5dd..dbdc7dd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml @@ -24,6 +24,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml index b89327d..91eea1a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml @@ -24,6 +24,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml index fe0cf99..3c79918 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml @@ -25,6 +25,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml index fd65832..a2d7c59 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml @@ -24,6 +24,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml index 72d4bfb..b1939c7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml index 9c8e5dd..dbdc7dd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml @@ -24,6 +24,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml index 885e854..4b8646d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml @@ -41,6 +41,7 @@ <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </controller> + <controller type='pci' index='0' model='pci-root'/> <interface type='network'> <mac address='52:54:00:24:a5:9f'/> <source network='default'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml index b150371..f4f2265 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='ethernet'> <mac address='00:11:22:33:44:55'/> <script path='/etc/qemu-ifup'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml index eca5da5..1f27db3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='ethernet'> <mac address='00:11:22:33:44:55'/> <script path='/etc/qemu-ifup'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml index 9be0d2d..d65ef87 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='hostdev' managed='yes'> <mac address='00:11:22:33:44:55'/> <source> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-openvswitch.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-openvswitch.xml index 9c2c5dc..e90de23 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-openvswitch.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-openvswitch.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='network'> <mac address='00:11:22:33:44:55'/> <source network='ovs-net'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml index fe3a271..2b5613d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='00:11:22:33:44:55'/> <model type='rtl8139'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml index 9b37f2f..1782831 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='00:11:22:33:44:55'/> <model type='virtio'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-network-portgroup.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-network-portgroup.xml index 0fb9b2c..950a9db 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-network-portgroup.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio-network-portgroup.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='network'> <mac address='00:11:22:33:44:55'/> <source network='rednet' portgroup='bob'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml index ff7ea01..d38c367 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='00:11:22:33:44:55'/> <model type='virtio'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml b/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml index 961e5af..1d29fa7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numad-static-vcpu-no-numatune.xml b/tests/qemuxml2argvdata/qemuxml2argv-numad-static-vcpu-no-numatune.xml index 71c1497..6e9720f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-numad-static-vcpu-no-numatune.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-numad-static-vcpu-no-numatune.xml @@ -24,6 +24,7 @@ </disk> <controller type='ide' index='0'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml b/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml index 23f1064..52503fe 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <parallel type='tcp'> <source mode='bind' host='127.0.0.1' service='9999'/> <protocol type='raw'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml index 371835d..a5e59b2 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='52:54:00:24:a5:9f'/> <model type='virtio'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml b/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml index 826ea30..6c94798 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> <qemu:commandline> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-disabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-disabled.xml index 38a0f52..883a804 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-disabled.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-disabled.xml @@ -16,6 +16,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-enabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-enabled.xml index 3a9cd6f..a298b9d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-enabled.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-enabled.xml @@ -16,6 +16,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml b/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml index c4d483a..6aed326 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml b/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml index 961e5af..1d29fa7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.xml b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.xml index 98362a7..a80e781 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> <seclabel type='dynamic' model='selinux' relabel='yes'> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.xml b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.xml index 426b663..b790d07 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.xml @@ -33,6 +33,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> <seclabel type='dynamic' model='selinux' relabel='yes'> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-none.xml index 1a6878c..cbeae50 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-none.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> <seclabel type='none'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.xml b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.xml index 31d5f58..c1e4392 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> <seclabel type='static' model='selinux' relabel='no'> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml index 61e382c..80c5809 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='dev'> <source path='/dev/ttyS2'/> <target port='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml index c6780aa..d363df5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='file'> <source path='/tmp/serial.log'/> <target port='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml index 98bbb56..79e173f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='pty'> <target port='0'/> </serial> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml index 5d03125..d0ba5ef 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='pty'> <target port='0'/> </serial> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml index cbd5bdc..dd51486 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='tcp'> <source mode='bind' host='127.0.0.1' service='9999'/> <protocol type='telnet'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml index 082b99b..4f597b5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='tcp'> <source mode='connect' host='127.0.0.1' service='9999'/> <protocol type='raw'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml index 0ff161d..c21e13a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='udp'> <source mode='bind' host='127.0.0.1' service='9999'/> <source mode='connect' host='127.0.0.1' service='9998'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml index 425b442..dd326d0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='unix'> <source mode='connect' path='/tmp/serial.sock'/> <target port='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml index 7a72a9f..a80e917 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='vc'> <target port='0'/> </serial> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smp.xml b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml index 6a48c2e..d53cf44 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-smp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml @@ -24,6 +24,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml index c588a24..7bf9ff9 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <sound model='pcspk'/> <sound model='es1370'/> <sound model='sb16'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-sound.xml b/tests/qemuxml2argvdata/qemuxml2argv-sound.xml index ac78502..9f74394 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-sound.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-sound.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <sound model='pcspk'/> <sound model='es1370'/> <sound model='sb16'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-tpm-passthrough.xml b/tests/qemuxml2argvdata/qemuxml2argv-tpm-passthrough.xml index c7656b6..05b991f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-tpm-passthrough.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-tpm-passthrough.xml @@ -19,6 +19,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <tpm model='tpm-tis'> <backend type='passthrough'> <device path='/dev/tpm0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml index 1b8b7ed..1ea66f5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml @@ -29,6 +29,7 @@ <master startport='4'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/> </controller> + <controller type='pci' index='0' model='pci-root'/> <redirdev bus='usb' type='tcp'> <source mode='connect' host='localhost' service='4000'/> <protocol type='raw'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml index c4f0079..077ca92 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml @@ -33,6 +33,7 @@ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </controller> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='user'> <mac address='52:54:00:e5:48:58'/> <model type='virtio'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-egd.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-egd.xml index 4e52a32..c44dc7d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-egd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-egd.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> <rng model='virtio'> <backend model='egd' type='tcp'> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-random.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-random.xml index 354ae42..fc2be1e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-random.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-random.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> <rng model='virtio'> <rate bytes='123' period='1234'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml b/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml index 4de94ec..29ea489 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <watchdog model='ib700' action='poweroff'/> <memballoon model='virtio'/> </devices> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-balloon-device-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-balloon-device-auto.xml index c4d483a..380b70f 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-balloon-device-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-balloon-device-auto.xml @@ -20,6 +20,7 @@ <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <controller type='ide' index='0'/> <memballoon model='virtio'/> </devices> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml index c257292..fd6b852 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml @@ -25,6 +25,7 @@ <controller type='virtio-serial' index='1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </controller> + <controller type='pci' index='0' model='pci-root'/> <controller type='virtio-serial' index='2'/> <channel type='pty'> <target type='virtio' name='org.linux-kvm.port.0'/> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml index e3821cd..1eca2a9 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-compat-auto.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='pty'> <target port='0'/> </serial> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio.xml index 031f821..340430e 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <controller type='virtio-serial' index='0'/> <console type='pty'> <target type='virtio' port='0'/> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror.xml index 29f406e..b3d8c59 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-mirror.xml @@ -35,6 +35,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-scsi-device-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-scsi-device-auto.xml index 26e5547..5ec1e94 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-scsi-device-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-scsi-device-auto.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <controller type='scsi' index='0'/> <memballoon model='virtio'/> </devices> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-listen-network2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-listen-network2.xml index fae1e6f..3f7c383 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-listen-network2.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-listen-network2.xml @@ -21,6 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' autoport='yes' listen='1.2.3.4'> <listen type='address' address='1.2.3.4'/> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml index 54b68fa..f793f62 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml @@ -59,6 +59,7 @@ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </controller> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <interface type='ethernet'> <mac address='52:54:00:71:70:89'/> <script path='/etc/qemu-ifup'/> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-memtune.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-memtune.xml index 34ec18f..92dcacf 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-memtune.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-memtune.xml @@ -26,6 +26,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml index c3a55cf..e32fb67 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml @@ -25,6 +25,7 @@ </disk> <controller type='ide' index='0'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-cpuset.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-cpuset.xml index ffca2a9..a5fef3d 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-cpuset.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-cpuset.xml @@ -27,6 +27,7 @@ </disk> <controller type='ide' index='0'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-no-cpuset-and-placement.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-no-cpuset-and-placement.xml index 28ec59f..97aa619 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-no-cpuset-and-placement.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-memory-vcpu-no-cpuset-and-placement.xml @@ -27,6 +27,7 @@ </disk> <controller type='ide' index='0'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml index 26de1b2..8fa7a05 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml @@ -27,6 +27,7 @@ </disk> <controller type='ide' index='0'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml index 430d131..2254851 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-serial-target-port-auto.xml @@ -21,6 +21,7 @@ </disk> <controller type='ide' index='0'/> <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <serial type='pty'> <target port='0'/> </serial> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-usb-ich9-ehci-addr.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-usb-ich9-ehci-addr.xml index e7592e9..8119564 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-usb-ich9-ehci-addr.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-usb-ich9-ehci-addr.xml @@ -44,6 +44,7 @@ <controller type='usb' index='2' model='ich9-uhci2'> <master startport='2'/> </controller> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> -- 1.8.1.5

On 04/17/2013 03:00 PM, Ján Tomko wrote:
<controller type='pci' index='0' model='pci-root'/> is auto-added to pc* machine types. Without this controller PCI bus 0 is not available and no PCI addresses are assigned by default.
Since older libvirt supported PCI bus 0 even without this controller, it is removed from the XML when migrating. --- src/conf/domain_conf.c | 8 ++++- src/qemu/qemu_command.c | 18 ++++++++--- src/qemu/qemu_domain.c | 37 ++++++++++++++++++++++ tests/domainsnapshotxml2xmlout/disk_snapshot.xml | 1 + tests/domainsnapshotxml2xmlout/external_vm.xml | 1 + tests/domainsnapshotxml2xmlout/full_domain.xml | 1 + tests/domainsnapshotxml2xmlout/metadata.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml | 1 + .../qemuxml2argv-blkiotune-device.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-blkiotune.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 1 + .../qemuxml2argv-boot-menu-disable.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-boot-network.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 1 + .../qemuxml2argv-channel-guestfwd.xml | 1 + .../qemuxml2argv-channel-virtio.xml | 1 + .../qemuxml2argv-clock-localtime.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml | 1 + .../qemuxml2argv-console-compat.xml | 1 + .../qemuxml2argv-console-virtio-many.xml | 1 + .../qemuxml2argv-controller-order.xml | 1 + .../qemuxml2argv-cpu-eoi-disabled.xml | 1 + .../qemuxml2argv-cpu-eoi-enabled.xml | 1 + .../qemuxml2argv-cpu-host-kvmclock.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-cputune.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 1 + .../qemuxml2argv-disk-cdrom-empty.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 1 + .../qemuxml2argv-disk-drive-boot-cdrom.xml | 1 + .../qemuxml2argv-disk-drive-boot-disk.xml | 1 + .../qemuxml2argv-disk-drive-cache-directsync.xml | 1 + .../qemuxml2argv-disk-drive-cache-unsafe.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-none.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 1 + .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-none.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 1 + .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 1 + ...muxml2argv-disk-drive-error-policy-enospace.xml | 1 + .../qemuxml2argv-disk-drive-error-policy-stop.xml | 1 + ...rgv-disk-drive-error-policy-wreport-rignore.xml | 1 + .../qemuxml2argv-disk-drive-fat.xml | 1 + .../qemuxml2argv-disk-drive-fmt-qcow.xml | 1 + .../qemuxml2argv-disk-drive-network-gluster.xml | 1 + .../qemuxml2argv-disk-drive-network-iscsi-auth.xml | 1 + .../qemuxml2argv-disk-drive-network-iscsi.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-export.xml | 1 + ...xml2argv-disk-drive-network-nbd-ipv6-export.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-ipv6.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd-unix.xml | 1 + .../qemuxml2argv-disk-drive-network-nbd.xml | 1 + ...emuxml2argv-disk-drive-network-rbd-ceph-env.xml | 1 + .../qemuxml2argv-disk-drive-network-rbd-ipv6.xml | 1 + .../qemuxml2argv-disk-drive-network-rbd.xml | 1 + .../qemuxml2argv-disk-drive-network-sheepdog.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-mirror.xml | 1 + .../qemuxml2argv-disk-scsi-device.xml | 1 + .../qemuxml2argv-disk-scsi-disk-vpd.xml | 1 + ...qemuxml2argv-disk-scsi-lun-passthrough-sgio.xml | 1 + .../qemuxml2argv-disk-scsi-megasas.xml | 1 + .../qemuxml2argv-disk-scsi-virtio-scsi.xml | 1 + .../qemuxml2argv-disk-scsi-vscsi.xml | 1 + .../qemuxml2argv-disk-source-pool.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml | 1 + .../qemuxml2argv-disk-virtio-scsi-num_queues.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 1 + .../qemuxml2argv-encrypted-disk.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 1 + .../qemuxml2argv-floppy-drive-fat.xml | 1 + .../qemuxml2argv-graphics-listen-network.xml | 1 + .../qemuxml2argv-graphics-sdl-fullscreen.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml | 1 + .../qemuxml2argv-graphics-spice-compression.xml | 1 + .../qemuxml2argv-graphics-spice-qxl-vga.xml | 1 + .../qemuxml2argv-graphics-spice.xml | 1 + .../qemuxml2argv-graphics-vnc-sasl.xml | 1 + .../qemuxml2argv-graphics-vnc-socket.xml | 1 + .../qemuxml2argv-graphics-vnc-tls.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml | 1 + .../qemuxml2argv-hostdev-pci-address.xml | 1 + .../qemuxml2argv-hostdev-usb-address.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml | 1 + .../qemuxml2argv-input-usbmouse.xml | 1 + .../qemuxml2argv-input-usbtablet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 1 + .../qemuxml2argv-machine-core-off.xml | 1 + .../qemuxml2argv-machine-core-on.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-migrate.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-minimal.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml | 1 + .../qemuxml2argv-misc-disable-s3.xml | 1 + .../qemuxml2argv-misc-disable-suspends.xml | 1 + .../qemuxml2argv-misc-enable-s4.xml | 1 + .../qemuxml2argv-misc-no-reboot.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml | 1 + .../qemuxml2argv-net-bandwidth.xml | 1 + .../qemuxml2argv-net-eth-ifname.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml | 1 + .../qemuxml2argv-net-openvswitch.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-user.xml | 1 + .../qemuxml2argv-net-virtio-device.xml | 1 + .../qemuxml2argv-net-virtio-network-portgroup.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml | 1 + .../qemuxml2argv-nographics-vga.xml | 1 + .../qemuxml2argv-numad-static-vcpu-no-numatune.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml | 1 + .../qemuxml2argv-qemu-ns-no-env.xml | 1 + .../qemuxml2argv-reboot-timeout-disabled.xml | 1 + .../qemuxml2argv-reboot-timeout-enabled.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml | 1 + .../qemuxml2argv-seclabel-dynamic-baselabel.xml | 1 + .../qemuxml2argv-seclabel-dynamic-override.xml | 1 + .../qemuxml2argv-seclabel-none.xml | 1 + .../qemuxml2argv-seclabel-static.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-file.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-many.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml | 1 + .../qemuxml2argv-serial-tcp-telnet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-serial-unix.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-sound-device.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-sound.xml | 1 + .../qemuxml2argv-tpm-passthrough.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml | 1 + .../qemuxml2argv-virtio-rng-egd.xml | 1 + .../qemuxml2argv-virtio-rng-random.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml | 1 + .../qemuxml2xmlout-balloon-device-auto.xml | 1 + .../qemuxml2xmlout-channel-virtio-auto.xml | 1 + .../qemuxml2xmlout-console-compat-auto.xml | 1 + .../qemuxml2xmlout-console-virtio.xml | 1 + .../qemuxml2xmlout-disk-mirror.xml | 1 + .../qemuxml2xmlout-disk-scsi-device-auto.xml | 1 + .../qemuxml2xmlout-graphics-listen-network2.xml | 1 + .../qemuxml2xmlout-graphics-spice-timeout.xml | 1 + .../qemuxml2xmloutdata/qemuxml2xmlout-memtune.xml | 1 + .../qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml | 1 + ...emuxml2xmlout-numad-auto-memory-vcpu-cpuset.xml | 1 + ...ad-auto-memory-vcpu-no-cpuset-and-placement.xml | 1 + .../qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml | 1 + .../qemuxml2xmlout-serial-target-port-auto.xml | 1 + .../qemuxml2xmlout-usb-ich9-ehci-addr.xml | 1 + 160 files changed, 215 insertions(+), 5 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 68518a7..a2179aa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10849,9 +10849,15 @@ virDomainDefParseXML(xmlDocPtr xml,
if (def->virtType == VIR_DOMAIN_VIRT_QEMU || def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) + def->virtType == VIR_DOMAIN_VIRT_KVM) { if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0, -1) < 0) goto error; + if (STRPREFIX(def->os.machine,"pc")) {
You also need to do this for all rhel-* machine types. Even though that machine type only shows up in RHEL-specific versions of qemu, it is possible for someone with a stock RHEL qemu to install upstream libvirt, and we don't want to break that. (side note - we need to make another patch that moves *all* of these implicit controller additions to a hypervisor-specific post-parse callback and only for certain machinetypes; of course this could break non-qemu hypervisors if you move the MaybeAddController() calls out of here and into a qemu-only callback, so I guess we should add a callback for all of them, then let the maintainers remove that which is inappropriate).
+ if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } + }
/* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index df0077a..21da6b6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1209,6 +1209,10 @@ struct _qemuDomainPCIAddressSet { static bool qemuPCIAddressValidate(qemuDomainPCIAddressSetPtr addrs ATTRIBUTE_UNUSED, virDevicePCIAddressPtr addr) { + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return false; + } if (addr->domain != 0) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Only PCI domain 0 is available")); @@ -1363,15 +1367,15 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - int nbuses = 1; + int nbuses = 0; int i; int rv;
for (i = 0; i < def->ncontrollers; i++) { - if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && - def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE) + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) nbuses++; } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) { virDomainDeviceInfo info; /* 1st pass to figure out how many PCI bridges we need */ @@ -1398,7 +1402,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def, addrs->nbuses, false))) goto cleanup;
- if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + if (nbuses && qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) goto cleanup;
Is it okay to simply not call qemuAssignDevicePCISlots() if there are no PCI buses? Does this properly return success if there are no PCI devices and no PCI buses? Does it properly return a failure when there is at least one PCI device in the config but no PCI buses?
}
@@ -10146,6 +10150,12 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (virDomainDefAddImplicitControllers(def) < 0) goto error;
+ if (STRPREFIX(def->os.machine,"pc")) { + if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } +
Didn't you already do this in virDomainDefParseXML?
if (cmd->num_args || cmd->num_env) { def->ns = *virDomainXMLOptionGetNamespace(xmlopt); def->namespaceData = cmd; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a7aabdf..9d6db05 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1255,6 +1255,7 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
if ((flags & VIR_DOMAIN_XML_MIGRATABLE)) { int i; + int idx = -1; virDomainControllerDefPtr usb = NULL;
/* If only the default USB controller is present, we can remove it @@ -1288,6 +1289,42 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, def->controllers[def->ncontrollers++] = controllers[i]; } } + + /* Remove the default PCI controller if there is only one present + * and its model is pci-root */ + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (idx >= 0) { + idx = -1; + break; + } + idx = i; + } + } + if (idx >= 0 && def->controllers[idx]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) { + VIR_DEBUG("Removing default 'pci-root' from domain '%s'" + " for migration compatibility", def->name); + if (usb) { + if (VIR_DELETE_ELEMENT(def->controllers, idx, def->ncontrollers) < 0) { + virReportOOMError(); + goto cleanup; + } + } else { + controllers = def->controllers; + ncontrollers = def->ncontrollers; + if (VIR_ALLOC_N(def->controllers, ncontrollers - 1) < 0) { + controllers = NULL; + virReportOOMError(); + goto cleanup; + } + + def->ncontrollers = 0; + for (i = 0; i < ncontrollers; i++) { + if (i != idx) + def->controllers[def->ncontrollers++] = controllers[i]; + } + } + } }
This code seems a bit.... "icky". How about if you change the whole thing to do something like this (or some other method of eliminating the duplicated VIR_ALLOC_N() code and ensuing loop): virDomainControllerDefPtr usb = NULL; virDomainControllerDefPtr pci = NULL; int removeCt = 0; for (ii = 0; ii < def->ncontrollers; ii++) { if (def->controllers[ii]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { if (usb) { usb = NULL; break; } usb = def->controllers[ii]; } } if (usb && usb->idx == 0 && usb->model == -1) { VIR_DEBUG("Removing default USB controller from domain '%s'" " for migration compatibility", def->name); removeCt++; } else { usb = NULL; } for (ii = 0; ii < def->ncontrollers; ii++) { if (def->controllers[ii]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { if (pci) { pci = NULL; break; } pci = def->controllers[ii]; } } if (pci && && pci->idx == 0 && pci->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) { VIR_DEBUG("Removing default 'pci-root' from domain '%s'" " for migration compatibility", def->name); removeCt++; } else { pci = NULL; } if (removeCt) { controllers = def->controllers; ncontrollers = def->ncontrollers; if (VIR_ALLOC_N(def->controllers, ncontrollers - removeCt) < 0) { controllers = NULL; virReportOOMError(); goto cleanup; } def->ncontrollers = 0; for (ii = 0; ii < ncontrollers; ii++) { if (controllers[i] != usb && controllers[ii] != pci) def->controllers[def->ncontrollers++] = controllers[ii]; } }
ret = virDomainDefFormatInternal(def, flags, buf); diff --git a/tests/domainsnapshotxml2xmlout/disk_snapshot.xml b/tests/domainsnapshotxml2xmlout/disk_snapshot.xml index 57aef16..5f42bf5 100644 --- a/tests/domainsnapshotxml2xmlout/disk_snapshot.xml +++ b/tests/domainsnapshotxml2xmlout/disk_snapshot.xml @@ -72,6 +72,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/>
yada yada yada :-) This needs a bit of touchup, but it's close! (BTW, how difficult would it be to put this patch *before* 10/11? I think logically that's where it should go, but the result will be the same anyway, so it's not a big deal)

On 04/18/2013 07:22 AM, Laine Stump wrote:
On 04/17/2013 03:00 PM, Ján Tomko wrote:
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 68518a7..a2179aa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10849,9 +10849,15 @@ virDomainDefParseXML(xmlDocPtr xml,
if (def->virtType == VIR_DOMAIN_VIRT_QEMU || def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) + def->virtType == VIR_DOMAIN_VIRT_KVM) { if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0, -1) < 0) goto error; + if (STRPREFIX(def->os.machine,"pc")) {
You also need to do this for all rhel-* machine types. Even though that machine type only shows up in RHEL-specific versions of qemu, it is possible for someone with a stock RHEL qemu to install upstream libvirt, and we don't want to break that.
It seems these are not the only machines with a PCI bus (PPC for example has one), which makes me wonder how many things this will break.
(side note - we need to make another patch that moves *all* of these implicit controller additions to a hypervisor-specific post-parse callback and only for certain machinetypes; of course this could break non-qemu hypervisors if you move the MaybeAddController() calls out of here and into a qemu-only callback, so I guess we should add a callback for all of them, then let the maintainers remove that which is inappropriate).
+ if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } + }
/* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index df0077a..21da6b6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1398,7 +1402,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def, addrs->nbuses, false))) goto cleanup;
- if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + if (nbuses && qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) goto cleanup;
Is it okay to simply not call qemuAssignDevicePCISlots() if there are no PCI buses? Does this properly return success if there are no PCI devices and no PCI buses? Does it properly return a failure when there is at least one PCI device in the config but no PCI buses?
Now I see there are (at least) two errors in 10/11: I reserve a slot for a future bridge addition even if there is no PCI bus and I added a last-minute change that accesses addrs right after setting it to NULL. I thought PCI devices would be caught by qemuCollectPCIAddress but that would only catch those with explicitly specified addresses. I think if we change AssignDevicePCISlots not to reserve slot 1 unconditionally, it would be good to call it even if we have no PCI bus: this would expose PCI devices on a machine with no PCI bus and it would expose machine types that do have an implicit PCI bus but we don't add the controller for them.
}
@@ -10146,6 +10150,12 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (virDomainDefAddImplicitControllers(def) < 0) goto error;
+ if (STRPREFIX(def->os.machine,"pc")) { + if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } +
Didn't you already do this in virDomainDefParseXML?
I did. This is for getting the domain definition from a qemu command line, as opposed to the XML. Jan

On 04/18/2013 08:09 AM, Ján Tomko wrote:
On 04/18/2013 07:22 AM, Laine Stump wrote:
On 04/17/2013 03:00 PM, Ján Tomko wrote:
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 68518a7..a2179aa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10849,9 +10849,15 @@ virDomainDefParseXML(xmlDocPtr xml,
if (def->virtType == VIR_DOMAIN_VIRT_QEMU || def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) + def->virtType == VIR_DOMAIN_VIRT_KVM) { if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0, -1) < 0) goto error; + if (STRPREFIX(def->os.machine,"pc")) {
You also need to do this for all rhel-* machine types. Even though that machine type only shows up in RHEL-specific versions of qemu, it is possible for someone with a stock RHEL qemu to install upstream libvirt, and we don't want to break that. It seems these are not the only machines with a PCI bus (PPC for example has one), which makes me wonder how many things this will break.
Well, we're going to need to figure those out. We can either do it for all, and let people interested in particular machinetypes explicitly exclude theirs, or we can do it only for those machinetypes that we know have a PCI bus, and wait for the others to complain; I guess it all depends on if we want to minimize pain, or minimize the amount of time that passes before we get it right. I'm not sure if the presence of "PCI" in the output of qemu-system-* -help is an accurate indicator of which platforms have a PCI bus, but I tried running that on all the qemu emulators on my Fedora 18 system and got the following list of qemu binaries that have devices claiming to live on a PCI bus: for e in qemu-system-*; do if $e -device \? 2>&1| grep -q PCI; then echo "YES - $e"; else echo "NO - $e"; fi; done YES - qemu-system-alpha YES - qemu-system-arm NO - qemu-system-cris YES - qemu-system-i386 NO - qemu-system-lm32 YES - qemu-system-m68k NO - qemu-system-microblaze NO - qemu-system-microblazeel YES - qemu-system-mips YES - qemu-system-mips64 YES - qemu-system-mips64el YES - qemu-system-mipsel NO - qemu-system-or32 YES - qemu-system-ppc YES - qemu-system-ppc64 YES - qemu-system-ppcemb NO - qemu-system-s390x YES - qemu-system-sh4 YES - qemu-system-sh4eb NO - qemu-system-sparc YES - qemu-system-sparc64 NO - qemu-system-unicore32 YES - qemu-system-x86_64 NO - qemu-system-xtensa NO - qemu-system-xtensaeb So within any binary that supports PCI devices, does that necessarily mean it's supported for *all* machinetypes? If so, we've got a pretty long list of machinetypes to check for: ( for e in qemu-system-*; do if $e -device \? 2>&1| grep -q PCI; then $e -M ? | cut -f1 -d' ' | grep -v Supported | grep -v none; fi; done ) | sort | uniq | wc 72 72 590 (note that it's bad enough we have to eliminate the opacity of machinetype; we *certainly* don't want to start trying to make decisions based on the emulator binary name!) And of course, just because a machinetype can support pci devices, doesn't necessarily mean that it has a builtin pci-root bus :-O
(side note - we need to make another patch that moves *all* of these implicit controller additions to a hypervisor-specific post-parse callback and only for certain machinetypes; of course this could break non-qemu hypervisors if you move the MaybeAddController() calls out of here and into a qemu-only callback, so I guess we should add a callback for all of them, then let the maintainers remove that which is inappropriate).
+ if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } + }
/* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index df0077a..21da6b6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1398,7 +1402,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def, addrs->nbuses, false))) goto cleanup;
- if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + if (nbuses && qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) goto cleanup;
Is it okay to simply not call qemuAssignDevicePCISlots() if there are no PCI buses? Does this properly return success if there are no PCI devices and no PCI buses? Does it properly return a failure when there is at least one PCI device in the config but no PCI buses?
Now I see there are (at least) two errors in 10/11: I reserve a slot for a future bridge addition even if there is no PCI bus and I added a last-minute change that accesses addrs right after setting it to NULL.
I thought PCI devices would be caught by qemuCollectPCIAddress but that would only catch those with explicitly specified addresses.
I think if we change AssignDevicePCISlots not to reserve slot 1 unconditionally, it would be good to call it even if we have no PCI bus: this would expose PCI devices on a machine with no PCI bus and it would expose machine types that do have an implicit PCI bus but we don't add the controller for them.
If I understand you correctly, you're suggesting that we always do the auto-scan for PCI devices, even if there are no buses, because it would then generate an error for any PCI device it encountered. That sounds reasonable to me.
}
@@ -10146,6 +10150,12 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (virDomainDefAddImplicitControllers(def) < 0) goto error;
+ if (STRPREFIX(def->os.machine,"pc")) { + if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } +
Didn't you already do this in virDomainDefParseXML?
I did. This is for getting the domain definition from a qemu command line, as opposed to the XML.
Right, right. Nothing to see here; move along :-)

On 04/18/2013 04:38 PM, Laine Stump wrote:
On 04/18/2013 08:09 AM, Ján Tomko wrote:
On 04/18/2013 07:22 AM, Laine Stump wrote:
On 04/17/2013 03:00 PM, Ján Tomko wrote:
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 68518a7..a2179aa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10849,9 +10849,15 @@ virDomainDefParseXML(xmlDocPtr xml,
if (def->virtType == VIR_DOMAIN_VIRT_QEMU || def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) + def->virtType == VIR_DOMAIN_VIRT_KVM) { if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0, -1) < 0) goto error; + if (STRPREFIX(def->os.machine,"pc")) {
You also need to do this for all rhel-* machine types. Even though that machine type only shows up in RHEL-specific versions of qemu, it is possible for someone with a stock RHEL qemu to install upstream libvirt, and we don't want to break that. It seems these are not the only machines with a PCI bus (PPC for example has one), which makes me wonder how many things this will break.
Well, we're going to need to figure those out. We can either do it for all, and let people interested in particular machinetypes explicitly exclude theirs, or we can do it only for those machinetypes that we know have a PCI bus, and wait for the others to complain; I guess it all depends on if we want to minimize pain, or minimize the amount of time that passes before we get it right.
I'm not sure if the presence of "PCI" in the output of qemu-system-* -help is an accurate indicator of which platforms have a PCI bus, but I tried running that on all the qemu emulators on my Fedora 18 system and got the following list of qemu binaries that have devices claiming to live on a PCI bus:
for e in qemu-system-*; do if $e -device \? 2>&1| grep -q PCI; then echo "YES - $e"; else echo "NO - $e"; fi; done YES - qemu-system-alpha YES - qemu-system-arm NO - qemu-system-cris YES - qemu-system-i386 NO - qemu-system-lm32 YES - qemu-system-m68k NO - qemu-system-microblaze NO - qemu-system-microblazeel YES - qemu-system-mips YES - qemu-system-mips64 YES - qemu-system-mips64el YES - qemu-system-mipsel NO - qemu-system-or32 YES - qemu-system-ppc YES - qemu-system-ppc64 YES - qemu-system-ppcemb NO - qemu-system-s390x YES - qemu-system-sh4 YES - qemu-system-sh4eb NO - qemu-system-sparc YES - qemu-system-sparc64 NO - qemu-system-unicore32 YES - qemu-system-x86_64 NO - qemu-system-xtensa NO - qemu-system-xtensaeb
So within any binary that supports PCI devices, does that necessarily mean it's supported for *all* machinetypes? If so, we've got a pretty long list of machinetypes to check for:
( for e in qemu-system-*; do if $e -device \? 2>&1| grep -q PCI; then $e -M ? | cut -f1 -d' ' | grep -v Supported | grep -v none; fi; done ) | sort | uniq | wc 72 72 590
(note that it's bad enough we have to eliminate the opacity of machinetype; we *certainly* don't want to start trying to make decisions based on the emulator binary name!)
And of course, just because a machinetype can support pci devices, doesn't necessarily mean that it has a builtin pci-root bus :-O
It seems the way to figure it out is to run: $qemu -M $machine -nodefaults -nodefconfig -monitor stdio <<< "info qtree" | grep "bus:"

On 04/18/2013 04:38 PM, Laine Stump wrote:
On 04/18/2013 08:09 AM, Ján Tomko wrote:
On 04/18/2013 07:22 AM, Laine Stump wrote:
On 04/17/2013 03:00 PM, Ján Tomko wrote:
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 68518a7..a2179aa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10849,9 +10849,15 @@ virDomainDefParseXML(xmlDocPtr xml,
if (def->virtType == VIR_DOMAIN_VIRT_QEMU || def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) + def->virtType == VIR_DOMAIN_VIRT_KVM) { if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0, -1) < 0) goto error; + if (STRPREFIX(def->os.machine,"pc")) {
You also need to do this for all rhel-* machine types. Even though that machine type only shows up in RHEL-specific versions of qemu, it is possible for someone with a stock RHEL qemu to install upstream libvirt, and we don't want to break that. It seems these are not the only machines with a PCI bus (PPC for example has one), which makes me wonder how many things this will break.
Well, we're going to need to figure those out. We can either do it for all, and let people interested in particular machinetypes explicitly exclude theirs, or we can do it only for those machinetypes that we know have a PCI bus, and wait for the others to complain; I guess it all depends on if we want to minimize pain, or minimize the amount of time that passes before we get it right.
I'm not sure if the presence of "PCI" in the output of qemu-system-* -help is an accurate indicator of which platforms have a PCI bus, but I tried running that on all the qemu emulators on my Fedora 18 system and got the following list of qemu binaries that have devices claiming to live on a PCI bus:
for e in qemu-system-*; do if $e -device \? 2>&1| grep -q PCI; then echo "YES - $e"; else echo "NO - $e"; fi; done YES - qemu-system-alpha YES - qemu-system-arm NO - qemu-system-cris YES - qemu-system-i386 NO - qemu-system-lm32 YES - qemu-system-m68k NO - qemu-system-microblaze NO - qemu-system-microblazeel YES - qemu-system-mips YES - qemu-system-mips64 YES - qemu-system-mips64el YES - qemu-system-mipsel NO - qemu-system-or32 YES - qemu-system-ppc YES - qemu-system-ppc64 YES - qemu-system-ppcemb NO - qemu-system-s390x YES - qemu-system-sh4 YES - qemu-system-sh4eb NO - qemu-system-sparc YES - qemu-system-sparc64 NO - qemu-system-unicore32 YES - qemu-system-x86_64 NO - qemu-system-xtensa NO - qemu-system-xtensaeb
So within any binary that supports PCI devices, does that necessarily mean it's supported for *all* machinetypes? If so, we've got a pretty long list of machinetypes to check for:
( for e in qemu-system-*; do if $e -device \? 2>&1| grep -q PCI; then $e -M ? | cut -f1 -d' ' | grep -v Supported | grep -v none; fi; done ) | sort | uniq | wc 72 72 590
(note that it's bad enough we have to eliminate the opacity of machinetype; we *certainly* don't want to start trying to make decisions based on the emulator binary name!)
And of course, just because a machinetype can support pci devices, doesn't necessarily mean that it has a builtin pci-root bus :-O
It seems the way to figure it out is to run: $qemu -M $machine -nodefaults -nodefconfig -monitor stdio <<< "info qtree" | grep "bus:"

On 04/18/2013 08:09 AM, Ján Tomko wrote:
On 04/18/2013 07:22 AM, Laine Stump wrote:
On 04/17/2013 03:00 PM, Ján Tomko wrote:
}
@@ -10146,6 +10150,12 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (virDomainDefAddImplicitControllers(def) < 0) goto error;
+ if (STRPREFIX(def->os.machine,"pc")) { + if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + goto error; + } +
Didn't you already do this in virDomainDefParseXML?
I did. This is for getting the domain definition from a qemu command line, as opposed to the XML.
Just occurred to me - this points out that we should do the same for the other implicit controllers (maybe once all of the implicit controller adds are moved to qemuDomainDefPostParse, we can make virDomainDefPostParse a public function, and call it directly from the end of qemuParseCommandline().)

On 04/17/2013 09:00 PM, Ján Tomko wrote:
Add new 'pci' controller type with two models: pci-root - auto-added to a pc* machine, providing pci bus 0 pci-bridge - auto-added if the devices would not leave at least one slot empty on bus 0 or bus >0 is specified
Ján Tomko (10):
I've pushed patches 1-7 (with the minor nits fixed):
qemu: make qemuComparePCIDevice aware of multiple buses qemu: print PCI address hexadecimally in errors qemu: QEMU_PCI constant consistency qemu: move PCI address check out of qemuPCIAddressAsString qemu: switch PCI address set from hash table to an array qemu: rename CheckSlot to SlotInUse conf: add model attribute to virDomainDefMaybeAddController
Another version of these is in the making:
conf: add PCI controllers qemu: auto-add bridges and allow using them qemu: auto-add pci-root controller for pc machine types
liguang (1): qemu: build command line for pci-bridge device
Thank you for your reviews! Jan
participants (3)
-
Eric Blake
-
Ján Tomko
-
Laine Stump