[libvirt] [PATCH v3 0/5] qemu: add PCI bridge support

Add new 'pci' controller type with two models: pci-root - auto-added to machines with implicit pci bus pci-bridge - auto-added if the devices would not leave at least one slot empty on bus 0 or bus >0 is specified v3: moved the implicit PCI root addition to qemu's post parse callback, added an xml -> xml test and schema validation rewrote implicit controller removal and search for free slots check for multiple pci controllers with the same index added documentation Ján Tomko (4): qemu: call post-parse callbacks when parsing command line too conf: add PCI controllers qemu: auto-add pci-root controller for pc machine types qemu: auto-add bridges and allow using them liguang (1): qemu: build command line for pci-bridge device docs/formatdomain.html.in | 22 +- docs/schemas/domaincommon.rng | 12 + src/conf/domain_conf.c | 51 +++- src/conf/domain_conf.h | 20 ++ src/libvirt_private.syms | 2 + src/qemu/qemu_capabilities.c | 3 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 296 +++++++++++++++++---- src/qemu/qemu_command.h | 5 +- src/qemu/qemu_domain.c | 67 ++++- 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 | 2 + .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 3 + .../qemuxml2argv-boot-menu-disable.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-boot-network.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 1 + .../qemuxml2argv-channel-guestfwd.xml | 1 + .../qemuxml2argv-channel-virtio.xml | 1 + .../qemuxml2argv-clock-localtime.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml | 2 + .../qemuxml2argv-console-compat.xml | 2 + .../qemuxml2argv-console-virtio-many.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 | 3 + tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 3 + .../qemuxml2argv-disk-drive-boot-cdrom.xml | 3 + .../qemuxml2argv-disk-drive-boot-disk.xml | 3 + .../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 | 2 + .../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 | 4 + tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml | 5 + .../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 | 3 + .../qemuxml2argv-disk-virtio-scsi-num_queues.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 5 + .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 5 + .../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 | 2 + .../qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml | 2 + .../qemuxml2argv-graphics-spice-compression.xml | 1 + .../qemuxml2argv-graphics-spice-qxl-vga.xml | 1 + .../qemuxml2argv-graphics-spice.xml | 1 + .../qemuxml2argv-graphics-vnc-sasl.xml | 2 + .../qemuxml2argv-graphics-vnc-socket.xml | 2 + .../qemuxml2argv-graphics-vnc-tls.xml | 2 + .../qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml | 2 + .../qemuxml2argv-hostdev-pci-address.xml | 2 + .../qemuxml2argv-hostdev-usb-address.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-hugepages.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hyperv.xml | 1 + .../qemuxml2argv-input-usbmouse.xml | 2 + .../qemuxml2argv-input-usbtablet.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-kvmclock.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 1 + .../qemuxml2argv-machine-core-off.xml | 2 + .../qemuxml2argv-machine-core-on.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-migrate.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-minimal.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml | 2 + .../qemuxml2argv-misc-disable-s3.xml | 2 + .../qemuxml2argv-misc-disable-suspends.xml | 2 + .../qemuxml2argv-misc-enable-s4.xml | 2 + .../qemuxml2argv-misc-no-reboot.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml | 2 + .../qemuxml2argv-net-bandwidth.xml | 1 + .../qemuxml2argv-net-eth-ifname.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml | 2 + .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml | 1 + .../qemuxml2argv-net-openvswitch.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-user.xml | 2 + .../qemuxml2argv-net-virtio-device.xml | 1 + .../qemuxml2argv-net-virtio-network-portgroup.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml | 2 + .../qemuxml2argv-nographics-vga.xml | 2 + .../qemuxml2argv-numad-static-vcpu-no-numatune.xml | 1 + .../qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml | 210 +++++++++++++++ tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml | 1 + .../qemuxml2argv-qemu-ns-no-env.xml | 2 + .../qemuxml2argv-reboot-timeout-disabled.xml | 1 + .../qemuxml2argv-reboot-timeout-enabled.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml | 2 + .../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 | 2 + .../qemuxml2argvdata/qemuxml2argv-serial-file.xml | 2 + .../qemuxml2argvdata/qemuxml2argv-serial-many.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml | 2 + .../qemuxml2argv-serial-tcp-telnet.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml | 2 + .../qemuxml2argvdata/qemuxml2argv-serial-unix.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml | 2 + tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 2 + .../qemuxml2argvdata/qemuxml2argv-sound-device.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-sound.xml | 2 + .../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 | 2 + .../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 + tests/qemuxml2xmltest.c | 1 + 169 files changed, 870 insertions(+), 70 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml -- 1.8.1.5

Assume format type is 'auto' when none is specified on qemu command line. --- src/conf/domain_conf.c | 2 +- src/conf/domain_conf.h | 5 +++++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 6 ++++++ tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml | 2 ++ .../qemuxml2argv-disk-drive-network-rbd-ceph-env.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 3 +++ tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml | 4 ++++ tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 4 ++++ tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 4 ++++ tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-migrate.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-user.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-sound.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml | 1 + 60 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dc0ecaa..8d57256 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2710,7 +2710,7 @@ virDomainDefPostParseDeviceIterator(virDomainDefPtr def ATTRIBUTE_UNUSED, } -static int +int virDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, virDomainXMLOptionPtr xmlopt) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f1f01fa..89515de 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2031,6 +2031,11 @@ virDomainXMLNamespacePtr virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt) ATTRIBUTE_NONNULL(1); +int +virDomainDefPostParse(virDomainDefPtr def, + virCapsPtr caps, + virDomainXMLOptionPtr xmlopt); + static inline bool virDomainObjIsActive(virDomainObjPtr dom) { diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f778e9c..32b4ae8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -119,6 +119,7 @@ virDomainDefGetSecurityLabelDef; virDomainDefParseFile; virDomainDefParseNode; virDomainDefParseString; +virDomainDefPostParse; virDomainDeleteConfig; virDomainDeviceAddressIsValid; virDomainDeviceAddressTypeToString; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 05c12b2..37a961d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8102,6 +8102,7 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, def->bus = VIR_DOMAIN_DISK_BUS_IDE; def->device = VIR_DOMAIN_DISK_DEVICE_DISK; def->type = VIR_DOMAIN_DISK_TYPE_FILE; + def->format = VIR_STORAGE_FILE_AUTO; for (i = 0 ; i < nkeywords ; i++) { if (STREQ(keywords[i], "file")) { @@ -9349,6 +9350,8 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (VIR_ALLOC(disk) < 0) goto no_memory; + disk->format = VIR_STORAGE_FILE_AUTO; + if (STRPREFIX(val, "/dev/")) disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK; else if (STRPREFIX(val, "nbd:")) { @@ -9994,6 +9997,9 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (virDomainDefAddImplicitControllers(def) < 0) goto error; + if (virDomainDefPostParse(def, qemuCaps, xmlopt) < 0) + goto error; + if (cmd->num_args || cmd->num_env) { def->ns = *virDomainXMLOptionGetNamespace(xmlopt); def->namespaceData = cmd; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml index 6cb941d..775101d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> + <driver name='qemu'/> <source dev='/dev/cdrom'/> <target dev='hdc' bus='ide'/> <readonly/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml index 5c50e09..c877adf 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml @@ -15,11 +15,13 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> + <driver name='qemu'/> <source file='/tmp/firmware.img'/> <target dev='fda' bus='fdc'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml index 0d29608..e7dad41 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml b/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml index 96058f1..79336db 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml b/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml index c4d483a..37dc45a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml b/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml index e3821cd..a531df5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml index f885be1..1aabfe2 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml @@ -15,11 +15,13 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> + <driver name='qemu'/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml index e8c9949..58cf0c7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml @@ -15,11 +15,13 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> + <driver name='qemu'/> <source file='/root/boot.iso'/> <target dev='hdc' bus='ide'/> <readonly/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml index 532dbc4..c4b7aff 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml @@ -15,11 +15,13 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hdc' bus='ide'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml index 016afad..055bcb2 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml @@ -15,11 +15,13 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hdc' bus='ide'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> 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..fa4328c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml index c0c6629..cdad2cd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml @@ -15,16 +15,19 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> + <driver name='qemu'/> <source dev='/dev/fd0'/> <target dev='fda' bus='fdc'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> + <driver name='qemu'/> <source file='/tmp/firmware.img'/> <target dev='fdb' bus='fdc'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml index ba044d1..84f96c3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml @@ -15,21 +15,25 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hdb' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='file' device='disk'> + <driver name='qemu'/> <source file='/tmp/data.img'/> <target dev='hdc' bus='ide'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='file' device='disk'> + <driver name='qemu'/> <source file='/tmp/logs.img'/> <target dev='hdd' bus='ide'/> <address type='drive' controller='0' bus='1' target='0' unit='1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml index d401d7d..455cd87 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml @@ -15,11 +15,13 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='disk'> + <driver name='qemu' type='raw'/> <source file='/tmp/usbdisk.img'/> <target dev='sda' bus='usb'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml index 29f406e..10214df 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml @@ -15,21 +15,25 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='file' device='disk'> + <driver name='qemu'/> <source file='/tmp/data.img'/> <target dev='vda' bus='virtio'/> </disk> <disk type='file' device='disk'> + <driver name='qemu'/> <source file='/tmp/logs.img'/> <target dev='vdb' bus='virtio'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml index 0795fe3..d3cbd0b 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml @@ -15,21 +15,25 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='file' device='disk'> + <driver name='qemu'/> <source file='/tmp/data.img'/> <target dev='xvda' bus='xen'/> </disk> <disk type='file' device='disk'> + <driver name='qemu'/> <source file='/tmp/logs.img'/> <target dev='xvdg' bus='xen'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml index d0e9d77..5f08b6c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml index f3cdf69..5779e48 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml index 70a7ce3..0892198 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml index 8ef7d05..1b2c5ed 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml index 70a7ce3..0892198 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml index 663b547..509c0a4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml index 3c69f83..0e44a48 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest2'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml index 811e987..714b66c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml b/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml index 6548c30..3abdaea 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml b/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml index 345bdb3..2f8baee 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml index 5ef3da0..3fdb674 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml index b2cfe23..89482a8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml b/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml index 961e5af..9e2f162 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml index 9c8e5dd..8494e80 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml @@ -18,6 +18,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml index b89327d..802bc09 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml @@ -18,6 +18,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml index fe0cf99..a12867d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml @@ -19,6 +19,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml index fd65832..e181c01 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml @@ -18,6 +18,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml index 72d4bfb..6561537 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml index 9c8e5dd..8494e80 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml @@ -18,6 +18,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml index b150371..1f5317e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml index eca5da5..aacc8a6 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml index fe3a271..e99b9a1 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml index ff7ea01..1bcffdf 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml b/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml index 961e5af..9e2f162 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml b/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml index 23f1064..855836c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml b/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml index 826ea30..7151b54 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml b/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml index c4d483a..37dc45a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml b/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml index 961e5af..9e2f162 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml index 61e382c..1f7ee97 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml index c6780aa..1542f00 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml index 98bbb56..1eecfb7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml index 5d03125..be71132 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml index cbd5bdc..9598df3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml index 082b99b..3144fe9 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml index 0ff161d..27d4170 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml index 425b442..c5f4dc5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml b/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml index 7a72a9f..202478d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smp.xml b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml index 6a48c2e..03daef6 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-smp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml @@ -18,6 +18,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-sound.xml b/tests/qemuxml2argvdata/qemuxml2argv-sound.xml index ac78502..8e8078e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-sound.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-sound.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml b/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml index 4de94ec..52b4624 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> + <driver name='qemu'/> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> -- 1.8.1.5

On 04/22/2013 02:43 PM, Ján Tomko wrote:
Assume format type is 'auto' when none is specified on qemu command line. --- src/conf/domain_conf.c | 2 +- src/conf/domain_conf.h | 5 +++++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 6 ++++++ tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml | 2 ++ .../qemuxml2argv-disk-drive-network-rbd-ceph-env.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 3 +++ tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml | 4 ++++ tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml | 2 ++ tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 4 ++++ tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 4 ++++ tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-migrate.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-user.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-sound.xml | 1 + tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml | 1 + 60 files changed, 86 insertions(+), 1 deletion(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dc0ecaa..8d57256 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2710,7 +2710,7 @@ virDomainDefPostParseDeviceIterator(virDomainDefPtr def ATTRIBUTE_UNUSED, }
-static int +int virDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, virDomainXMLOptionPtr xmlopt) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f1f01fa..89515de 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2031,6 +2031,11 @@ virDomainXMLNamespacePtr virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt) ATTRIBUTE_NONNULL(1);
+int +virDomainDefPostParse(virDomainDefPtr def, + virCapsPtr caps, + virDomainXMLOptionPtr xmlopt); + static inline bool virDomainObjIsActive(virDomainObjPtr dom) { diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f778e9c..32b4ae8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -119,6 +119,7 @@ virDomainDefGetSecurityLabelDef; virDomainDefParseFile; virDomainDefParseNode; virDomainDefParseString; +virDomainDefPostParse; virDomainDeleteConfig; virDomainDeviceAddressIsValid; virDomainDeviceAddressTypeToString; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 05c12b2..37a961d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8102,6 +8102,7 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, def->bus = VIR_DOMAIN_DISK_BUS_IDE; def->device = VIR_DOMAIN_DISK_DEVICE_DISK; def->type = VIR_DOMAIN_DISK_TYPE_FILE; + def->format = VIR_STORAGE_FILE_AUTO;
for (i = 0 ; i < nkeywords ; i++) { if (STREQ(keywords[i], "file")) { @@ -9349,6 +9350,8 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (VIR_ALLOC(disk) < 0) goto no_memory;
+ disk->format = VIR_STORAGE_FILE_AUTO; + if (STRPREFIX(val, "/dev/")) disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK; else if (STRPREFIX(val, "nbd:")) { @@ -9994,6 +9997,9 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, if (virDomainDefAddImplicitControllers(def) < 0) goto error;
+ if (virDomainDefPostParse(def, qemuCaps, xmlopt) < 0) + goto error; + if (cmd->num_args || cmd->num_env) { def->ns = *virDomainXMLOptionGetNamespace(xmlopt); def->namespaceData = cmd; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml index 6cb941d..775101d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml @@ -15,6 +15,7 @@ <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> + <driver name='qemu'/>
I assume that all of these additional <driver> elements are necessary due to the argv->xml conversion now adding that in, and that's caused by the new call to the PostParse callback, right? If so, ACK, but it would be nice to just mention that in the commit log.

Add new controller type 'pci' with models 'pci-root' and 'pci-bridge'. --- docs/formatdomain.html.in | 22 +++++++++++++++++++++- docs/schemas/domaincommon.rng | 12 ++++++++++++ src/conf/domain_conf.c | 21 ++++++++++++++++++++- src/conf/domain_conf.h | 9 +++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 888c005..4a700f9 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2124,7 +2124,7 @@ <p> Each controller has a mandatory attribute <code>type</code>, which must be one of "ide", "fdc", "scsi", "sata", "usb", - "ccid", or "virtio-serial", and a mandatory + "ccid", "virtio-serial" or "pci", and a mandatory attribute <code>index</code> which is the decimal integer describing in which order the bus controller is encountered (for use in <code>controller</code> attributes @@ -2177,6 +2177,26 @@ </devices> ...</pre> + <p> + PCI controllers have an optional <code>model</code> attribute with + possible values <code>pci-root</code> or <code>pci-bridge</code>. + For machine types which provide an implicit pci bus, the pci-root + controller with index=0 is auto-added and required to use PCI devices. + PCI root has no address. + PCI bridges are auto-added if there are too many devices to fit on + the one bus provided by pci-root, or a PCI bus number greater than zero + was specified. (<span class="since">since 1.0.5</span>) + </p> +<pre> + ... + <devices> + <controller type='pci' index='0' model='pci-root'/> + <controller type='pci' index='1' model='pci-bridge'> + <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction=off'/> + </controller> + </devices> + ...</pre> + <h4><a name="elementsLease">Device leases</a></h4> <p> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 3976b82..cf91c2d 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"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8d57256..1e7de52 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; @@ -13488,6 +13505,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 89515de..3cb626b 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, @@ -2425,6 +2433,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/22/2013 02:43 PM, Ján Tomko wrote:
Add new controller type 'pci' with models 'pci-root' and 'pci-bridge'. --- docs/formatdomain.html.in | 22 +++++++++++++++++++++- docs/schemas/domaincommon.rng | 12 ++++++++++++ src/conf/domain_conf.c | 21 ++++++++++++++++++++- src/conf/domain_conf.h | 9 +++++++++ 4 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 888c005..4a700f9 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2124,7 +2124,7 @@ <p> Each controller has a mandatory attribute <code>type</code>, which must be one of "ide", "fdc", "scsi", "sata", "usb", - "ccid", or "virtio-serial", and a mandatory + "ccid", "virtio-serial" or "pci", and a mandatory attribute <code>index</code> which is the decimal integer describing in which order the bus controller is encountered (for use in <code>controller</code> attributes @@ -2177,6 +2177,26 @@ </devices> ...</pre>
+ <p> + PCI controllers have an optional <code>model</code> attribute with + possible values <code>pci-root</code> or <code>pci-bridge</code>. + For machine types which provide an implicit pci bus, the pci-root + controller with index=0 is auto-added and required to use PCI devices. + PCI root has no address. + PCI bridges are auto-added if there are too many devices to fit on + the one bus provided by pci-root, or a PCI bus number greater than zero + was specified. (<span class="since">since 1.0.5</span>)
Just so that it's clear that it's not automatic-only, you should also say something like "a pci-bridge device can be manually added in the domain's configuration, but care should be taken to not have any gaps in the sequence of index attributes when there are multiple pci controllers".
+ </p> +<pre> + ... + <devices> + <controller type='pci' index='0' model='pci-root'/> + <controller type='pci' index='1' model='pci-bridge'> + <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction=off'/> + </controller> + </devices> + ...</pre> + <h4><a name="elementsLease">Device leases</a></h4>
<p> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 3976b82..cf91c2d 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"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8d57256..1e7de52 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; @@ -13488,6 +13505,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 89515de..3cb626b 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, @@ -2425,6 +2433,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)
ACK.

On 04/22/2013 10:11 PM, Laine Stump wrote:
On 04/22/2013 02:43 PM, Ján Tomko wrote:
--- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2124,7 +2124,7 @@ <p> Each controller has a mandatory attribute <code>type</code>, which must be one of "ide", "fdc", "scsi", "sata", "usb", - "ccid", or "virtio-serial", and a mandatory + "ccid", "virtio-serial" or "pci", and a mandatory attribute <code>index</code> which is the decimal integer describing in which order the bus controller is encountered (for use in <code>controller</code> attributes @@ -2177,6 +2177,26 @@ </devices> ...</pre>
+ <p> + PCI controllers have an optional <code>model</code> attribute with + possible values <code>pci-root</code> or <code>pci-bridge</code>. + For machine types which provide an implicit pci bus, the pci-root + controller with index=0 is auto-added and required to use PCI devices. + PCI root has no address. + PCI bridges are auto-added if there are too many devices to fit on + the one bus provided by pci-root, or a PCI bus number greater than zero + was specified. (<span class="since">since 1.0.5</span>)
Just so that it's clear that it's not automatic-only, you should also say something like "a pci-bridge device can be manually added in the domain's configuration, but care should be taken to not have any gaps in the sequence of index attributes when there are multiple pci controllers".
Gaps in the indexes might work, as long as the bridges don't reference unspecified buses. I'll be squashing this in before pushing: diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index bd4b77c..0c0506b 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2189,7 +2189,12 @@ PCI root has no address. PCI bridges are auto-added if there are too many devices to fit on the one bus provided by pci-root, or a PCI bus number greater than zero - was specified. (<span class="since">since 1.0.5</span>) + was specified. + PCI bridges can also be specified manually, but their addresses should + only refer to PCI buses provided by already specified PCI controllers. + Leaving gaps in the PCI controller indexes might lead to an invalid + configuration. + (<span class="since">since 1.0.5</span>) </p> <pre> ...
ACK.
Thanks, Jan

From: liguang <lig.fnst@cn.fujitsu.com> --- src/qemu/qemu_capabilities.c | 3 +++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 30 +++++++++++++++++++++++++++++- tests/qemuhelptest.c | 21 ++++++++++++++------- 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ef291c0..31e56fa 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 { @@ -1347,6 +1349,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 37a961d..f052a91 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3606,6 +3606,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: @@ -5791,7 +5809,11 @@ qemuBuildCommandLine(virConnectPtr conn, int contOrder[] = { /* 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. */ + * remove the PIIX4. + * + * We don't add PCI root controller either, because it's implicit, + * but we do add PCI bridges. */ + VIR_DOMAIN_CONTROLLER_TYPE_PCI, VIR_DOMAIN_CONTROLLER_TYPE_USB, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, VIR_DOMAIN_CONTROLLER_TYPE_SATA, @@ -6405,6 +6427,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/22/2013 02:43 PM, Ján Tomko wrote:
From: liguang <lig.fnst@cn.fujitsu.com>
Add a "Signed-off-by:" line for yourself.
--- src/qemu/qemu_capabilities.c | 3 +++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 30 +++++++++++++++++++++++++++++- tests/qemuhelptest.c | 21 ++++++++++++++------- 4 files changed, 47 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ef291c0..31e56fa 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 { @@ -1347,6 +1349,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 37a961d..f052a91 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3606,6 +3606,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: @@ -5791,7 +5809,11 @@ qemuBuildCommandLine(virConnectPtr conn, int contOrder[] = { /* 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. */ + * remove the PIIX4. + * + * We don't add PCI root controller either, because it's implicit, + * but we do add PCI bridges. */
"because it's implicit in the machinetype". Move the closing */ down to the next line.
+ VIR_DOMAIN_CONTROLLER_TYPE_PCI, VIR_DOMAIN_CONTROLLER_TYPE_USB, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, VIR_DOMAIN_CONTROLLER_TYPE_SATA, @@ -6405,6 +6427,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

<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 | 2 +- src/conf/domain_conf.h | 6 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 57 ++++++++++++------ src/qemu/qemu_command.h | 3 +- src/qemu/qemu_domain.c | 67 +++++++++++++++++++++- 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-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 + 162 files changed, 269 insertions(+), 23 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1e7de52..5740009 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9762,7 +9762,7 @@ virDomainLookupVcpuPin(virDomainDefPtr def, return NULL; } -static int +int virDomainDefMaybeAddController(virDomainDefPtr def, int type, int idx, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3cb626b..565f0f8 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2553,6 +2553,12 @@ 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 32b4ae8..ca324de 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 f052a91..3787ff1 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1196,6 +1196,7 @@ typedef uint8_t qemuDomainPCIAddressBus[QEMU_PCI_ADDRESS_SLOT_LAST]; struct _qemuDomainPCIAddressSet { qemuDomainPCIAddressBus *used; virDevicePCIAddress lastaddr; + size_t nbuses; /* allocation of 'used' */ }; @@ -1206,6 +1207,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")); @@ -1321,7 +1326,15 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (!(addrs = qemuDomainPCIAddressSetCreate(def))) + int nbuses = 0; + int i; + + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + nbuses++; + } + + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses))) goto cleanup; if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) @@ -1366,16 +1379,25 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, return qemuDomainAssignPCIAddresses(def, qemuCaps, obj); } -qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def) +qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + unsigned int nbuses) { 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; + + /* 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; @@ -1604,12 +1626,6 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, virDevicePCIAddressPtr addrptr; 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 */ @@ -1661,16 +1677,18 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* PIIX3 (ISA bridge, IDE controller, something else unknown, USB controller) * hardcoded slot=1, multifunction device */ - memset(&tmp_addr, 0, sizeof(tmp_addr)); - tmp_addr.slot = 1; - for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { - if ((*func == 1 && reservedIDE) || - (*func == 2 && reservedUSB)) - /* we have reserved this pci address */ - continue; + if (addrs->nbuses) { + memset(&tmp_addr, 0, sizeof(tmp_addr)); + tmp_addr.slot = 1; + for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { + if ((*func == 1 && reservedIDE) || + (*func == 2 && reservedUSB)) + /* we have reserved this pci address */ + continue; - if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) - goto error; + if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) + goto error; + } } if (def->nvideos > 0) { @@ -1762,6 +1780,9 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* Device controllers (SCSI, USB, but not IDE, FDC or CCID) */ for (i = 0; i < def->ncontrollers ; i++) { + /* PCI root has no address */ + 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..b05510b 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -196,7 +196,8 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def, int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, virDomainObjPtr obj); -qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def); +qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + unsigned int nbuses); int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a7aabdf..ab99538 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -673,6 +673,37 @@ qemuDomainDefPostParse(virDomainDefPtr def, !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) return -1; + /* Add implicit PCI root controller if the machine has one */ + switch (def->os.arch) { + case VIR_ARCH_I686: + case VIR_ARCH_X86_64: + if (!def->os.machine) + break; + if (STRPREFIX(def->os.machine, "pc-q35") || + STREQ(def->os.machine, "q35") || + STREQ(def->os.machine, "isapc")) + break; + if (!STRPREFIX(def->os.machine, "pc-0.") && + !STRPREFIX(def->os.machine, "pc-1.") && + !STREQ(def->os.machine, "pc") && + !STRPREFIX(def->os.machine, "rhel")) + break; + + case VIR_ARCH_ALPHA: + case VIR_ARCH_PPC: + case VIR_ARCH_PPC64: + case VIR_ARCH_PPCEMB: + case VIR_ARCH_SH4: + case VIR_ARCH_SH4EB: + if (virDomainDefMaybeAddController( + def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + return -1; + break; + default: + break; + } + return 0; } @@ -1255,7 +1286,8 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, if ((flags & VIR_DOMAIN_XML_MIGRATABLE)) { int i; - virDomainControllerDefPtr usb = NULL; + int remove = 0; + virDomainControllerDefPtr usb = NULL, pci = NULL; /* If only the default USB controller is present, we can remove it * and make the XML compatible with older versions of libvirt which @@ -1274,9 +1306,36 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, if (usb && usb->idx == 0 && usb->model == -1) { VIR_DEBUG("Removing default USB controller from domain '%s'" " for migration compatibility", def->name); + remove++; + } else { + usb = NULL; + } + + /* 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 (pci) { + pci = NULL; + break; + } + pci = def->controllers[i]; + } + } + + 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); + remove++; + } else { + pci = NULL; + } + + if (remove) { controllers = def->controllers; ncontrollers = def->ncontrollers; - if (VIR_ALLOC_N(def->controllers, ncontrollers - 1) < 0) { + if (VIR_ALLOC_N(def->controllers, ncontrollers - remove) < 0) { controllers = NULL; virReportOOMError(); goto cleanup; @@ -1284,10 +1343,12 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, def->ncontrollers = 0; for (i = 0; i < ncontrollers; i++) { - if (controllers[i] != usb) + if (controllers[i] != usb && controllers[i] != pci) 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 775101d..c9fcfbb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.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-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml index c877adf..f662990 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml @@ -29,6 +29,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 e7dad41..9230816 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-network.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-network.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-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 79336db..b4e7424 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.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-clock-utc.xml b/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml index 37dc45a..1d7cc95 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-utc.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-console-compat.xml b/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml index a531df5..a767eea 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-console-compat.xml @@ -22,6 +22,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-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 1aabfe2..a90be1c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml @@ -28,6 +28,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 58cf0c7..259ea1f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.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-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml index c4b7aff..8683233 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml @@ -28,6 +28,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 055bcb2..32e511e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml @@ -28,6 +28,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 fa4328c..f1840d0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ceph-env.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-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 cdad2cd..0d47dfa 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml @@ -35,6 +35,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 84f96c3..d91b783 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-many.xml @@ -40,6 +40,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 455cd87..5f8b8e0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-usb.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-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 10214df..2ca305a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml @@ -39,6 +39,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 d3cbd0b..af3a4b7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml @@ -39,6 +39,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 5f08b6c..64f173e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl-fullscreen.xml @@ -22,6 +22,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 5779e48..99d13a5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-sdl.xml @@ -22,6 +22,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 0892198..4fe20c3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.xml @@ -22,6 +22,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 1b2c5ed..b3214fd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml @@ -22,6 +22,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 0892198..4fe20c3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.xml @@ -22,6 +22,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 509c0a4..65f990b 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc.xml @@ -22,6 +22,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 0e44a48..63a0d2a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml @@ -22,6 +22,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 714b66c..26e8b42 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml @@ -22,6 +22,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 3abdaea..c4534c4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.xml @@ -22,6 +22,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 2f8baee..208e2b7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.xml @@ -22,6 +22,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 3fdb674..ab17e56 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.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-machine-core-on.xml b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml index 89482a8..7294ebb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.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-migrate.xml b/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml index 9e2f162..742a553 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-migrate.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-migrate.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-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 8494e80..4997e5b 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.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-disable-s3.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml index 802bc09..5f5690d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.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-disable-suspends.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml index a12867d..a81f3c4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.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-enable-s4.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml index e181c01..42ad266 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.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-no-reboot.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml index 6561537..f066c13 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.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-misc-uuid.xml b/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml index 8494e80..4997e5b 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.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-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 1f5317e..e8c2bf7 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.xml @@ -22,6 +22,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 aacc8a6..4bc79ce 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-eth.xml @@ -22,6 +22,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 e99b9a1..e1d3046 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-user.xml @@ -22,6 +22,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 1bcffdf..a699f6e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-virtio.xml @@ -22,6 +22,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 9e2f162..742a553 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.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-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 855836c..53381fb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.xml @@ -22,6 +22,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 7151b54..45ede22 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.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> <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 37dc45a..1d7cc95 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-restore-v1.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-restore-v2.xml b/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml index 9e2f162..742a553 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-restore-v2.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-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 1f7ee97..cde9718 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-dev.xml @@ -22,6 +22,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 1542f00..f7da73e 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-file.xml @@ -22,6 +22,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 1eecfb7..f5215bb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-many.xml @@ -22,6 +22,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 be71132..b5be682 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-pty.xml @@ -22,6 +22,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 9598df3..4c4a131 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.xml @@ -22,6 +22,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 3144fe9..64361cc 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.xml @@ -22,6 +22,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 27d4170..b8895c2 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-udp.xml @@ -22,6 +22,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 c5f4dc5..b24269b 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-unix.xml @@ -22,6 +22,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 202478d..e63ff57 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-serial-vc.xml @@ -22,6 +22,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 03daef6..83ddcb3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-smp.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.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-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 8e8078e..21db704 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-sound.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-sound.xml @@ -22,6 +22,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 52b4624..31c0152 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-watchdog.xml @@ -22,6 +22,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..6aed326 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-balloon-device-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-balloon-device-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'/> <memballoon model='virtio'/> </devices> </domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml index c257292..0175272 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-channel-virtio-auto.xml @@ -26,6 +26,7 @@ <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </controller> <controller type='virtio-serial' index='2'/> + <controller type='pci' index='0' model='pci-root'/> <channel type='pty'> <target type='virtio' name='org.linux-kvm.port.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> 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..3c865c3 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-console-virtio.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'/> <console type='pty'> <target type='virtio' port='0'/> </console> 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..7d152bc 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-scsi-device-auto.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-scsi-device-auto.xml @@ -27,6 +27,7 @@ <controller type='usb' index='0'/> <controller type='ide' index='0'/> <controller type='scsi' index='0'/> + <controller type='pci' index='0' model='pci-root'/> <memballoon model='virtio'/> </devices> </domain> 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/22/2013 02:43 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 | 2 +- src/conf/domain_conf.h | 6 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 57 ++++++++++++------ src/qemu/qemu_command.h | 3 +- src/qemu/qemu_domain.c | 67 +++++++++++++++++++++- [ + tons of test xml files] 162 files changed, 269 insertions(+), 23 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1e7de52..5740009 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9762,7 +9762,7 @@ virDomainLookupVcpuPin(virDomainDefPtr def, return NULL; }
-static int +int virDomainDefMaybeAddController(virDomainDefPtr def, int type, int idx, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3cb626b..565f0f8 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2553,6 +2553,12 @@ 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 32b4ae8..ca324de 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 f052a91..3787ff1 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1196,6 +1196,7 @@ typedef uint8_t qemuDomainPCIAddressBus[QEMU_PCI_ADDRESS_SLOT_LAST]; struct _qemuDomainPCIAddressSet { qemuDomainPCIAddressBus *used; virDevicePCIAddress lastaddr; + size_t nbuses; /* allocation of 'used' */ };
@@ -1206,6 +1207,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")); @@ -1321,7 +1326,15 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (!(addrs = qemuDomainPCIAddressSetCreate(def))) + int nbuses = 0; + int i; + + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + nbuses++; + } + + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses))) goto cleanup;
if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) @@ -1366,16 +1379,25 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, return qemuDomainAssignPCIAddresses(def, qemuCaps, obj); }
-qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def) +qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + unsigned int nbuses) { 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; + + /* 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;
@@ -1604,12 +1626,6 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, virDevicePCIAddressPtr addrptr; 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 */ @@ -1661,16 +1677,18 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* PIIX3 (ISA bridge, IDE controller, something else unknown, USB controller) * hardcoded slot=1, multifunction device */ - memset(&tmp_addr, 0, sizeof(tmp_addr)); - tmp_addr.slot = 1; - for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { - if ((*func == 1 && reservedIDE) || - (*func == 2 && reservedUSB)) - /* we have reserved this pci address */ - continue; + if (addrs->nbuses) { + memset(&tmp_addr, 0, sizeof(tmp_addr)); + tmp_addr.slot = 1; + for (*func = 0; *func < QEMU_PCI_ADDRESS_FUNCTION_LAST; (*func)++) { + if ((*func == 1 && reservedIDE) || + (*func == 2 && reservedUSB)) + /* we have reserved this pci address */ + continue;
- if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) - goto error; + if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) + goto error; + } }
if (def->nvideos > 0) { @@ -1762,6 +1780,9 @@ qemuAssignDevicePCISlots(virDomainDefPtr def,
/* Device controllers (SCSI, USB, but not IDE, FDC or CCID) */ for (i = 0; i < def->ncontrollers ; i++) { + /* PCI root has no address */ + 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..b05510b 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -196,7 +196,8 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def, int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, virDomainObjPtr obj); -qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def); +qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, + unsigned int nbuses); int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a7aabdf..ab99538 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -673,6 +673,37 @@ qemuDomainDefPostParse(virDomainDefPtr def, !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) return -1;
+ /* Add implicit PCI root controller if the machine has one */ + switch (def->os.arch) { + case VIR_ARCH_I686: + case VIR_ARCH_X86_64: + if (!def->os.machine) + break; + if (STRPREFIX(def->os.machine, "pc-q35") || + STREQ(def->os.machine, "q35") || + STREQ(def->os.machine, "isapc")) + break; + if (!STRPREFIX(def->os.machine, "pc-0.") && + !STRPREFIX(def->os.machine, "pc-1.") && + !STREQ(def->os.machine, "pc") && + !STRPREFIX(def->os.machine, "rhel")) + break;
If you're going to fall through to a different case like this, you should put a comment in the code something like this: /* FALL THROUGH TO NEXT CASE */ just so people don't have to think too hard :-) However, I think it would be more easily expandable in the future if you had a straight switch statement with all the cases, and just set a "needsPCIRoot" boolean for those cases that need it, then an "if (needsPCIRoot)" at the end. In the future when we want to add other implicit devices, each case can be a mix of the appropriate "needsThis" and "needsThat", with the actual additions at the end.
+ + case VIR_ARCH_ALPHA: + case VIR_ARCH_PPC: + case VIR_ARCH_PPC64: + case VIR_ARCH_PPCEMB: + case VIR_ARCH_SH4: + case VIR_ARCH_SH4EB: + if (virDomainDefMaybeAddController( + def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + return -1; + break; + default: + break; + } +
Wow! Is that what it broke down to? I figured there would be many more than that.
return 0; }
@@ -1255,7 +1286,8 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
if ((flags & VIR_DOMAIN_XML_MIGRATABLE)) { int i; - virDomainControllerDefPtr usb = NULL; + int remove = 0; + virDomainControllerDefPtr usb = NULL, pci = NULL;
/* If only the default USB controller is present, we can remove it * and make the XML compatible with older versions of libvirt which @@ -1274,9 +1306,36 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, if (usb && usb->idx == 0 && usb->model == -1) { VIR_DEBUG("Removing default USB controller from domain '%s'" " for migration compatibility", def->name); + remove++; + } else { + usb = NULL; + } + + /* 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 (pci) { + pci = NULL; + break; + } + pci = def->controllers[i]; + } + } + + 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); + remove++; + } else { + pci = NULL; + } + + if (remove) { controllers = def->controllers; ncontrollers = def->ncontrollers; - if (VIR_ALLOC_N(def->controllers, ncontrollers - 1) < 0) { + if (VIR_ALLOC_N(def->controllers, ncontrollers - remove) < 0) { controllers = NULL; virReportOOMError(); goto cleanup; @@ -1284,10 +1343,12 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
def->ncontrollers = 0; for (i = 0; i < ncontrollers; i++) { - if (controllers[i] != usb) + if (controllers[i] != usb && controllers[i] != pci) def->controllers[def->ncontrollers++] = controllers[i]; } } + + }
ret = virDomainDefFormatInternal(def, flags, buf);
... and the rest is the gigantic amount of test xml changes. ACK, with the addition of the "FALLTHROUGH" comment, or restructuring it is as I suggested.

On 04/22/2013 02:37 PM, Laine Stump wrote:
On 04/22/2013 02:43 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. ---
+ /* Add implicit PCI root controller if the machine has one */ + switch (def->os.arch) { + case VIR_ARCH_I686: + case VIR_ARCH_X86_64: + if (!def->os.machine) + break; + if (STRPREFIX(def->os.machine, "pc-q35") || + STREQ(def->os.machine, "q35") || + STREQ(def->os.machine, "isapc")) + break; + if (!STRPREFIX(def->os.machine, "pc-0.") && + !STRPREFIX(def->os.machine, "pc-1.") && + !STREQ(def->os.machine, "pc") && + !STRPREFIX(def->os.machine, "rhel")) + break;
If you're going to fall through to a different case like this, you should put a comment in the code something like this:
/* FALL THROUGH TO NEXT CASE */
just so people don't have to think too hard :-)
That, and Coverity will ding you on unmarked fallthrough of a non-empty case label. Coverity recognizes several spellings, but our code base seems to prefer the spelling "/* fallthrough */" as a form that works across several static analyzers.
ACK, with the addition of the "FALLTHROUGH" comment, or restructuring it is as I suggested.
Of course, restructuring it means you don't even have to worry about magic comments :) -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 04/22/2013 10:37 PM, Laine Stump wrote:
On 04/22/2013 02:43 PM, Ján Tomko wrote:
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a7aabdf..ab99538 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -673,6 +673,37 @@ qemuDomainDefPostParse(virDomainDefPtr def, !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) return -1;
+ /* Add implicit PCI root controller if the machine has one */ + switch (def->os.arch) { + case VIR_ARCH_I686: + case VIR_ARCH_X86_64: + if (!def->os.machine) + break; + if (STRPREFIX(def->os.machine, "pc-q35") || + STREQ(def->os.machine, "q35") || + STREQ(def->os.machine, "isapc")) + break; + if (!STRPREFIX(def->os.machine, "pc-0.") && + !STRPREFIX(def->os.machine, "pc-1.") && + !STREQ(def->os.machine, "pc") && + !STRPREFIX(def->os.machine, "rhel")) + break;
If you're going to fall through to a different case like this, you should put a comment in the code something like this:
/* FALL THROUGH TO NEXT CASE */
just so people don't have to think too hard :-)
However, I think it would be more easily expandable in the future if you had a straight switch statement with all the cases, and just set a "needsPCIRoot" boolean for those cases that need it, then an "if (needsPCIRoot)" at the end. In the future when we want to add other implicit devices, each case can be a mix of the appropriate "needsThis" and "needsThat", with the actual additions at the end.
...
ACK, with the addition of the "FALLTHROUGH" comment, or restructuring it is as I suggested.
I'm squashing this in before pushing: diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ab99538..98ac56f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -668,6 +668,8 @@ qemuDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, void *opaque ATTRIBUTE_UNUSED) { + bool addPCIRoot = false; + /* check for emulator and create a default one if needed */ if (!def->emulator && !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) @@ -688,6 +690,8 @@ qemuDomainDefPostParse(virDomainDefPtr def, !STREQ(def->os.machine, "pc") && !STRPREFIX(def->os.machine, "rhel")) break; + addPCIRoot = true; + break; case VIR_ARCH_ALPHA: case VIR_ARCH_PPC: @@ -695,15 +699,18 @@ qemuDomainDefPostParse(virDomainDefPtr def, case VIR_ARCH_PPCEMB: case VIR_ARCH_SH4: case VIR_ARCH_SH4EB: - if (virDomainDefMaybeAddController( - def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, - VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) - return -1; + addPCIRoot = true; break; default: break; } + if (addPCIRoot && + virDomainDefMaybeAddController( + def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, + VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) < 0) + return -1; + return 0; }

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 | 26 ++- src/qemu/qemu_command.c | 211 +++++++++++++++++---- src/qemu/qemu_command.h | 4 +- tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml | 210 ++++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 5 files changed, 411 insertions(+), 41 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5740009..800c0a7 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2578,6 +2578,9 @@ virDomainDefPostParseInternal(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED) { int i; + bool b; + int ret = -1; + virBitmapPtr bitmap = NULL; /* verify init path for container based domains */ if (STREQ(def->os.type, "exe") && !def->os.init) { @@ -2653,11 +2656,30 @@ virDomainDefPostParseInternal(virDomainDefPtr def, } } - return 0; + /* Verify that PCI controller indexes are unique */ + bitmap = virBitmapNew(def->ncontrollers); + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + ignore_value(virBitmapGetBit(bitmap, def->controllers[i]->idx, &b)); + if (b) { + virReportError(VIR_ERR_XML_ERROR, + _("Multiple PCI controllers with index %d"), + def->controllers[i]->idx); + goto cleanup; + } + ignore_value(virBitmapSetBit(bitmap, def->controllers[i]->idx)); + } + } + ret = 0; + +cleanup: + virBitmapFree(bitmap); + + return ret; no_memory: virReportOOMError(); - return -1; + goto cleanup; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3787ff1..ec7d0e6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1197,6 +1197,8 @@ struct _qemuDomainPCIAddressSet { qemuDomainPCIAddressBus *used; virDevicePCIAddress lastaddr; 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 */ }; @@ -1216,9 +1218,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 %zu are available"), + addrs->nbuses - 1); return false; } if (addr->function >= QEMU_PCI_ADDRESS_FUNCTION_LAST) { @@ -1233,9 +1236,46 @@ 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; } +/* Ensure addr fits in the address set, by expanding it if needed. + * Return value: + * -1 = OOM + * 0 = no action performed + * >0 = number of buses added + */ +static int +qemuDomainPCIAddressSetGrow(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) { @@ -1273,6 +1313,9 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return 0; } + if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!qemuPCIAddressValidate(addrs, addr)) return -1; @@ -1326,15 +1369,54 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + int max_idx = 0; int nbuses = 0; int i; + int rv; for (i = 0; i < def->ncontrollers; i++) { - if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (def->controllers[i]->idx > max_idx) + max_idx = def->controllers[i]->idx; nbuses++; + } + } + + if (nbuses > 0 && max_idx >= nbuses) + nbuses = max_idx + 1; + + 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 (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; + } + nbuses = addrs->nbuses; + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + + } else if (nbuses > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridges are not supported " + "by this QEMU binary")); + goto cleanup; } - if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses))) + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false))) goto cleanup; if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) @@ -1380,7 +1462,8 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, } qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, - unsigned int nbuses) + unsigned int nbuses, + bool dryRun) { qemuDomainPCIAddressSetPtr addrs; int i; @@ -1392,6 +1475,7 @@ qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, 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 */ @@ -1424,6 +1508,9 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, { char *str; + if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1; @@ -1450,6 +1537,9 @@ int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, { char *str; + if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1; @@ -1519,41 +1609,58 @@ void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) VIR_FREE(addrs); } - static int qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { - virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; - char *addr; + virDevicePCIAddress a = addrs->lastaddr; - 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; - } + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return -1; + } - if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + /* Start the search at the last used bus and slot */ + for (a.slot++; a.bus < addrs->nbuses; a.bus++) { + for ( ; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success; - if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - VIR_DEBUG("PCI addr %s already in use", addr); - VIR_FREE(addr); - continue; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); } + a.slot = 1; + } - VIR_DEBUG("Found free PCI addr %s", addr); - VIR_FREE(addr); + /* There were no free slots after the last used one */ + if (addrs->dryRun) { + /* a is already set to the first new bus and slot 1 */ + if (qemuDomainPCIAddressSetGrow(addrs, &a) < 0) + return -1; + goto success; + } else { + /* Check the buses from 0 up to the last used one */ + for (a.bus = 0; a.bus <= addrs->lastaddr.bus; a.bus++) { + for (a.slot = 1; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success; - addrs->lastaddr = tmp_addr; - *next_addr = tmp_addr; - return 0; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); + } + + } } virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("No more available PCI addresses")); return -1; + +success: + VIR_DEBUG("Found free PCI slot %.4x:%.2x:%.2x", + a.domain, a.bus, a.slot); + *next_addr = a; + return 0; } int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, @@ -1566,8 +1673,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; @@ -1741,6 +1850,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; @@ -1780,9 +1901,10 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* Device controllers (SCSI, USB, but not IDE, FDC or CCID) */ for (i = 0; i < def->ncontrollers ; i++) { - /* PCI root has no address */ + /* 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) @@ -1972,16 +2094,29 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, } } - /* XXX - * When QEMU grows support for > 1 PCI bus, then pci.0 changes - * to pci.1, pci.2, etc - * When QEMU grows support for > 1 PCI domain, then pci.0 change - * to pciNN.0 where NN is the domain number + /* + * PCI bridge support is required for multiple buses + * 'pci.%u' is the ID of the bridge as specified in + * qemuBuildControllerDevStr + * + * PCI_MULTIBUS capability indicates that the implicit + * PCI bus is named 'pci.0' instead of 'pci'. */ - 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) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index b05510b..5d9ae72 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -197,7 +197,9 @@ int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, virDomainObjPtr obj); qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, - unsigned int nbuses); + unsigned int nbuses, + bool dryRun); +>>>>>>> a3dcfa9... qemu: auto-add bridges and allow using them int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml new file mode 100644 index 0000000..eb20328 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml @@ -0,0 +1,210 @@ +<domain type='qemu'> + <name>fdr-br</name> + <uuid>3ec6cbe1-b5a2-4515-b800-31a61855df41</uuid> + <memory unit='KiB'>2097152</memory> + <currentMemory unit='KiB'>2097152</currentMemory> + <vcpu placement='static' cpuset='0-1'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/libexec/qemu-kvm</emulator> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/iso/f18kde.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <controller type='pci' index='1' model='pci-bridge'/> + <controller type='pci' index='2' model='pci-bridge'/> + <interface type='network'> + <mac address='52:54:00:f1:95:51'/> + <source network='default'/> + <model type='rtl8139'/> + </interface> + <interface type='network'> + <mac address='52:54:00:5c:c6:1a'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:39:97:ac'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:45:28:cb'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:ee:b9:a8'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:a9:f7:17'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:df:2b:f3'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:78:94:b4'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:6b:9b:06'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:17:df:bc'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:3b:d0:51'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:8d:2d:17'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:a7:66:af'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:54:ab:d7'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:1f:99:90'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:c8:43:87'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:df:22:b2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:d2:9a:47'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:86:05:e2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:8c:1c:c2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:48:58:92'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:99:e5:bf'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:b1:8c:25'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:60:e0:d0'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:37:00:6a'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:c7:c8:ad'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:4e:a7:cf'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:00:79:69'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:47:00:6f'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:2a:8c:8b'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:ec:d5:e3'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:7e:6e:c8'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='9216' heads='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 7434190..04b14df 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -276,6 +276,7 @@ mymain(void) DO_TEST_DIFFERENT("metadata"); DO_TEST("tpm-passthrough"); + DO_TEST("pci-bridge"); virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); -- 1.8.1.5

(before anything else - you committed an unresolved merge conflict in qemu_command.h. You'll need to remove the extra ">>>>>>>>> blah" text.) Hopefully Eric can once again review the logic of the code that determines what bridges need to be auto-added, and assign PCI addresses to devices, since he was kind enough to review it last time :-) On 04/22/2013 02:43 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.
Ah, so then we don't need to warn about gaps in the index sequence.
--- src/conf/domain_conf.c | 26 ++- src/qemu/qemu_command.c | 211 +++++++++++++++++---- src/qemu/qemu_command.h | 4 +- tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml | 210 ++++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 5 files changed, 411 insertions(+), 41 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5740009..800c0a7 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2578,6 +2578,9 @@ virDomainDefPostParseInternal(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED) { int i; + bool b; + int ret = -1; + virBitmapPtr bitmap = NULL;
/* verify init path for container based domains */ if (STREQ(def->os.type, "exe") && !def->os.init) { @@ -2653,11 +2656,30 @@ virDomainDefPostParseInternal(virDomainDefPtr def, } }
- return 0; + /* Verify that PCI controller indexes are unique */ + bitmap = virBitmapNew(def->ncontrollers); + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + ignore_value(virBitmapGetBit(bitmap, def->controllers[i]->idx, &b)); + if (b) { + virReportError(VIR_ERR_XML_ERROR, + _("Multiple PCI controllers with index %d"), + def->controllers[i]->idx); + goto cleanup; + } + ignore_value(virBitmapSetBit(bitmap, def->controllers[i]->idx)); + } + } + ret = 0; + +cleanup: + virBitmapFree(bitmap); + + return ret;
I don't see where we do something like this for the other controller types. We should (separate patch though, of course :-)
no_memory: virReportOOMError(); - return -1; + goto cleanup; }
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3787ff1..ec7d0e6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1197,6 +1197,8 @@ struct _qemuDomainPCIAddressSet { qemuDomainPCIAddressBus *used; virDevicePCIAddress lastaddr; 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 */ };
@@ -1216,9 +1218,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 %zu are available"), + addrs->nbuses - 1); return false; } if (addr->function >= QEMU_PCI_ADDRESS_FUNCTION_LAST) { @@ -1233,9 +1236,46 @@ 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; + }
You can move the duplicated "return false;" out of the if and else, to a single occurrence.
+ } return true; }
+/* Ensure addr fits in the address set, by expanding it if needed. + * Return value: + * -1 = OOM + * 0 = no action performed + * >0 = number of buses added + */ +static int +qemuDomainPCIAddressSetGrow(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) { @@ -1273,6 +1313,9 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return 0; }
+ if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!qemuPCIAddressValidate(addrs, addr)) return -1;
@@ -1326,15 +1369,54 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + int max_idx = 0; int nbuses = 0; int i; + int rv;
for (i = 0; i < def->ncontrollers; i++) { - if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (def->controllers[i]->idx > max_idx) + max_idx = def->controllers[i]->idx; nbuses++; + } + } + + if (nbuses > 0 && max_idx >= nbuses) + nbuses = max_idx + 1; + + 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 (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; + } + nbuses = addrs->nbuses; + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + + } else if (nbuses > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridges are not supported " + "by this QEMU binary")); + goto cleanup; }
- if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses))) + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false))) goto cleanup;
if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) @@ -1380,7 +1462,8 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, }
qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, - unsigned int nbuses) + unsigned int nbuses, + bool dryRun) { qemuDomainPCIAddressSetPtr addrs; int i; @@ -1392,6 +1475,7 @@ qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, 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 */ @@ -1424,6 +1508,9 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, { char *str;
+ if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1;
@@ -1450,6 +1537,9 @@ int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, { char *str;
+ if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1;
@@ -1519,41 +1609,58 @@ void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) VIR_FREE(addrs); }
- static int qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { - virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; - char *addr; + virDevicePCIAddress a = addrs->lastaddr;
- 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; - } + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return -1; + }
- if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + /* Start the search at the last used bus and slot */ + for (a.slot++; a.bus < addrs->nbuses; a.bus++) { + for ( ; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success;
- if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - VIR_DEBUG("PCI addr %s already in use", addr); - VIR_FREE(addr); - continue; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); } + a.slot = 1; + }
- VIR_DEBUG("Found free PCI addr %s", addr); - VIR_FREE(addr); + /* There were no free slots after the last used one */ + if (addrs->dryRun) { + /* a is already set to the first new bus and slot 1 */ + if (qemuDomainPCIAddressSetGrow(addrs, &a) < 0) + return -1; + goto success; + } else { + /* Check the buses from 0 up to the last used one */ + for (a.bus = 0; a.bus <= addrs->lastaddr.bus; a.bus++) { + for (a.slot = 1; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success;
- addrs->lastaddr = tmp_addr; - *next_addr = tmp_addr; - return 0; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); + } + + } }
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("No more available PCI addresses")); return -1; + +success: + VIR_DEBUG("Found free PCI slot %.4x:%.2x:%.2x", + a.domain, a.bus, a.slot); + *next_addr = a; + return 0; }
int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, @@ -1566,8 +1673,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; @@ -1741,6 +1850,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; @@ -1780,9 +1901,10 @@ qemuAssignDevicePCISlots(virDomainDefPtr def,
/* Device controllers (SCSI, USB, but not IDE, FDC or CCID) */ for (i = 0; i < def->ncontrollers ; i++) { - /* PCI root has no address */ + /* 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) @@ -1972,16 +2094,29 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, } }
- /* XXX - * When QEMU grows support for > 1 PCI bus, then pci.0 changes - * to pci.1, pci.2, etc - * When QEMU grows support for > 1 PCI domain, then pci.0 change - * to pciNN.0 where NN is the domain number + /* + * PCI bridge support is required for multiple buses + * 'pci.%u' is the ID of the bridge as specified in + * qemuBuildControllerDevStr + * + * PCI_MULTIBUS capability indicates that the implicit + * PCI bus is named 'pci.0' instead of 'pci'. */ - 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) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index b05510b..5d9ae72 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -197,7 +197,9 @@ int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, virDomainObjPtr obj); qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, - unsigned int nbuses); + unsigned int nbuses, + bool dryRun); +>>>>>>> a3dcfa9... qemu: auto-add bridges and allow using them
Oops. You've got an unresolved merge error!
int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml new file mode 100644 index 0000000..eb20328 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml
You should also do a test case where you haven't specified the bridges in the "xmlIn", but only in the "xmlOut". I *think* you should be able to do that by just putting the file that contains the bridges in qemuxml2xmloutdata, and calling the test with DO_TEST_DIFFERENT() in qemuxml2xmltest, AND omitting this test from qemuargv2xmltest.
@@ -0,0 +1,210 @@ +<domain type='qemu'> + <name>fdr-br</name> + <uuid>3ec6cbe1-b5a2-4515-b800-31a61855df41</uuid> + <memory unit='KiB'>2097152</memory> + <currentMemory unit='KiB'>2097152</currentMemory> + <vcpu placement='static' cpuset='0-1'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/libexec/qemu-kvm</emulator> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/iso/f18kde.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <controller type='pci' index='1' model='pci-bridge'/> + <controller type='pci' index='2' model='pci-bridge'/> + <interface type='network'> + <mac address='52:54:00:f1:95:51'/> + <source network='default'/> + <model type='rtl8139'/> + </interface> + <interface type='network'> + <mac address='52:54:00:5c:c6:1a'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:39:97:ac'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:45:28:cb'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:ee:b9:a8'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:a9:f7:17'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:df:2b:f3'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:78:94:b4'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:6b:9b:06'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:17:df:bc'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:3b:d0:51'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:8d:2d:17'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:a7:66:af'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:54:ab:d7'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:1f:99:90'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:c8:43:87'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:df:22:b2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:d2:9a:47'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:86:05:e2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:8c:1c:c2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:48:58:92'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:99:e5:bf'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:b1:8c:25'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:60:e0:d0'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:37:00:6a'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:c7:c8:ad'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:4e:a7:cf'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:00:79:69'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:47:00:6f'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:2a:8c:8b'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:ec:d5:e3'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:7e:6e:c8'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='9216' heads='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 7434190..04b14df 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -276,6 +276,7 @@ mymain(void) DO_TEST_DIFFERENT("metadata");
DO_TEST("tpm-passthrough"); + DO_TEST("pci-bridge");
virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt);
What about qemuxml2argvtest.c? (which means you also need a .args file.)

On 04/22/2013 12:43 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. ---
In addition to Laine's comments,
+ virBitmapPtr bitmap = NULL;
/* verify init path for container based domains */ if (STREQ(def->os.type, "exe") && !def->os.init) { @@ -2653,11 +2656,30 @@ virDomainDefPostParseInternal(virDomainDefPtr def, } }
- return 0; + /* Verify that PCI controller indexes are unique */ + bitmap = virBitmapNew(def->ncontrollers);
This limits the bitmap to the number of controllers that I passed in, but your commit message makes it sound like I can pass in a controller for index 1 and index 2 while letting the code auto-insert the controller for index 0. If that's true, then...
+ for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + ignore_value(virBitmapGetBit(bitmap, def->controllers[i]->idx, &b));
...attempting to get bit 2 (based on the explicit 2 in def->controllers[i]->idx) will fail as out-of-range,...
+ if (b) { + virReportError(VIR_ERR_XML_ERROR, + _("Multiple PCI controllers with index %d"), + def->controllers[i]->idx); + goto cleanup; + } + ignore_value(virBitmapSetBit(bitmap, def->controllers[i]->idx)); + } + }
...and the attempt to set will also fail. Which means that a similar example of passing in two controllers that both try to use index 2, and let 0 and 1 be auto-populated, won't detect the collision. Do we know what the maximum index will be? Is it time to add a growable bitmap? Should we separate this duplicate detection code into a separate patch?
+/* Ensure addr fits in the address set, by expanding it if needed. + * Return value: + * -1 = OOM + * 0 = no action performed + * >0 = number of buses added + */ +static int +qemuDomainPCIAddressSetGrow(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr)
Indentation is off.
@@ -1326,15 +1369,54 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + int max_idx = 0; int nbuses = 0; int i; + int rv;
for (i = 0; i < def->ncontrollers; i++) { - if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (def->controllers[i]->idx > max_idx) + max_idx = def->controllers[i]->idx; nbuses++; + } + }
This looks like a more accurate determination of the max bus number; should you move the duplicate detection here instead?
+ + if (nbuses > 0 && max_idx >= nbuses) + nbuses = max_idx + 1;
You change nbuses, but only if it is already > 1, but then...
+ + 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 (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; + } + nbuses = addrs->nbuses; + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + + } else if (nbuses > 1) {
...read nbuses if the capability is not present. Would it be any simpler to just change this to 'else if (max_idx > 0)'?
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridges are not supported " + "by this QEMU binary")); + goto cleanup; }
- if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses))) + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false))) goto cleanup;
if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
@@ -1519,41 +1609,58 @@ void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) VIR_FREE(addrs); }
- static int
I think we've been settling on two blank lines between functions lately, although I'm not bothered if you leave this change in.
qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { - virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; - char *addr; + virDevicePCIAddress a = addrs->lastaddr;
- 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; - } + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return -1; + }
addrs->nbuses should always be >= 1, now that we allocate it, right? Is it possible to hit this error?
- if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + /* Start the search at the last used bus and slot */ + for (a.slot++; a.bus < addrs->nbuses; a.bus++) { + for ( ; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success;
- if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - VIR_DEBUG("PCI addr %s already in use", addr); - VIR_FREE(addr); - continue; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); } + a.slot = 1; + }
- VIR_DEBUG("Found free PCI addr %s", addr); - VIR_FREE(addr); + /* There were no free slots after the last used one */ + if (addrs->dryRun) { + /* a is already set to the first new bus and slot 1 */ + if (qemuDomainPCIAddressSetGrow(addrs, &a) < 0) + return -1; + goto success; + } else { + /* Check the buses from 0 up to the last used one */ + for (a.bus = 0; a.bus <= addrs->lastaddr.bus; a.bus++) { + for (a.slot = 1; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success;
- addrs->lastaddr = tmp_addr; - *next_addr = tmp_addr; - return 0; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); + } + + } }
This wraparound logic was definitely easier to read than the v2 attempt.
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("No more available PCI addresses")); return -1; + +success: + VIR_DEBUG("Found free PCI slot %.4x:%.2x:%.2x", + a.domain, a.bus, a.slot); + *next_addr = a; + return 0; }
int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs,
-- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 04/23/2013 12:24 AM, Eric Blake wrote:
On 04/22/2013 12:43 PM, Ján Tomko wrote:
qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { - virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; - char *addr; + virDevicePCIAddress a = addrs->lastaddr;
- 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; - } + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return -1; + }
addrs->nbuses should always be >= 1, now that we allocate it, right? Is it possible to hit this error?
It will be 0 when there is no PCI controller present and we'll hit this error when someone tries to use a PCI device on a machine with no PCI bus.

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. --- v4: Moved the check for duplicate controller indexes to a separate patch Simplified nbuses and max_idx computation Only does two-pass allocation of PCI addresses if the machine has a PCI bus Does not contain traces of rebasing or spurious whitespace changes Tests auto-adding PCI bridges in xml->argv and xml->xml tests. src/qemu/qemu_command.c | 210 +++++++++++++++++---- src/qemu/qemu_command.h | 3 +- .../qemuxml2argv-pci-autoadd-addr.args | 12 ++ .../qemuxml2argv-pci-autoadd-addr.xml | 44 +++++ .../qemuxml2argv-pci-autoadd-idx.args | 13 ++ .../qemuxml2argv-pci-autoadd-idx.xml | 45 +++++ tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml | 210 +++++++++++++++++++++ tests/qemuxml2argvtest.c | 3 + .../qemuxml2xmlout-pci-autoadd-addr.xml | 44 +++++ .../qemuxml2xmlout-pci-autoadd-idx.xml | 45 +++++ tests/qemuxml2xmltest.c | 3 + 11 files changed, 593 insertions(+), 39 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-addr.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-idx.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3787ff1..30c967c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1197,6 +1197,8 @@ struct _qemuDomainPCIAddressSet { qemuDomainPCIAddressBus *used; virDevicePCIAddress lastaddr; 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 */ }; @@ -1216,9 +1218,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 %zu are available"), + addrs->nbuses - 1); return false; } if (addr->function >= QEMU_PCI_ADDRESS_FUNCTION_LAST) { @@ -1233,9 +1236,45 @@ 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")); + } else { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Slot 0 on bus 0 is reserved for the host bridge")); + } + return false; + } return true; } +/* Ensure addr fits in the address set, by expanding it if needed. + * Return value: + * -1 = OOM + * 0 = no action performed + * >0 = number of buses added + */ +static int +qemuDomainPCIAddressSetGrow(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) { @@ -1273,6 +1312,9 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return 0; } + if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!qemuPCIAddressValidate(addrs, addr)) return -1; @@ -1326,15 +1368,53 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + int max_idx = -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) - nbuses++; + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (def->controllers[i]->idx > max_idx) + max_idx = def->controllers[i]->idx; + } + } + + nbuses = max_idx + 1; + + if (nbuses > 0 && + 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 (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; + } + nbuses = addrs->nbuses; + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + + } else if (max_idx > 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridges are not supported " + "by this QEMU binary")); + goto cleanup; } - if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses))) + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false))) goto cleanup; if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) @@ -1380,7 +1460,8 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, } qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, - unsigned int nbuses) + unsigned int nbuses, + bool dryRun) { qemuDomainPCIAddressSetPtr addrs; int i; @@ -1392,6 +1473,7 @@ qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, 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 */ @@ -1424,6 +1506,9 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, { char *str; + if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1; @@ -1450,6 +1535,9 @@ int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, { char *str; + if (addrs->dryRun && qemuDomainPCIAddressSetGrow(addrs, addr) < 0) + return -1; + if (!(str = qemuPCIAddressAsString(addr))) return -1; @@ -1524,36 +1612,54 @@ static int qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { - virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; - char *addr; + virDevicePCIAddress a = addrs->lastaddr; - 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; - } + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return -1; + } - if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + /* Start the search at the last used bus and slot */ + for (a.slot++; a.bus < addrs->nbuses; a.bus++) { + for ( ; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success; - if (qemuDomainPCIAddressSlotInUse(addrs, &tmp_addr)) { - VIR_DEBUG("PCI addr %s already in use", addr); - VIR_FREE(addr); - continue; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); } + a.slot = 1; + } - VIR_DEBUG("Found free PCI addr %s", addr); - VIR_FREE(addr); + /* There were no free slots after the last used one */ + if (addrs->dryRun) { + /* a is already set to the first new bus and slot 1 */ + if (qemuDomainPCIAddressSetGrow(addrs, &a) < 0) + return -1; + goto success; + } else { + /* Check the buses from 0 up to the last used one */ + for (a.bus = 0; a.bus <= addrs->lastaddr.bus; a.bus++) { + for (a.slot = 1; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) { + if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success; - addrs->lastaddr = tmp_addr; - *next_addr = tmp_addr; - return 0; + VIR_DEBUG("PCI slot %.4x:%.2x:%.2x already in use", + a.domain, a.bus, a.slot); + } + + } } virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("No more available PCI addresses")); return -1; + +success: + VIR_DEBUG("Found free PCI slot %.4x:%.2x:%.2x", + a.domain, a.bus, a.slot); + *next_addr = a; + return 0; } int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, @@ -1566,8 +1672,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; @@ -1741,6 +1849,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; @@ -1780,9 +1900,10 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* Device controllers (SCSI, USB, but not IDE, FDC or CCID) */ for (i = 0; i < def->ncontrollers ; i++) { - /* PCI root has no address */ + /* 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) @@ -1972,16 +2093,29 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, } } - /* XXX - * When QEMU grows support for > 1 PCI bus, then pci.0 changes - * to pci.1, pci.2, etc - * When QEMU grows support for > 1 PCI domain, then pci.0 change - * to pciNN.0 where NN is the domain number + /* + * PCI bridge support is required for multiple buses + * 'pci.%u' is the ID of the bridge as specified in + * qemuBuildControllerDevStr + * + * PCI_MULTIBUS capability indicates that the implicit + * PCI bus is named 'pci.0' instead of 'pci'. */ - 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) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index b05510b..5f04001 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -197,7 +197,8 @@ int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, virDomainObjPtr obj); qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, - unsigned int nbuses); + unsigned int nbuses, + bool dryRun); int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr addr); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.args b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.args new file mode 100644 index 0000000..b346c72 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.args @@ -0,0 +1,12 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/libexec/qemu-kvm -S -M pc-1.2 -m 2048 -smp 2 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -boot c \ +-device pci-bridge,chassis_nr=1,id=pci.1,bus=pci.0,addr=0x3 \ +-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.0,addr=0x4 \ +-device pci-bridge,chassis_nr=3,id=pci.3,bus=pci.0,addr=0x5 \ +-device pci-bridge,chassis_nr=4,id=pci.4,bus=pci.0,addr=0x6 \ +-device pci-bridge,chassis_nr=5,id=pci.5,bus=pci.0,addr=0x7 \ +-device pci-bridge,chassis_nr=6,id=pci.6,bus=pci.0,addr=0x8 \ +-device pci-bridge,chassis_nr=7,id=pci.7,bus=pci.0,addr=0x9 \ +-usb -cdrom /var/iso/f18kde.iso \ +-device virtio-balloon-pci,id=balloon0,bus=pci.7,addr=0x6 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.xml new file mode 100644 index 0000000..92db5e6 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.xml @@ -0,0 +1,44 @@ +<domain type='qemu'> + <name>fdr-br</name> + <uuid>3ec6cbe1-b5a2-4515-b800-31a61855df41</uuid> + <memory unit='KiB'>2097152</memory> + <currentMemory unit='KiB'>2097152</currentMemory> + <vcpu placement='static' cpuset='0-1'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/libexec/qemu-kvm</emulator> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/iso/f18kde.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <input type='mouse' bus='ps2'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x07' slot='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.args b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.args new file mode 100644 index 0000000..bd2706e --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.args @@ -0,0 +1,13 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/libexec/qemu-kvm -S -M pc-1.2 -m 2048 -smp 2 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -boot c \ +-device pci-bridge,chassis_nr=8,id=pci.8,bus=pci.0,addr=0x3 \ +-device pci-bridge,chassis_nr=1,id=pci.1,bus=pci.0,addr=0x4 \ +-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.0,addr=0x5 \ +-device pci-bridge,chassis_nr=3,id=pci.3,bus=pci.0,addr=0x6 \ +-device pci-bridge,chassis_nr=4,id=pci.4,bus=pci.0,addr=0x7 \ +-device pci-bridge,chassis_nr=5,id=pci.5,bus=pci.0,addr=0x8 \ +-device pci-bridge,chassis_nr=6,id=pci.6,bus=pci.0,addr=0x9 \ +-device pci-bridge,chassis_nr=7,id=pci.7,bus=pci.0,addr=0xa \ +-usb -cdrom /var/iso/f18kde.iso \ +-device virtio-balloon-pci,id=balloon0,bus=pci.4,addr=0x6 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.xml new file mode 100644 index 0000000..f6a3ddf --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.xml @@ -0,0 +1,45 @@ +<domain type='qemu'> + <name>fdr-br</name> + <uuid>3ec6cbe1-b5a2-4515-b800-31a61855df41</uuid> + <memory unit='KiB'>2097152</memory> + <currentMemory unit='KiB'>2097152</currentMemory> + <vcpu placement='static' cpuset='0-1'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/libexec/qemu-kvm</emulator> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/iso/f18kde.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='8' model='pci-bridge'/> + <input type='mouse' bus='ps2'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x04' slot='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml new file mode 100644 index 0000000..eb20328 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml @@ -0,0 +1,210 @@ +<domain type='qemu'> + <name>fdr-br</name> + <uuid>3ec6cbe1-b5a2-4515-b800-31a61855df41</uuid> + <memory unit='KiB'>2097152</memory> + <currentMemory unit='KiB'>2097152</currentMemory> + <vcpu placement='static' cpuset='0-1'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/libexec/qemu-kvm</emulator> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/iso/f18kde.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <controller type='pci' index='1' model='pci-bridge'/> + <controller type='pci' index='2' model='pci-bridge'/> + <interface type='network'> + <mac address='52:54:00:f1:95:51'/> + <source network='default'/> + <model type='rtl8139'/> + </interface> + <interface type='network'> + <mac address='52:54:00:5c:c6:1a'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:39:97:ac'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:45:28:cb'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:ee:b9:a8'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:a9:f7:17'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:df:2b:f3'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:78:94:b4'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:6b:9b:06'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:17:df:bc'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:3b:d0:51'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:8d:2d:17'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:a7:66:af'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:54:ab:d7'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:1f:99:90'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:c8:43:87'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:df:22:b2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:d2:9a:47'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:86:05:e2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:8c:1c:c2'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:48:58:92'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:99:e5:bf'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:b1:8c:25'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:60:e0:d0'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:37:00:6a'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:c7:c8:ad'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:4e:a7:cf'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:00:79:69'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:47:00:6f'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:2a:8c:8b'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:ec:d5:e3'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <interface type='network'> + <mac address='52:54:00:7e:6e:c8'/> + <source network='default'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='9216' heads='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index ae73509..955400a 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -949,6 +949,9 @@ mymain(void) DO_TEST("tpm-passthrough", QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH, QEMU_CAPS_DEVICE_TPM_TIS); + DO_TEST("pci-autoadd-addr", QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_PCI_BRIDGE); + DO_TEST("pci-autoadd-idx", QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_PCI_BRIDGE); + virObjectUnref(driver.config); virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-addr.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-addr.xml new file mode 100644 index 0000000..13f0f5d --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-addr.xml @@ -0,0 +1,44 @@ +<domain type='qemu'> + <name>fdr-br</name> + <uuid>3ec6cbe1-b5a2-4515-b800-31a61855df41</uuid> + <memory unit='KiB'>2097152</memory> + <currentMemory unit='KiB'>2097152</currentMemory> + <vcpu placement='static' cpuset='0-1'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/libexec/qemu-kvm</emulator> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/iso/f18kde.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x07' slot='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-idx.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-idx.xml new file mode 100644 index 0000000..8748437 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pci-autoadd-idx.xml @@ -0,0 +1,45 @@ +<domain type='qemu'> + <name>fdr-br</name> + <uuid>3ec6cbe1-b5a2-4515-b800-31a61855df41</uuid> + <memory unit='KiB'>2097152</memory> + <currentMemory unit='KiB'>2097152</currentMemory> + <vcpu placement='static' cpuset='0-1'>2</vcpu> + <os> + <type arch='x86_64' machine='pc-1.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/libexec/qemu-kvm</emulator> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/iso/f18kde.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='8' model='pci-bridge'/> + <controller type='pci' index='0' model='pci-root'/> + <video> + <model type='cirrus' vram='9216' heads='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </video> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x04' slot='0x06' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 7434190..5ae7c3b 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -276,6 +276,9 @@ mymain(void) DO_TEST_DIFFERENT("metadata"); DO_TEST("tpm-passthrough"); + DO_TEST("pci-bridge"); + DO_TEST_DIFFERENT("pci-autoadd-addr"); + DO_TEST_DIFFERENT("pci-autoadd-idx"); virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); -- 1.8.1.5

On 04/23/2013 06:47 AM, 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. ---
v4: Moved the check for duplicate controller indexes to a separate patch Simplified nbuses and max_idx computation Only does two-pass allocation of PCI addresses if the machine has a PCI bus Does not contain traces of rebasing or spurious whitespace changes Tests auto-adding PCI bridges in xml->argv and xml->xml tests.
@@ -1233,9 +1236,45 @@ 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")); + } else { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Slot 0 on bus 0 is reserved for the host bridge"));
Indentation is off.
@@ -1326,15 +1368,53 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + int max_idx = -1;
So let's trace what happens if I have XML with no <controller> but I do use 33 PCI devices and have a capable qemu: max_idx starts at -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) - nbuses++; + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (def->controllers[i]->idx > max_idx) + max_idx = def->controllers[i]->idx; + } + }
If no controllers were specified, it is still at -1,
+ + nbuses = max_idx + 1;
so nbuses is now 0,
+ + if (nbuses > 0 && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) {
therefore we skip this if,
+ virDomainDeviceInfo info; + /* 1st pass to figure out how many PCI bridges we need */ + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true))) + goto cleanup; + if (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; + } + nbuses = addrs->nbuses; + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + + } else if (max_idx > 0) {
we don't error out,
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridges are not supported " + "by this QEMU binary")); + goto cleanup; }
but we also didn't auto-instantiate any bridges, even if the capability is supported. Is that a problem? ACK if you can answer my question and fix the minor issues. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 04/25/2013 02:39 AM, Eric Blake wrote:
On 04/23/2013 06:47 AM, Ján Tomko wrote:
@@ -1326,15 +1368,53 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, qemuDomainObjPrivatePtr priv = NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + int max_idx = -1;
So let's trace what happens if I have XML with no <controller> but I do use 33 PCI devices and have a capable qemu:
max_idx starts at -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) - nbuses++; + if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + if (def->controllers[i]->idx > max_idx) + max_idx = def->controllers[i]->idx; + } + }
If no controllers were specified, it is still at -1,
+ + nbuses = max_idx + 1;
so nbuses is now 0,
+ + if (nbuses > 0 && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) {
therefore we skip this if,
+ virDomainDeviceInfo info; + /* 1st pass to figure out how many PCI bridges we need */ + if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true))) + goto cleanup; + if (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; + } + nbuses = addrs->nbuses; + qemuDomainPCIAddressSetFree(addrs); + addrs = NULL; + + } else if (max_idx > 0) {
we don't error out,
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PCI bridges are not supported " + "by this QEMU binary")); + goto cleanup; }
but we also didn't auto-instantiate any bridges, even if the capability is supported. Is that a problem?
No, if the machine has no buses, we would have no place to put the bridge in. (Unless it's a PCI express machine, but libvirt doesn't know how to use those yet) And we'll error out anyway with: error: XML error: No PCI buses available either in GetNextSlot called by AssignPCISlots for devices without an address, or in PCIAddressValidate called by CollectPCIAddress for explicitly specified PCI addresses. Jan

Reject multiple controllers with the same index, except for USB controllers. Multi-function USB controllers can have the same index. --- src/conf/domain_conf.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5740009..dd9beba 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2574,6 +2574,68 @@ virDomainDeviceInfoIterate(virDomainDefPtr def, static int +virDomainDefRejectDuplicateControllers(virDomainDefPtr def) +{ + int max_idx[VIR_DOMAIN_CONTROLLER_TYPE_LAST]; + virDomainControllerDefPtr cont; + virBitmapPtr *bitmaps = NULL; + size_t nbitmaps = 0; + int ret = -1; + bool b; + int i; + + if (VIR_ALLOC_N(bitmaps, VIR_DOMAIN_CONTROLLER_TYPE_LAST) < 0) + goto no_memory; + + for (i = 0; i < VIR_DOMAIN_CONTROLLER_TYPE_LAST; i++) + max_idx[i] = -1; + + for (i = 0; i < def->ncontrollers; i++) { + cont = def->controllers[i]; + if (cont->idx > max_idx[cont->type]) + max_idx[cont->type] = cont->idx; + } + + /* multiple USB controllers with the same index are allowed */ + max_idx[VIR_DOMAIN_CONTROLLER_TYPE_USB] = -1; + + for (i = 0; i < VIR_DOMAIN_CONTROLLER_TYPE_LAST; i++) { + if (max_idx[i] >= 0 && !(bitmaps[i] = virBitmapNew(max_idx[i] + 1))) + goto no_memory; + nbitmaps++; + } + + for (i = 0; i < def->ncontrollers; i++) { + cont = def->controllers[i]; + + if (max_idx[cont->type] == -1) + continue; + + ignore_value(virBitmapGetBit(bitmaps[cont->type], cont->idx, &b)); + if (b) { + virReportError(VIR_ERR_XML_ERROR, + _("Multiple '%s' controllers with index '%d'"), + virDomainControllerTypeToString(cont->type), + cont->idx); + goto cleanup; + } + ignore_value(virBitmapSetBit(bitmaps[cont->type], cont->idx)); + } + + ret = 0; +cleanup: + for (i = 0; i < nbitmaps; i++) + virBitmapFree(bitmaps[i]); + VIR_FREE(bitmaps); + return ret; + +no_memory: + virReportOOMError(); + goto cleanup; +} + + +static int virDomainDefPostParseInternal(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED) { @@ -2653,6 +2715,8 @@ virDomainDefPostParseInternal(virDomainDefPtr def, } } + if (virDomainDefRejectDuplicateControllers(def) < 0) + return -1; return 0; no_memory: -- 1.8.1.5

On 04/23/2013 06:47 AM, Ján Tomko wrote:
Reject multiple controllers with the same index, except for USB controllers. Multi-function USB controllers can have the same index. --- src/conf/domain_conf.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5740009..dd9beba 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2574,6 +2574,68 @@ virDomainDeviceInfoIterate(virDomainDefPtr def,
static int +virDomainDefRejectDuplicateControllers(virDomainDefPtr def) +{ + int max_idx[VIR_DOMAIN_CONTROLLER_TYPE_LAST]; + virDomainControllerDefPtr cont; + virBitmapPtr *bitmaps = NULL; + size_t nbitmaps = 0; + int ret = -1; + bool b; + int i; + + if (VIR_ALLOC_N(bitmaps, VIR_DOMAIN_CONTROLLER_TYPE_LAST) < 0) + goto no_memory;
Why do you stack allocate an array of max_idx, but heap allocate an array of bitmap pointers? It should be possible to stack allocate both arrays, without exceeding max stack bounds, since VIR_DOMAIN_CONTROLLER_TYPE_LAST is small.
+ + for (i = 0; i < VIR_DOMAIN_CONTROLLER_TYPE_LAST; i++) + max_idx[i] = -1;
Would a memset be any faster than a for loop here? What you have is correct, so I'm comfortable giving ACK, but if you want to post a v5 with the tweaks I mentioned, I'll review that too. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 22.04.2013 20:43, 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 | 26 ++- src/qemu/qemu_command.c | 211 +++++++++++++++++---- src/qemu/qemu_command.h | 4 +- tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml | 210 ++++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 5 files changed, 411 insertions(+), 41 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pci-bridge.xml
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3787ff1..ec7d0e6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c
@@ -1519,41 +1609,58 @@ void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) VIR_FREE(addrs); }
- static int qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, virDevicePCIAddressPtr next_addr) { - virDevicePCIAddress tmp_addr = addrs->lastaddr; - int i; - char *addr; + virDevicePCIAddress a = addrs->lastaddr;
- 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; - } + if (addrs->nbuses == 0) { + virReportError(VIR_ERR_XML_ERROR, "%s", _("No PCI buses available")); + return -1; + }
- if (!(addr = qemuPCIAddressAsString(&tmp_addr))) - return -1; + /* Start the search at the last used bus and slot */ + for (a.slot++; a.bus < addrs->nbuses; a.bus++) { + for ( ; a.slot < QEMU_PCI_ADDRESS_SLOT_LAST; a.slot++) {
I know I am too late, but this causes 'make syntax-check' fail. I've just pushed trivial patch for that.
+ if (!qemuDomainPCIAddressSlotInUse(addrs, &a)) + goto success;
Michal

On 04/22/2013 08:43 PM, Ján Tomko wrote:
Add new 'pci' controller type with two models: pci-root - auto-added to machines with implicit pci bus pci-bridge - auto-added if the devices would not leave at least one slot empty on bus 0 or bus >0 is specified
v3: moved the implicit PCI root addition to qemu's post parse callback, added an xml -> xml test and schema validation rewrote implicit controller removal and search for free slots check for multiple pci controllers with the same index added documentation
Ján Tomko (4): qemu: call post-parse callbacks when parsing command line too conf: add PCI controllers qemu: auto-add pci-root controller for pc machine types qemu: auto-add bridges and allow using them
liguang (1): qemu: build command line for pci-bridge device
I've pushed patches 1-5 and sent another version of patch 6 - "conf: reject controllers with duplicate indexes" separately. Thank you for your reviews. Jan
participants (4)
-
Eric Blake
-
Ján Tomko
-
Laine Stump
-
Michal Privoznik