[libvirt] [PATCH v2 0/9] Support qemu-system-arm vexpress-a9

This series adds the bits needed to kick of a qemu-system-arm -machine vexpress-a9 guest. vexpress-a15 likely works as well but is untested. Patches 1-3 are related bugfixes/improvements. Patch 7 adds disk bus=sd, which is often the only way to specify storage for ARM boards. Patch 9 adds virtio-mmio address support, which enables virtio for ARM vexpress machine types. The rest are mostly about fixing CLI generations. Unfortunately qemu ARM boards don't quite work like x86 where we can mix and match devices, so -device is out of the picture (for non-virtio), meaning we have to fall back to CLI infrastrucure like -net nic and -serial. v2: Rebased series Drop patches applied with Laine's series Add patch 1 and 3 Clarify caveats in a few patch descriptions Cole Robinson (9): qemu: Set QEMU_AUDIO_DRV=none with -nographic qemu: Only setup vhost if virtType == "kvm" domain_conf: Add default memballon in PostParse callbacks qemu: Don't add default memballoon device on ARM qemu: Fix adding specifying char devs for ARM qemu: Don't try to allocate PCI addresses for ARM domain_conf: Add disk bus=sd, wire it up for qemu qemu: Fix networking for ARM guests qemu: Support virtio-mmio transport for virtio on ARM docs/formatdomain.html.in | 3 +- docs/schemas/domaincommon.rng | 20 ++++ src/conf/domain_conf.c | 30 +++-- src/conf/domain_conf.h | 2 + src/qemu/qemu_capabilities.c | 22 ++++ src/qemu/qemu_capabilities.h | 5 + src/qemu/qemu_command.c | 131 +++++++++++++++++---- src/qemu/qemu_domain.c | 32 ++++- src/qemu/qemu_process.c | 37 +++--- src/xen/xen_driver.c | 9 ++ .../qemuxml2argv-arm-vexpressa9-basic.args | 8 ++ .../qemuxml2argv-arm-vexpressa9-basic.xml | 34 ++++++ .../qemuxml2argv-arm-vexpressa9-nodevs.args | 5 + .../qemuxml2argv-arm-vexpressa9-nodevs.xml | 26 ++++ .../qemuxml2argv-arm-vexpressa9-virtio.args | 14 +++ .../qemuxml2argv-arm-vexpressa9-virtio.xml | 45 +++++++ .../qemuxml2argv-balloon-device-auto.args | 3 +- .../qemuxml2argv-balloon-device-period.args | 3 +- .../qemuxml2argv-balloon-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-bios.args | 2 +- .../qemuxml2argv-blkdeviotune.args | 3 +- .../qemuxml2argv-blkiotune-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-blkiotune.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-cdrom.args | 3 +- .../qemuxml2argv-boot-complex-bootindex.args | 2 +- .../qemuxml2argv-boot-complex.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.args | 3 +- ...xml2argv-boot-menu-disable-drive-bootindex.args | 3 +- .../qemuxml2argv-boot-menu-disable-drive.args | 3 +- .../qemuxml2argv-boot-menu-disable.args | 3 +- .../qemuxml2argv-boot-menu-enable.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-multi.args | 3 +- .../qemuxml2argv-boot-network.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-boot-order.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-bootloader.args | 3 +- .../qemuxml2argv-channel-guestfwd.args | 3 +- .../qemuxml2argv-channel-virtio-auto.args | 3 +- .../qemuxml2argv-channel-virtio.args | 3 +- .../qemuxml2argv-clock-france.args | 4 +- .../qemuxml2argv-clock-localtime.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-clock-utc.args | 3 +- .../qemuxml2argv-clock-variable.args | 3 +- .../qemuxml2argv-console-compat-auto.args | 3 +- .../qemuxml2argv-console-compat-chardev.args | 3 +- .../qemuxml2argv-console-compat.args | 3 +- .../qemuxml2argv-console-sclp.args | 3 +- .../qemuxml2argv-console-virtio-ccw.args | 3 +- .../qemuxml2argv-console-virtio-many.args | 3 +- .../qemuxml2argv-console-virtio-s390.args | 3 +- .../qemuxml2argv-console-virtio.args | 3 +- .../qemuxml2argv-cpu-eoi-disabled.args | 3 +- .../qemuxml2argv-cpu-eoi-enabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact1.args | 3 +- .../qemuxml2argv-cpu-exact2-nofallback.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-exact2.args | 3 +- .../qemuxml2argv-cpu-fallback.args | 2 +- .../qemuxml2argv-cpu-host-kvmclock.args | 3 +- .../qemuxml2argv-cpu-host-model-fallback.args | 2 +- .../qemuxml2argv-cpu-host-model.args | 2 +- .../qemuxml2argv-cpu-host-passthrough.args | 2 +- .../qemuxml2argv-cpu-kvmclock.args | 3 +- .../qemuxml2argv-cpu-minimum1.args | 3 +- .../qemuxml2argv-cpu-minimum2.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-cpu-strict1.args | 3 +- .../qemuxml2argv-cpu-topology1.args | 3 +- .../qemuxml2argv-cpu-topology2.args | 3 +- .../qemuxml2argv-cpu-topology3.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-cputune.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 3 +- .../qemuxml2argv-disk-blockio.args | 2 +- .../qemuxml2argv-disk-cdrom-empty.args | 3 +- ...qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 3 +- .../qemuxml2argv-disk-cdrom-tray.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-cdrom.args | 3 +- .../qemuxml2argv-disk-copy_on_read.args | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.args | 3 +- .../qemuxml2argv-disk-drive-boot-disk.args | 3 +- .../qemuxml2argv-disk-drive-cache-directsync.args | 3 +- .../qemuxml2argv-disk-drive-cache-unsafe.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-none.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-wb.args | 3 +- .../qemuxml2argv-disk-drive-cache-v1-wt.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-none.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-wb.args | 3 +- .../qemuxml2argv-disk-drive-cache-v2-wt.args | 3 +- .../qemuxml2argv-disk-drive-discard.args | 2 +- ...uxml2argv-disk-drive-error-policy-enospace.args | 3 +- .../qemuxml2argv-disk-drive-error-policy-stop.args | 3 +- ...gv-disk-drive-error-policy-wreport-rignore.args | 3 +- .../qemuxml2argv-disk-drive-fat.args | 3 +- .../qemuxml2argv-disk-drive-fmt-qcow.args | 3 +- .../qemuxml2argv-disk-drive-network-gluster.args | 3 +- ...qemuxml2argv-disk-drive-network-iscsi-auth.args | 3 +- .../qemuxml2argv-disk-drive-network-iscsi-lun.args | 2 +- .../qemuxml2argv-disk-drive-network-iscsi.args | 3 +- ...qemuxml2argv-disk-drive-network-nbd-export.args | 3 +- ...ml2argv-disk-drive-network-nbd-ipv6-export.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd-ipv6.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd-unix.args | 3 +- .../qemuxml2argv-disk-drive-network-nbd.args | 3 +- .../qemuxml2argv-disk-drive-network-rbd-auth.args | 2 +- ...muxml2argv-disk-drive-network-rbd-ceph-env.args | 4 +- .../qemuxml2argv-disk-drive-network-rbd-ipv6.args | 2 +- .../qemuxml2argv-disk-drive-network-rbd.args | 2 +- .../qemuxml2argv-disk-drive-network-sheepdog.args | 3 +- .../qemuxml2argv-disk-drive-no-boot.args | 2 +- .../qemuxml2argv-disk-drive-readonly-disk.args | 3 +- ...qemuxml2argv-disk-drive-readonly-no-device.args | 3 +- .../qemuxml2argv-disk-drive-shared.args | 3 +- ...emuxml2argv-disk-floppy-tray-no-device-cap.args | 3 +- .../qemuxml2argv-disk-floppy-tray.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-floppy.args | 3 +- .../qemuxml2argv-disk-geometry.args | 3 +- .../qemuxml2argv-disk-ide-drive-split.args | 2 +- .../qemuxml2argv-disk-ide-wwn.args | 2 +- .../qemuxml2argv-disk-ioeventfd.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-many.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-disk-order.args | 3 +- .../qemuxml2argv-disk-sata-device.args | 3 +- .../qemuxml2argv-disk-scsi-device-auto.args | 3 +- .../qemuxml2argv-disk-scsi-device.args | 3 +- .../qemuxml2argv-disk-scsi-disk-split.args | 2 +- .../qemuxml2argv-disk-scsi-disk-vpd.args | 2 +- .../qemuxml2argv-disk-scsi-disk-wwn.args | 2 +- .../qemuxml2argv-disk-scsi-lun-passthrough.args | 3 +- .../qemuxml2argv-disk-scsi-megasas.args | 3 +- .../qemuxml2argv-disk-scsi-virtio-scsi.args | 3 +- .../qemuxml2argv-disk-scsi-vscsi.args | 3 +- .../qemuxml2argv-disk-snapshot.args | 3 +- .../qemuxml2argv-disk-usb-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-disk-usb.args | 3 +- .../qemuxml2argv-disk-virtio-ccw-many.args | 3 +- .../qemuxml2argv-disk-virtio-ccw.args | 3 +- .../qemuxml2argv-disk-virtio-s390.args | 3 +- .../qemuxml2argv-disk-virtio-scsi-ccw.args | 3 +- .../qemuxml2argv-disk-virtio-scsi-num_queues.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.args | 3 +- .../qemuxml2argv-eoi-disabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.args | 2 +- .../qemuxml2argv-floppy-drive-fat.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-fs9p.args | 3 +- .../qemuxml2argv-graphics-vnc-sasl.args | 3 +- .../qemuxml2argv-graphics-vnc-tls.args | 3 +- .../qemuxml2argv-graphics-vnc-websocket.args | 3 +- .../qemuxml2argv-hostdev-pci-address-device.args | 3 +- .../qemuxml2argv-hostdev-pci-address.args | 3 +- .../qemuxml2argv-hostdev-scsi-boot.args | 3 +- .../qemuxml2argv-hostdev-scsi-lsi.args | 3 +- .../qemuxml2argv-hostdev-scsi-readonly.args | 3 +- .../qemuxml2argv-hostdev-scsi-virtio-scsi.args | 3 +- ...muxml2argv-hostdev-usb-address-device-boot.args | 3 +- .../qemuxml2argv-hostdev-usb-address-device.args | 3 +- .../qemuxml2argv-hostdev-usb-address.args | 3 +- .../qemuxml2argv-hostdev-vfio.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-hugepages.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-hyperv-off.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-hyperv.args | 3 +- .../qemuxml2argv-input-usbmouse-addr.args | 3 +- .../qemuxml2argv-input-usbmouse.args | 3 +- .../qemuxml2argv-input-usbtablet.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-kvm.args | 2 +- .../qemuxml2argv-kvmclock+eoi-disabled.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-kvmclock.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-lease.args | 3 +- .../qemuxml2argv-machine-aliases1.args | 2 +- .../qemuxml2argv-machine-aliases2.args | 3 +- .../qemuxml2argv-machine-core-off.args | 3 +- .../qemuxml2argv-machine-core-on.args | 3 +- .../qemuxml2argv-machine-usb-opt.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-memtune.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-metadata.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-migrate.args | 3 +- .../qemuxml2argv-minimal-s390.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-minimal.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.args | 3 +- .../qemuxml2argv-misc-disable-s3.args | 3 +- .../qemuxml2argv-misc-disable-suspends.args | 3 +- .../qemuxml2argv-misc-enable-s4.args | 3 +- .../qemuxml2argv-misc-no-reboot.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args | 2 +- .../qemuxml2argv-mlock-unsupported.args | 2 +- .../qemuxml2argv-monitor-json.args | 3 +- .../qemuxml2argv-multifunction-pci-device.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-client.args | 3 +- .../qemuxml2argv-net-eth-ifname.args | 3 +- .../qemuxml2argv-net-eth-names.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-eth.args | 3 +- .../qemuxml2argv-net-hostdev-vfio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-hostdev.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-mcast.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-server.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-net-user.args | 3 +- .../qemuxml2argv-net-virtio-ccw.args | 3 +- .../qemuxml2argv-net-virtio-device.args | 3 +- .../qemuxml2argv-net-virtio-netdev.args | 3 +- .../qemuxml2argv-net-virtio-s390.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-virtio.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-no-shutdown.args | 2 +- .../qemuxml2argv-nographics-vga.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-nographics.args | 3 +- .../qemuxml2argv-nosharepages.args | 3 +- ...qemuxml2argv-numad-auto-memory-vcpu-cpuset.args | 3 +- ...d-auto-memory-vcpu-no-cpuset-and-placement.args | 3 +- ...muxml2argv-numad-auto-vcpu-static-numatune.args | 3 +- ...qemuxml2argv-numad-static-memory-auto-vcpu.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-numad.args | 3 +- .../qemuxml2argv-numatune-memory.args | 3 +- .../qemuxml2argv-parallel-parport-chardev.args | 3 +- .../qemuxml2argv-parallel-tcp-chardev.args | 3 +- .../qemuxml2argv-parallel-tcp.args | 3 +- .../qemuxml2argv-pci-autoadd-addr.args | 2 +- .../qemuxml2argv-pci-autoadd-idx.args | 2 +- .../qemuxml2argv-pci-bridge-many-disks.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-pcie-root.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 2 +- .../qemuxml2argv-pseries-basic.args | 2 +- .../qemuxml2argv-pseries-nvram.args | 3 +- .../qemuxml2argv-pseries-usb-default.args | 2 +- .../qemuxml2argv-pseries-usb-multi.args | 2 +- .../qemuxml2argv-pseries-vio-user-assigned.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-pseries-vio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-q35.args | 2 +- .../qemuxml2argv-qemu-ns-no-env.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-qemu-ns.args | 4 +- .../qemuxml2argv-reboot-timeout-disabled.args | 3 +- .../qemuxml2argv-reboot-timeout-enabled.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-restore-v1.args | 3 +- .../qemuxml2argv-restore-v2-fd.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-restore-v2.args | 3 +- .../qemuxml2argv-s390-piix-controllers.args | 2 +- .../qemuxml2argv-s390-usb-none.args | 2 +- .../qemuxml2argv-seclabel-dynamic-baselabel.args | 3 +- .../qemuxml2argv-seclabel-dynamic-override.args | 3 +- .../qemuxml2argv-seclabel-dynamic.args | 3 +- .../qemuxml2argv-seclabel-none.args | 3 +- .../qemuxml2argv-seclabel-static-relabel.args | 3 +- .../qemuxml2argv-seclabel-static.args | 3 +- .../qemuxml2argv-serial-dev-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-dev.args | 3 +- .../qemuxml2argv-serial-file-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-file.args | 3 +- .../qemuxml2argv-serial-many-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-many.args | 3 +- .../qemuxml2argv-serial-pty-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-pty.args | 3 +- .../qemuxml2argv-serial-tcp-chardev.args | 3 +- .../qemuxml2argv-serial-tcp-telnet-chardev.args | 3 +- .../qemuxml2argv-serial-tcp-telnet.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-tcp.args | 3 +- .../qemuxml2argv-serial-udp-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-udp.args | 3 +- .../qemuxml2argv-serial-unix-chardev.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-serial-unix.args | 3 +- .../qemuxml2argv-serial-vc-chardev.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-serial-vc.args | 3 +- .../qemuxml2argv-smartcard-controller.args | 3 +- .../qemuxml2argv-smartcard-host-certificates.args | 3 +- .../qemuxml2argv-smartcard-host.args | 3 +- ...emuxml2argv-smartcard-passthrough-spicevmc.args | 3 +- .../qemuxml2argv-smartcard-passthrough-tcp.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-smbios.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-smp.args | 3 +- .../qemuxml2argv-sound-device.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-sound.args | 3 +- .../qemuxml2argv-tpm-passthrough.args | 2 +- .../qemuxml2argv-usb-controller.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-hub.args | 3 +- .../qemuxml2argv-usb-ich9-companion.args | 3 +- .../qemuxml2argv-usb-ich9-ehci-addr.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-none.args | 3 +- .../qemuxml2argv-usb-piix3-controller.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args | 3 +- .../qemuxml2argv-usb-redir-boot.args | 3 +- .../qemuxml2argv-usb-redir-filter.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args | 3 +- .../qemuxml2argvdata/qemuxml2argv-virtio-lun.args | 2 +- .../qemuxml2argv-virtio-rng-ccw.args | 3 +- .../qemuxml2argv-virtio-rng-default.args | 3 +- .../qemuxml2argv-virtio-rng-egd.args | 3 +- .../qemuxml2argv-virtio-rng-random.args | 3 +- .../qemuxml2argv-watchdog-device.args | 3 +- .../qemuxml2argv-watchdog-dump.args | 3 +- tests/qemuxml2argvdata/qemuxml2argv-watchdog.args | 3 +- tests/qemuxml2argvtest.c | 10 ++ .../qemuxmlns-qemu-ns-commandline-ns0.args | 2 +- .../qemuxmlns-qemu-ns-commandline-ns1.args | 2 +- .../qemuxmlns-qemu-ns-commandline.args | 2 +- .../qemuxmlns-qemu-ns-domain-commandline-ns0.args | 2 +- .../qemuxmlns-qemu-ns-domain-commandline.args | 2 +- .../qemuxmlns-qemu-ns-domain-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain.args | 2 +- tests/testutilsqemu.c | 33 ++++++ 300 files changed, 920 insertions(+), 344 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml -- 1.8.3.1

vhost only works in KVM mode at the moment, and is infact compiled out if the emulator is built for non-native architecture. While it may work at some point in the future for plain qemu, for now it's just noise on the command line (and which contributes to arm cli breakage). --- src/qemu/qemu_command.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 56e0809..8d3a65c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -441,8 +441,10 @@ qemuOpenVhostNet(virDomainDefPtr def, { size_t i; - /* If the config says explicitly to not use vhost, return now */ - if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) { + /* If running a plain QEMU guest, or + * if the config says explicitly to not use vhost, return now*/ + if (def->virtType != VIR_DOMAIN_VIRT_KVM || + net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) { *vhostfdSize = 0; return 0; } -- 1.8.3.1

On Sun, Aug 18, 2013 at 02:57:52PM -0400, Cole Robinson wrote:
vhost only works in KVM mode at the moment, and is infact compiled out if the emulator is built for non-native architecture. While it may work at some point in the future for plain qemu, for now it's just noise on the command line (and which contributes to arm cli breakage). --- src/qemu/qemu_command.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 56e0809..8d3a65c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -441,8 +441,10 @@ qemuOpenVhostNet(virDomainDefPtr def, { size_t i;
- /* If the config says explicitly to not use vhost, return now */ - if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) { + /* If running a plain QEMU guest, or + * if the config says explicitly to not use vhost, return now*/ + if (def->virtType != VIR_DOMAIN_VIRT_KVM || + net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) { *vhostfdSize = 0; return 0; }
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 08/19/2013 12:56 PM, Daniel P. Berrange wrote:
On Sun, Aug 18, 2013 at 02:57:52PM -0400, Cole Robinson wrote:
vhost only works in KVM mode at the moment, and is infact compiled out if the emulator is built for non-native architecture. While it may work at some point in the future for plain qemu, for now it's just noise on the command line (and which contributes to arm cli breakage). --- src/qemu/qemu_command.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 56e0809..8d3a65c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -441,8 +441,10 @@ qemuOpenVhostNet(virDomainDefPtr def, { size_t i;
- /* If the config says explicitly to not use vhost, return now */ - if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) { + /* If running a plain QEMU guest, or + * if the config says explicitly to not use vhost, return now*/ + if (def->virtType != VIR_DOMAIN_VIRT_KVM || + net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) { *vhostfdSize = 0; return 0; }
ACK
I've pushed this patch now. Thanks, Cole

This should be a no-op change for now. --- src/qemu/qemu_domain.c | 10 ++++++++++ src/xen/xen_driver.c | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 393af6b..8dc7675 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -784,6 +784,16 @@ qemuDomainDefPostParse(virDomainDefPtr def, return -1; } } + + if (!def->memballoon) { + virDomainMemballoonDefPtr memballoon; + if (VIR_ALLOC(memballoon) < 0) + return -1; + + memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; + def->memballoon = memballoon; + } + return 0; } diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index cb64de6..6cb4f4f 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -340,6 +340,15 @@ xenDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, STRNEQ(def->os.type, "hvm")) dev->data.chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN; + if (!def->memballoon) { + virDomainMemballoonDefPtr memballoon; + if (VIR_ALLOC(memballoon) < 0) + return -1; + + memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_XEN; + def->memballoon = memballoon; + } + return 0; } -- 1.8.3.1

On Sun, Aug 18, 2013 at 02:57:53PM -0400, Cole Robinson wrote:
This should be a no-op change for now. --- src/qemu/qemu_domain.c | 10 ++++++++++ src/xen/xen_driver.c | 9 +++++++++ 2 files changed, 19 insertions(+)
I would really expect this change to be removing the corresponding code from src/conf/domain_conf.c at the same time. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 08/18/2013 12:57 PM, Cole Robinson wrote:
This should be a no-op change for now.
s/memballon/memballoon/ in the subject -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

And add test cases for a basic working ARM guest. --- docs/schemas/domaincommon.rng | 19 +++++++++++++ src/conf/domain_conf.c | 14 --------- src/qemu/qemu_domain.c | 4 ++- .../qemuxml2argv-arm-vexpressa9-nodevs.args | 5 ++++ .../qemuxml2argv-arm-vexpressa9-nodevs.xml | 26 +++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ tests/testutilsqemu.c | 33 ++++++++++++++++++++++ 7 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index ac807e6..d875221 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -303,6 +303,7 @@ <ref name="hvmppc"/> <ref name="hvmppc64"/> <ref name="hvms390"/> + <ref name="hvmarm"/> </choice> </optional> <value>hvm</value> @@ -412,6 +413,24 @@ </optional> </group> </define> + <define name="hvmarm"> + <group> + <optional> + <attribute name="arch"> + <choice> + <value>armv7l</value> + </choice> + </attribute> + </optional> + <optional> + <attribute name="machine"> + <data type="string"> + <param name="pattern">[a-zA-Z0-9_\.\-]+</param> + </data> + </attribute> + </optional> + </group> + </define> <define name="osexe"> <element name="os"> <element name="type"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 12b68ea..13a3cac 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8812,7 +8812,6 @@ virDomainVideoDefaultRAM(virDomainDefPtr def, } } - int virDomainVideoDefaultType(virDomainDefPtr def) { @@ -12147,19 +12146,6 @@ virDomainDefParseXML(xmlDocPtr xml, def->memballoon = memballoon; VIR_FREE(nodes); - } else { - if (def->virtType == VIR_DOMAIN_VIRT_XEN || - def->virtType == VIR_DOMAIN_VIRT_QEMU || - def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) { - virDomainMemballoonDefPtr memballoon; - if (VIR_ALLOC(memballoon) < 0) - goto error; - memballoon->model = def->virtType == VIR_DOMAIN_VIRT_XEN ? - VIR_DOMAIN_MEMBALLOON_MODEL_XEN : - VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; - def->memballoon = memballoon; - } } /* Parse the RNG device */ diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 8dc7675..4f2e2c8 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -703,6 +703,7 @@ qemuDomainDefPostParse(virDomainDefPtr def, bool addImplicitSATA = false; bool addPCIRoot = false; bool addPCIeRoot = false; + bool addDefaultMemballoon = true; /* check for emulator and create a default one if needed */ if (!def->emulator && @@ -737,6 +738,7 @@ qemuDomainDefPostParse(virDomainDefPtr def, case VIR_ARCH_ARMV7L: addDefaultUSB = false; + addDefaultMemballoon = false; break; case VIR_ARCH_ALPHA: @@ -785,7 +787,7 @@ qemuDomainDefPostParse(virDomainDefPtr def, } } - if (!def->memballoon) { + if (addDefaultMemballoon && !def->memballoon) { virDomainMemballoonDefPtr memballoon; if (VIR_ALLOC(memballoon) < 0) return -1; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args new file mode 100644 index 0000000..794dba2 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \ +-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \ +-boot c -kernel /arm.kernel -initrd /arm.initrd \ +-append console=ttyAMA0,115200n8 -dtb /arm.dtb -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml new file mode 100644 index 0000000..3f318c8 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-nodevs.xml @@ -0,0 +1,26 @@ +<domain type="qemu"> + <name>armtest</name> + <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch="armv7l" machine="vexpress-a9">hvm</type> + <kernel>/arm.kernel</kernel> + <initrd>/arm.initrd</initrd> + <dtb>/arm.dtb</dtb> + <cmdline>console=ttyAMA0,115200n8</cmdline> + </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/bin/qemu-system-arm</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 679124e..4ffd378 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1037,6 +1037,9 @@ mymain(void) DO_TEST_PARSE_ERROR("pci-root-address", QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_PCI_BRIDGE); + DO_TEST("arm-vexpressa9-nodevs", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB); + virObjectUnref(driver.config); virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index fac83b2..92433ef 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -145,6 +145,36 @@ error: return -1; } +static int testQemuAddArmGuest(virCapsPtr caps) +{ + static const char *machines[] = { "vexpress-a9", + "vexpress-a15", + "versatilepb" }; + virCapsGuestMachinePtr *capsmachines = NULL; + virCapsGuestPtr guest; + + capsmachines = virCapabilitiesAllocMachines(machines, + ARRAY_CARDINALITY(machines)); + if (!capsmachines) + goto error; + + guest = virCapabilitiesAddGuest(caps, "hvm", VIR_ARCH_ARMV7L, + "/usr/bin/qemu-system-arm", NULL, + ARRAY_CARDINALITY(machines), + capsmachines); + if (!guest) + goto error; + + if (!virCapabilitiesAddGuestDomain(guest, "qemu", NULL, NULL, 0, NULL)) + goto error; + + return 0; + +error: + virCapabilitiesFreeMachines(capsmachines, ARRAY_CARDINALITY(machines)); + return -1; +} + virCapsPtr testQemuCapsInit(void) { virCapsPtr caps; @@ -270,6 +300,9 @@ virCapsPtr testQemuCapsInit(void) { if (testQemuAddS390Guest(caps)) goto cleanup; + if (testQemuAddArmGuest(caps)) + goto cleanup; + if (virTestGetDebug()) { char *caps_str; -- 1.8.3.1

On Sun, Aug 18, 2013 at 02:57:54PM -0400, Cole Robinson wrote:
And add test cases for a basic working ARM guest.
Does virtio-balloon not work on ARM ? I thought that was an architecture angostic device type.
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 12b68ea..13a3cac 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8812,7 +8812,6 @@ virDomainVideoDefaultRAM(virDomainDefPtr def, } }
- int virDomainVideoDefaultType(virDomainDefPtr def) { @@ -12147,19 +12146,6 @@ virDomainDefParseXML(xmlDocPtr xml,
def->memballoon = memballoon; VIR_FREE(nodes); - } else { - if (def->virtType == VIR_DOMAIN_VIRT_XEN || - def->virtType == VIR_DOMAIN_VIRT_QEMU || - def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) { - virDomainMemballoonDefPtr memballoon; - if (VIR_ALLOC(memballoon) < 0) - goto error; - memballoon->model = def->virtType == VIR_DOMAIN_VIRT_XEN ? - VIR_DOMAIN_MEMBALLOON_MODEL_XEN : - VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; - def->memballoon = memballoon; - }
This chunk I'd expect in the previous path. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 08/19/2013 01:00 PM, Daniel P. Berrange wrote:
On Sun, Aug 18, 2013 at 02:57:54PM -0400, Cole Robinson wrote:
And add test cases for a basic working ARM guest.
Does virtio-balloon not work on ARM ? I thought that was an architecture angostic device type.
It works, but only where virtio-mmio is available, which is not the case for most ARM boards and any QEMU < 1.6. Given those caveats, I figured it was better to never auto-add the device.
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 12b68ea..13a3cac 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8812,7 +8812,6 @@ virDomainVideoDefaultRAM(virDomainDefPtr def, } }
- int virDomainVideoDefaultType(virDomainDefPtr def) { @@ -12147,19 +12146,6 @@ virDomainDefParseXML(xmlDocPtr xml,
def->memballoon = memballoon; VIR_FREE(nodes); - } else { - if (def->virtType == VIR_DOMAIN_VIRT_XEN || - def->virtType == VIR_DOMAIN_VIRT_QEMU || - def->virtType == VIR_DOMAIN_VIRT_KQEMU || - def->virtType == VIR_DOMAIN_VIRT_KVM) { - virDomainMemballoonDefPtr memballoon; - if (VIR_ALLOC(memballoon) < 0) - goto error; - memballoon->model = def->virtType == VIR_DOMAIN_VIRT_XEN ? - VIR_DOMAIN_MEMBALLOON_MODEL_XEN : - VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO; - def->memballoon = memballoon; - }
This chunk I'd expect in the previous path.
My mistake, I'll fix that in the next repost. - Cole

QEMU ARM boards don't give us any way to explicitly wire in a -chardev, so use the old style -serial options. Unfortunately this isn't as simple as just turning off the CHARDEV flag for qemu-system-arm, as upcoming virtio support _will_ use device/chardev. --- src/qemu/qemu_capabilities.c | 18 ++++++++++++++++++ src/qemu/qemu_capabilities.h | 4 ++++ src/qemu/qemu_command.c | 3 +-- src/qemu/qemu_process.c | 37 ++++++++++++++++++++++--------------- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 47cc07a..9ee4ee5 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2812,3 +2812,21 @@ virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps) { return qemuCaps->usedQMP; } + +bool +virQEMUCapsSupportsChardev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainChrDefPtr chr ATTRIBUTE_UNUSED) +{ + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) || + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) + return false; + + /* This may not be true for all ARM machine types, but at least + * the only supported serial devices of vexpress and versatile + * don't have the -chardev property wired up. */ + if (def->os.arch != VIR_ARCH_ARMV7L) + return false; + + return true; +} diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 074e55d..220e59e 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -273,4 +273,8 @@ int virQEMUCapsParseDeviceStr(virQEMUCapsPtr qemuCaps, const char *str); VIR_ENUM_DECL(virQEMUCaps); bool virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps); +bool virQEMUCapsSupportsChardev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainChrDefPtr chr); + #endif /* __QEMU_CAPABILITIES_H__*/ diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 8d3a65c..ceab12c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8400,8 +8400,7 @@ qemuBuildCommandLine(virConnectPtr conn, char *devstr; /* Use -chardev with -device if they are available */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + if (virQEMUCapsSupportsChardev(def, qemuCaps, serial)) { virCommandAddArg(cmd, "-chardev"); if (!(devstr = qemuBuildChrChardevStr(&serial->source, serial->info.alias, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 31de759..fda91b2 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1582,22 +1582,25 @@ qemuProcessExtractTTYPath(const char *haystack, } static int -qemuProcessLookupPTYs(virDomainChrDefPtr *devices, +qemuProcessLookupPTYs(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainChrDefPtr *devices, int count, - virHashTablePtr paths, - bool chardevfmt) + virHashTablePtr paths) { size_t i; - const char *prefix = chardevfmt ? "char" : ""; for (i = 0; i < count; i++) { virDomainChrDefPtr chr = devices[i]; + bool chardevfmt = virQEMUCapsSupportsChardev(def, qemuCaps, chr); + if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { char id[32]; const char *path; if (snprintf(id, sizeof(id), "%s%s", - prefix, chr->info.alias) >= sizeof(id)) + chardevfmt ? "char" : "", + chr->info.alias) >= sizeof(id)) return -1; path = (const char *) virHashLookup(paths, id); @@ -1631,19 +1634,21 @@ qemuProcessFindCharDevicePTYsMonitor(virDomainObjPtr vm, virQEMUCapsPtr qemuCaps, virHashTablePtr paths) { - bool chardevfmt = virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV); size_t i = 0; - if (qemuProcessLookupPTYs(vm->def->serials, vm->def->nserials, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->serials, vm->def->nserials, + paths) < 0) return -1; - if (qemuProcessLookupPTYs(vm->def->parallels, vm->def->nparallels, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->parallels, vm->def->nparallels, + paths) < 0) return -1; - if (qemuProcessLookupPTYs(vm->def->channels, vm->def->nchannels, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->channels, vm->def->nchannels, + paths) < 0) return -1; /* For historical reasons, console[0] can be just an alias * for serial[0]. That's why we need to update it as well. */ @@ -1661,8 +1666,9 @@ qemuProcessFindCharDevicePTYsMonitor(virDomainObjPtr vm, } } - if (qemuProcessLookupPTYs(vm->def->consoles + i, vm->def->nconsoles - i, - paths, chardevfmt) < 0) + if (qemuProcessLookupPTYs(vm->def, qemuCaps, + vm->def->consoles + i, vm->def->nconsoles - i, + paths) < 0) return -1; return 0; @@ -1752,7 +1758,8 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver, virHashTablePtr paths = NULL; qemuDomainObjPrivatePtr priv; - if (!virQEMUCapsUsedQMP(qemuCaps) && pos != -1) { + if (!virQEMUCapsUsedQMP(qemuCaps) + && pos != -1) { if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0) return -1; -- 1.8.3.1

--- src/qemu/qemu_command.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ceab12c..aaff132 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1773,6 +1773,16 @@ cleanup: return ret; } +static bool +qemuDomainSupportsPCI(virDomainDefPtr def) { + if (def->os.arch != VIR_ARCH_ARMV7L) + return true; + + if (STREQ(def->os.machine, "versatilepb")) + return true; + + return false; +} int qemuDomainAssignPCIAddresses(virDomainDefPtr def, @@ -1838,8 +1848,10 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false))) goto cleanup; - if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) - goto cleanup; + if (qemuDomainSupportsPCI(def)) { + if (qemuAssignDevicePCISlots(def, qemuCaps, addrs) < 0) + goto cleanup; + } } if (obj && obj->privateData) { -- 1.8.3.1

This corresponds to '-sd' and '-drive if=sd' on the qemu command line. Needed for many ARM boards which don't provide any other way to pass in storage. --- docs/formatdomain.html.in | 3 ++- docs/schemas/domaincommon.rng | 1 + src/conf/domain_conf.c | 4 +++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 20 +++++++++++++++----- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 83d551a..5862893 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1664,7 +1664,8 @@ as a device ordering hint. The optional <code>bus</code> attribute specifies the type of disk device to emulate; possible values are driver specific, with typical values being - "ide", "scsi", "virtio", "xen", "usb" or "sata". If omitted, the bus + "ide", "scsi", "virtio", "xen", "usb", "sata", or + "sd" <span class="since">"sd" since 1.1.2</span>. If omitted, the bus type is inferred from the style of the device name (e.g. a device named 'sda' will typically be exported using a SCSI bus). The optional attribute <code>tray</code> indicates the tray status of the diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index d875221..b50451f 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1292,6 +1292,7 @@ <value>usb</value> <value>uml</value> <value>sata</value> + <value>sd</value> </choice> </attribute> </optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 13a3cac..6afa5e3 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -239,7 +239,8 @@ VIR_ENUM_IMPL(virDomainDiskBus, VIR_DOMAIN_DISK_BUS_LAST, "xen", "usb", "uml", - "sata") + "sata", + "sd") VIR_ENUM_IMPL(virDomainDiskCache, VIR_DOMAIN_DISK_CACHE_LAST, "default", @@ -17245,6 +17246,7 @@ virDiskNameToBusDeviceIndex(const virDomainDiskDefPtr disk, case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: + case VIR_DOMAIN_DISK_BUS_SD: default: *busIdx = 0; *devIdx = idx; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3e118d6..22b8e52 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -508,6 +508,7 @@ enum virDomainDiskBus { VIR_DOMAIN_DISK_BUS_USB, VIR_DOMAIN_DISK_BUS_UML, VIR_DOMAIN_DISK_BUS_SATA, + VIR_DOMAIN_DISK_BUS_SD, VIR_DOMAIN_DISK_BUS_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index aaff132..f1b1ad3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -73,7 +73,8 @@ VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST, "xen", "usb", "uml", - "sata") + "sata", + "sd") VIR_ENUM_DECL(qemuDiskCacheV1) @@ -646,6 +647,9 @@ static int qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk) case VIR_DOMAIN_DISK_BUS_XEN: ret = virAsprintf(&dev_name, "xenblk%d", devid); break; + case VIR_DOMAIN_DISK_BUS_SD: + ret = virAsprintf(&dev_name, "sd%d", devid); + break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported disk name mapping for bus '%s'"), @@ -3761,7 +3765,9 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, break; case VIR_DOMAIN_DISK_BUS_XEN: - /* Xen has no address type currently, so assign based on index */ + case VIR_DOMAIN_DISK_BUS_SD: + /* Xen and SD have no address type currently, so assign + * based on index */ break; } @@ -8097,12 +8103,13 @@ qemuBuildCommandLine(virConnectPtr conn, virCommandAddArg(cmd, "-drive"); /* Unfortunately it is not possible to use - -device for floppies, or Xen paravirt + -device for floppies, xen PV, or SD devices. Fortunately, those don't need static PCI addresses, so we don't really care that we can't use -device */ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN) { + if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN && + disk->bus != VIR_DOMAIN_DISK_BUS_SD) { withDeviceArg = true; } else { virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE); @@ -9788,6 +9795,8 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, def->bus = VIR_DOMAIN_DISK_BUS_VIRTIO; else if (STREQ(values[i], "xen")) def->bus = VIR_DOMAIN_DISK_BUS_XEN; + else if (STREQ(values[i], "sd")) + def->bus = VIR_DOMAIN_DISK_BUS_SD; } else if (STREQ(keywords[i], "media")) { if (STREQ(values[i], "cdrom")) { def->device = VIR_DOMAIN_DISK_DEVICE_CDROM; @@ -9937,7 +9946,8 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt, if (def->bus == VIR_DOMAIN_DISK_BUS_IDE) { ignore_value(VIR_STRDUP(def->dst, "hda")); - } else if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI) { + } else if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI || + def->bus == VIR_DOMAIN_DISK_BUS_SD) { ignore_value(VIR_STRDUP(def->dst, "sda")); } else if (def->bus == VIR_DOMAIN_DISK_BUS_VIRTIO) { ignore_value(VIR_STRDUP(def->dst, "vda")); -- 1.8.3.1

Similar to the chardev bit, ARM boards depend on the old style '-net nic' for actually instantiating net devices. But we can't block out -netdev altogether since it's needed for upcoming virtio support. And add tests for working ARM XML with console, disk, and networking. --- src/qemu/qemu_command.c | 34 ++++++++++++++++------ src/qemu/qemu_domain.c | 20 +++++++++++-- .../qemuxml2argv-arm-vexpressa9-basic.args | 8 +++++ .../qemuxml2argv-arm-vexpressa9-basic.xml | 34 ++++++++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ 5 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f1b1ad3..31c4945 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -417,6 +417,26 @@ cleanup: return ret; } +static bool +qemuDomainSupportsNicdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +{ + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) + return false; + + /* arm boards require legacy -net nic */ + if (def->os.arch == VIR_ARCH_ARMV7L) + return false; + + return true; +} + +static bool +qemuDomainSupportsNetdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +{ + if (!qemuDomainSupportsNicdev(def, qemuCaps)) + return false; + return virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV); +} /** * qemuOpenVhostNet: @@ -454,8 +474,7 @@ qemuOpenVhostNet(virDomainDefPtr def, * option), don't try to open the device. */ if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) { + qemuDomainSupportsNetdev(def, qemuCaps))) { if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("vhost-net is not supported with " @@ -7271,8 +7290,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, * * NB, no support for -netdev without use of -device */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + if (qemuDomainSupportsNetdev(def, qemuCaps)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -7280,7 +7298,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-netdev", host, NULL); } - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { + if (qemuDomainSupportsNicdev(def, qemuCaps)) { if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex, qemuCaps))) goto cleanup; virCommandAddArgList(cmd, "-device", nic, NULL); @@ -7289,8 +7307,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-net", nic, NULL); } - if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) { + if (!qemuDomainSupportsNetdev(def, qemuCaps)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -8292,8 +8309,7 @@ qemuBuildCommandLine(virConnectPtr conn, int vlan; /* VLANs are not used with -netdev, so don't record them */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) + if (qemuDomainSupportsNetdev(def, qemuCaps)) vlan = -1; else vlan = i; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 4f2e2c8..f554607 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -799,6 +799,23 @@ qemuDomainDefPostParse(virDomainDefPtr def, return 0; } +static const char * +qemuDomainDefaultNetModel(virDomainDefPtr def) { + if (def->os.arch == VIR_ARCH_S390 || + def->os.arch == VIR_ARCH_S390X) + return "virtio"; + + if (def->os.arch == VIR_ARCH_ARMV7L) { + if (STREQ(def->os.machine, "versatilepb")) + return "smc91c111"; + + /* Incomplete. vexpress (and a few others) use this, but not all + * arm boards */ + return "lan9118"; + } + + return "rtl8139"; +} static int qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, @@ -814,8 +831,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV && !dev->data.net->model) { if (VIR_STRDUP(dev->data.net->model, - def->os.arch == VIR_ARCH_S390 || - def->os.arch == VIR_ARCH_S390X ? "virtio" : "rtl8139") < 0) + qemuDomainDefaultNetModel(def)) < 0) goto cleanup; } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args new file mode 100644 index 0000000..a23fde4 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.args @@ -0,0 +1,8 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \ +-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \ +-boot c -kernel /arm.kernel -initrd /arm.initrd -append \ +'console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0' \ +-dtb /arm.dtb -usb -drive file=/arm.raw,if=sd,index=0 \ +-net nic,macaddr=52:54:00:09:a4:37,vlan=0,model=lan9118,name=net0 \ +-net user,vlan=0,name=hostnet0 -serial pty diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml new file mode 100644 index 0000000..ec9374f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-basic.xml @@ -0,0 +1,34 @@ +<domain type="qemu"> + <name>armtest</name> + <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch="armv7l" machine="vexpress-a9">hvm</type> + <kernel>/arm.kernel</kernel> + <initrd>/arm.initrd</initrd> + <dtb>/arm.dtb</dtb> + <cmdline>console=ttyAMA0,115200n8 rw root=/dev/mmcblk0p3 rootwait physmap.enabled=0</cmdline> + </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/bin/qemu-system-arm</emulator> + <disk type='file' device='disk'> + <source file='/arm.raw'/> + <target dev='sda' bus='sd'/> + </disk> + <interface type='user'> + <mac address='52:54:00:09:a4:37'/> + </interface> + <console type='pty'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 4ffd378..68520da 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1039,6 +1039,9 @@ mymain(void) DO_TEST("arm-vexpressa9-nodevs", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB); + DO_TEST("arm-vexpressa9-basic", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, + QEMU_CAPS_DRIVE); virObjectUnref(driver.config); virObjectUnref(driver.caps); -- 1.8.3.1

Starting with qemu 1.6, the qemu-system-arm vexpress-a9 model has a hardcoded virtio-mmio transport which enables attaching all virtio devices. On the command line, we have to use virtio-XXX-device rather than virtio-XXX-pci, thankfully s390 already set the precedent here so it's fairly straight forward. At the XML level, this adds a new device address type virtio-mmio. The controller and addressing don't have any subelements at the moment because we they aren't needed for this usecase, but could be added later if needed. Add a test case for an ARM guest with one of every virtio device enabled. --- src/conf/domain_conf.c | 12 +++- src/conf/domain_conf.h | 1 + src/qemu/qemu_capabilities.c | 16 ++++-- src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 65 +++++++++++++++++----- .../qemuxml2argv-arm-vexpressa9-virtio.args | 14 +++++ .../qemuxml2argv-arm-vexpressa9-virtio.xml | 45 +++++++++++++++ tests/qemuxml2argvtest.c | 4 ++ 8 files changed, 137 insertions(+), 21 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 6afa5e3..2dbcf92 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -210,7 +210,8 @@ VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST, "usb", "spapr-vio", "virtio-s390", - "ccw") + "ccw", + "virtio-mmio") VIR_ENUM_IMPL(virDomainDisk, VIR_DOMAIN_DISK_TYPE_LAST, "block", @@ -2388,6 +2389,7 @@ int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info, return 1; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: return 1; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: @@ -3029,6 +3031,9 @@ virDomainDeviceInfoFormat(virBufferPtr buf, info->addr.ccw.devno); break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + break; + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unknown address type '%d'"), info->type); @@ -3493,6 +3498,9 @@ virDomainDeviceInfoParseXML(xmlNodePtr node, goto cleanup; break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + break; + default: /* Should not happen */ virReportError(VIR_ERR_INTERNAL_ERROR, @@ -5749,6 +5757,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390 && + def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Controllers must use the 'pci' address type")); @@ -6360,6 +6369,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390 && + def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO && def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Network interfaces must use 'pci' address type")); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 22b8e52..fa0fdc2 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -207,6 +207,7 @@ enum virDomainDeviceAddressType { VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW, + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST }; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 9ee4ee5..e127ac8 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -235,6 +235,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "vnc-share-policy", /* 150 */ "device-del-event", "dmi-to-pci-bridge", + "virtio-mmio", ); struct _virQEMUCaps { @@ -1383,6 +1384,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "vfio-pci", QEMU_CAPS_DEVICE_VFIO_PCI }, { "scsi-generic", QEMU_CAPS_DEVICE_SCSI_GENERIC }, { "i82801b11-bridge", QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE }, + { "virtio-mmio", QEMU_CAPS_DEVICE_VIRTIO_MMIO }, }; static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = { @@ -2816,17 +2818,19 @@ virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps) bool virQEMUCapsSupportsChardev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, - virDomainChrDefPtr chr ATTRIBUTE_UNUSED) + virDomainChrDefPtr chr) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) return false; - /* This may not be true for all ARM machine types, but at least - * the only supported serial devices of vexpress and versatile - * don't have the -chardev property wired up. */ if (def->os.arch != VIR_ARCH_ARMV7L) - return false; + return true; - return true; + /* This may not be true for all ARM machine types, but at least + * the only supported non-virtio serial devices of vexpress and versatile + * don't have the -chardev property wired up. */ + return (chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO || + (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && + chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO)); } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 220e59e..1e16618 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -191,6 +191,7 @@ enum virQEMUCapsFlags { QEMU_CAPS_VNC_SHARE_POLICY = 150, /* set display sharing policy */ QEMU_CAPS_DEVICE_DEL_EVENT = 151, /* DEVICE_DELETED event */ QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE = 152, /* -device i82801b11-bridge */ + QEMU_CAPS_DEVICE_VIRTIO_MMIO = 153, /* -device virtio-mmio */ 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 31c4945..c880c60 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -418,22 +418,27 @@ cleanup: } static bool -qemuDomainSupportsNicdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +qemuDomainSupportsNicdev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainNetDefPtr net) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) return false; - /* arm boards require legacy -net nic */ - if (def->os.arch == VIR_ARCH_ARMV7L) + /* non-virtio ARM nics require legacy -net nic */ + if (def->os.arch == VIR_ARCH_ARMV7L && + net->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) return false; return true; } static bool -qemuDomainSupportsNetdev(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +qemuDomainSupportsNetdev(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + virDomainNetDefPtr net) { - if (!qemuDomainSupportsNicdev(def, qemuCaps)) + if (!qemuDomainSupportsNicdev(def, qemuCaps, net)) return false; return virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV); } @@ -474,7 +479,7 @@ qemuOpenVhostNet(virDomainDefPtr def, * option), don't try to open the device. */ if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) && - qemuDomainSupportsNetdev(def, qemuCaps))) { + qemuDomainSupportsNetdev(def, qemuCaps, net))) { if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("vhost-net is not supported with " @@ -1154,8 +1159,8 @@ cleanup: } static void -qemuDomainPrimeS390VirtioDevices(virDomainDefPtr def, - enum virDomainDeviceAddressType type) +qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr def, + enum virDomainDeviceAddressType type) { /* declare address-less virtio devices to be of address type 'type' @@ -1289,7 +1294,7 @@ qemuDomainAssignS390Addresses(virDomainDefPtr def, if (STREQLEN(def->os.machine, "s390-ccw", 8) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW)) { - qemuDomainPrimeS390VirtioDevices( + qemuDomainPrimeVirtioDeviceAddresses( def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW); if (!(addrs = qemuDomainCCWAddressSetCreate())) @@ -1304,7 +1309,7 @@ qemuDomainAssignS390Addresses(virDomainDefPtr def, goto cleanup; } else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_S390)) { /* deal with legacy virtio-s390 */ - qemuDomainPrimeS390VirtioDevices( + qemuDomainPrimeVirtioDeviceAddresses( def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390); } @@ -1327,6 +1332,18 @@ cleanup: return ret; } +static int +qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps) +{ + if (def->os.arch == VIR_ARCH_ARMV7L && + STRPREFIX(def->os.machine, "vexpress-") && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO)) { + qemuDomainPrimeVirtioDeviceAddresses( + def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO); + } + return 0; +} static int qemuSpaprVIOFindByReg(virDomainDefPtr def ATTRIBUTE_UNUSED, @@ -1912,6 +1929,10 @@ int qemuDomainAssignAddresses(virDomainDefPtr def, if (rc) return rc; + rc = qemuDomainAssignARMVirtioMMIOAddresses(def, qemuCaps); + if (rc) + return rc; + return qemuDomainAssignPCIAddresses(def, qemuCaps, obj); } @@ -4329,6 +4350,9 @@ qemuBuildDriveDevStr(virDomainDefPtr def, } else if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) { virBufferAddLit(&opt, "virtio-blk-s390"); + } else if (disk->info.type == + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) { + virBufferAddLit(&opt, "virtio-blk-device"); } else { virBufferAddLit(&opt, "virtio-blk-pci"); } @@ -4607,6 +4631,9 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, else if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) virBufferAddLit(&buf, "virtio-scsi-s390"); + else if (def->info.type == + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) + virBufferAddLit(&buf, "virtio-scsi-device"); else virBufferAddLit(&buf, "virtio-scsi-pci"); break; @@ -4636,6 +4663,9 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, } else if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) { virBufferAddLit(&buf, "virtio-serial-s390"); + } else if (def->info.type == + VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) { + virBufferAddLit(&buf, "virtio-serial-device"); } else { virBufferAddLit(&buf, "virtio-serial"); } @@ -4767,6 +4797,8 @@ qemuBuildNicDevStr(virDomainDefPtr def, nic = "virtio-net-ccw"; else if (net->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) nic = "virtio-net-s390"; + else if (net->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) + nic = "virtio-net-device"; else nic = "virtio-net-pci"; @@ -5013,6 +5045,9 @@ qemuBuildMemballoonDevStr(virDomainDefPtr def, case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: virBufferAddLit(&buf, "virtio-balloon-ccw"); break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: + virBufferAddLit(&buf, "virtio-balloon-device"); + break; default: virReportError(VIR_ERR_XML_ERROR, _("memballoon unsupported with address type '%s'"), @@ -6014,6 +6049,8 @@ qemuBuildRNGDeviceArgs(virCommandPtr cmd, virBufferAsprintf(&buf, "virtio-rng-ccw,rng=%s", dev->info.alias); else if (dev->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) virBufferAsprintf(&buf, "virtio-rng-s390,rng=%s", dev->info.alias); + else if (dev->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO) + virBufferAsprintf(&buf, "virtio-rng-device,rng=%s", dev->info.alias); else virBufferAsprintf(&buf, "virtio-rng-pci,rng=%s", dev->info.alias); @@ -7290,7 +7327,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, * * NB, no support for -netdev without use of -device */ - if (qemuDomainSupportsNetdev(def, qemuCaps)) { + if (qemuDomainSupportsNetdev(def, qemuCaps, net)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -7298,7 +7335,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-netdev", host, NULL); } - if (qemuDomainSupportsNicdev(def, qemuCaps)) { + if (qemuDomainSupportsNicdev(def, qemuCaps, net)) { if (!(nic = qemuBuildNicDevStr(def, net, vlan, bootindex, qemuCaps))) goto cleanup; virCommandAddArgList(cmd, "-device", nic, NULL); @@ -7307,7 +7344,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArgList(cmd, "-net", nic, NULL); } - if (!qemuDomainSupportsNetdev(def, qemuCaps)) { + if (!qemuDomainSupportsNetdev(def, qemuCaps, net)) { if (!(host = qemuBuildHostNetStr(net, driver, ',', vlan, tapfdName, tapfdSize, @@ -8309,7 +8346,7 @@ qemuBuildCommandLine(virConnectPtr conn, int vlan; /* VLANs are not used with -netdev, so don't record them */ - if (qemuDomainSupportsNetdev(def, qemuCaps)) + if (qemuDomainSupportsNetdev(def, qemuCaps, net)) vlan = -1; else vlan = i; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args new file mode 100644 index 0000000..62de9d3 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.args @@ -0,0 +1,14 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-arm -S -M vexpress-a9 -m 1024 -smp 1 -nographic \ +-nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \ +-boot c -kernel /arm.kernel -initrd /arm.initrd -append \ +'console=ttyAMA0,115200n8 rw root=/dev/vda3 rootwait physmap.enabled=0' \ +-dtb /arm.dtb -device virtio-serial-device,id=virtio-serial0 -usb \ +-drive file=/arm.raw,if=none,id=drive-virtio-disk0 \ +-device virtio-blk-device,drive=drive-virtio-disk0,id=virtio-disk0 \ +-device virtio-net-device,vlan=0,id=net0,mac=52:54:00:09:a4:37 \ +-net user,vlan=0,name=hostnet0 -serial pty -chardev pty,id=charconsole1 \ +-device virtconsole,chardev=charconsole1,id=console1 \ +-device virtio-balloon-device,id=balloon0 \ +-object rng-random,id=rng0,filename=/dev/random \ +-device virtio-rng-device,rng=rng0 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml new file mode 100644 index 0000000..2acf3c9 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-arm-vexpressa9-virtio.xml @@ -0,0 +1,45 @@ +<domain type="qemu"> + <name>armtest</name> + <uuid>496d7ea8-9739-544b-4ebd-ef08be936e6a</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch="armv7l" machine="vexpress-a9">hvm</type> + <kernel>/arm.kernel</kernel> + <initrd>/arm.initrd</initrd> + <dtb>/arm.dtb</dtb> + <cmdline>console=ttyAMA0,115200n8 rw root=/dev/vda3 rootwait physmap.enabled=0</cmdline> + </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/bin/qemu-system-arm</emulator> + <disk type='file' device='disk'> + <source file='/arm.raw'/> + <target dev='vda' bus='virtio'/> + </disk> + <interface type='user'> + <mac address='52:54:00:09:a4:37'/> + <model type='virtio'/> + </interface> + <console type='pty'/> + <console type='pty'> + <target type='virtio' port='0'/> + </console> + <memballoon model='virtio'/> + <!-- + This actually doesn't work in practice because vexpress only has + 4 virtio slots available, rng makes 5 --> + <rng model='virtio'> + <backend model='random'>/dev/random</backend> + </rng> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 68520da..fa30ec4 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1042,6 +1042,10 @@ mymain(void) DO_TEST("arm-vexpressa9-basic", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, QEMU_CAPS_DRIVE); + DO_TEST("arm-vexpressa9-virtio", + QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE_VIRTIO_MMIO, + QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM); virObjectUnref(driver.config); virObjectUnref(driver.caps); -- 1.8.3.1

On my machine, a guest fails to boot if it has a sound card, but not graphical device/display is configured, because pulseaudio fails to initialize since it can't access $HOME. A workaround is removing the audio device, however on ARM boards there isn't any option to do that, so -nographic always fails. Set QEMU_AUDIO_DRV=none if no <graphics> are configured. Unfortunately this has massive test suite fallout. --- I've snipped the actual test changes since the mail was too large. It was generated with roughly sed -i -e "s/LOGNAME=test /LOGNAME=test QEMU_AUDIO_DRV=none /" `grep "\-nographic" * | xargs` src/qemu/qemu_command.c | 7 ++++++- tests/qemuxml2argvdata/qemuxml2argv-balloon-device-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-balloon-device-period.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-balloon-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-bios.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-blkiotune-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-blkiotune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-complex.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.args | 3 ++- .../qemuxml2argv-boot-menu-disable-drive-bootindex.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-multi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-network.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-order.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-bootloader.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-channel-guestfwd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-clock-france.args | 4 ++-- tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-clock-utc.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-clock-variable.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-compat-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-compat-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-compat.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-sclp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-exact1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2-nofallback.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-fallback.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-kvmclock.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-fallback.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-passthrough.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-strict1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-topology1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-topology2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-topology3.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cputune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-blockio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.args | 3 ++- .../qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-discard.args | 2 +- .../qemuxml2argv-disk-drive-error-policy-enospace.args | 3 ++- .../qemuxml2argv-disk-drive-error-policy-stop.args | 3 ++- .../qemuxml2argv-disk-drive-error-policy-wreport-rignore.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fat.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.args | 3 ++- .../qemuxml2argv-disk-drive-network-iscsi-auth.args | 3 ++- .../qemuxml2argv-disk-drive-network-iscsi-lun.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi.args | 3 ++- .../qemuxml2argv-disk-drive-network-nbd-export.args | 3 ++- .../qemuxml2argv-disk-drive-network-nbd-ipv6-export.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-ipv6.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd-unix.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-auth.args | 2 +- .../qemuxml2argv-disk-drive-network-rbd-ceph-env.args | 4 ++-- .../qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd-ipv6.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-drive-network-sheepdog.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.args | 3 ++- .../qemuxml2argv-disk-drive-readonly-no-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.args | 3 ++- .../qemuxml2argv-disk-floppy-tray-no-device-cap.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-geometry.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-ide-drive-split.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-order.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-split.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-vpd.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-megasas.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-virtio-scsi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-usb-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-usb.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-ccw-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-ccw.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-num_queues.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-event_idx.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-fs9p.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-websocket.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-hostdev-pci-address-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-boot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-readonly.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-scsi.args | 3 ++- .../qemuxml2argv-hostdev-usb-address-device-boot.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-hostdev-usb-address-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-vfio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hugepages.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hyperv-off.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hyperv.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse-addr.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-kvm.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-kvmclock+eoi-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-kvmclock.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-lease.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-aliases1.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-machine-aliases2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-memtune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-metadata.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-migrate.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-minimal-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-minimal.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-monitor-json.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-client.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-eth-names.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-eth.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-hostdev-vfio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-mcast.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-server.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-user.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-netdev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-no-shutdown.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-nographics.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-nosharepages.args | 3 ++- .../qemuxml2argv-numad-auto-memory-vcpu-cpuset.args | 3 ++- ...emuxml2argv-numad-auto-memory-vcpu-no-cpuset-and-placement.args | 3 ++- .../qemuxml2argv-numad-auto-vcpu-static-numatune.args | 3 ++- .../qemuxml2argv-numad-static-memory-auto-vcpu.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-numad.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-numatune-memory.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-parallel-parport-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pcie-root.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-basic.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-default.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-multi.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-vio-user-assigned.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-vio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-q35.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-qemu-ns.args | 4 ++-- tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-enabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-restore-v1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-restore-v2-fd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-restore-v2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-s390-piix-controllers.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-s390-usb-none.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-baselabel.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-none.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-static-relabel.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-dev-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-dev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-file-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-file.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-many-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-pty-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-pty.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-udp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-unix-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-unix.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-vc-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-vc.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smartcard-controller.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-smartcard-host-certificates.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smartcard-host.args | 3 ++- .../qemuxml2argv-smartcard-passthrough-spicevmc.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smartcard-passthrough-tcp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smbios.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-sound-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-sound.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-tpm-passthrough.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-usb-controller.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-hub.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-none.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-redir-boot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-default.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-egd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-random.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-watchdog-dump.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-watchdog.args | 3 ++- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-commandline-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-commandline-ns1.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-commandline.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain-commandline-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain-commandline.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain.args | 2 +- 283 files changed, 519 insertions(+), 286 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 8b628d6..56e0809 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7559,9 +7559,13 @@ qemuBuildCommandLine(virConnectPtr conn, * if you ask for nographic. So we have to make sure we override * these defaults ourselves... */ - if (!def->graphics) + if (!def->graphics) { virCommandAddArg(cmd, "-nographic"); + /* trying to talk directly to pulseaudio is generally problematic */ + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none"); + } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { /* Disable global config files and default devices */ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_USER_CONFIG)) @@ -8630,6 +8634,7 @@ qemuBuildCommandLine(virConnectPtr conn, def->graphics[i]) < 0) goto error; } + if (def->nvideos > 0) { int primaryVideoType = def->videos[0]->type; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY) &&

On Mon, Aug 19, 2013 at 12:24:39PM -0400, Cole Robinson wrote:
On my machine, a guest fails to boot if it has a sound card, but not graphical device/display is configured, because pulseaudio fails to initialize since it can't access $HOME.
A workaround is removing the audio device, however on ARM boards there isn't any option to do that, so -nographic always fails.
Set QEMU_AUDIO_DRV=none if no <graphics> are configured. Unfortunately this has massive test suite fallout. @@ -7559,9 +7559,13 @@ qemuBuildCommandLine(virConnectPtr conn, * if you ask for nographic. So we have to make sure we override * these defaults ourselves... */ - if (!def->graphics) + if (!def->graphics) { virCommandAddArg(cmd, "-nographic");
+ /* trying to talk directly to pulseaudio is generally problematic */ + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none"); + }
We do something similar with VNC by default, but we have a global qemu.conf override for that. /* Unless user requested it, set the audio backend to none, to * prevent it opening the host OS audio devices, since that causes * security issues and might not work when using VNC. */ if (cfg->vncAllowHostAudio) virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV"); else virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none"); I think we probably want todo the same here, since it is in theory possible to make pulseaudio work for the QEMU driver. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On my machine, a guest fails to boot if it has a sound card, but not graphical device/display is configured, because pulseaudio fails to initialize since it can't access $HOME. A workaround is removing the audio device, however on ARM boards there isn't any option to do that, so -nographic always fails. Set QEMU_AUDIO_DRV=none if no <graphics> are configured. Unfortunately this has massive test suite fallout. Add a qemu.conf parameter nographics_allow_host_audio, that if enabled will pass through QEMU_AUDIO_DRV from sysconfig (similar to vnc_allow_host_audio) --- I've snipped the actual test changes since the mail was too large. It was generated with roughly sed -i -e "s/LOGNAME=test /LOGNAME=test QEMU_AUDIO_DRV=none /" `grep "\-nographic" * | xargs` src/qemu/libvirtd_qemu.aug | 3 +++ src/qemu/qemu.conf | 9 +++++++++ src/qemu/qemu_cgroup.c | 2 +- src/qemu/qemu_command.c | 9 ++++++++- src/qemu/qemu_conf.c | 1 + src/qemu/qemu_conf.h | 1 + src/qemu/test_libvirtd_qemu.aug.in | 1 + tests/qemuxml2argvdata/qemuxml2argv-balloon-device-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-balloon-device-period.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-balloon-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-bios.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-blkiotune-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-blkiotune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-complex.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.args | 3 ++- .../qemuxml2argv-boot-menu-disable-drive-bootindex.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-multi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-network.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-boot-order.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-bootloader.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-channel-guestfwd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-channel-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-clock-france.args | 4 ++-- tests/qemuxml2argvdata/qemuxml2argv-clock-localtime.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-clock-utc.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-clock-variable.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-compat-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-compat-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-compat.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-sclp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-console-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-exact1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2-nofallback.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-exact2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-fallback.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-kvmclock.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-fallback.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-host-passthrough.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-cpu-kvmclock.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-minimum2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-strict1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-topology1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-topology2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cpu-topology3.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-cputune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-blockio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network-ftp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-network-http.args | 3 ++- .../qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.args | 3 ++- .../qemuxml2argv-disk-drive-cache-directsync.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-discard.args | 2 +- .../qemuxml2argv-disk-drive-error-policy-enospace.args | 3 ++- .../qemuxml2argv-disk-drive-error-policy-stop.args | 3 ++- .../qemuxml2argv-disk-drive-error-policy-wreport-rignore.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fat.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.args | 3 ++- .../qemuxml2argv-disk-drive-network-gluster.args | 3 ++- .../qemuxml2argv-disk-drive-network-iscsi-auth.args | 3 ++- .../qemuxml2argv-disk-drive-network-iscsi-lun.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-drive-network-iscsi.args | 3 ++- .../qemuxml2argv-disk-drive-network-nbd-export.args | 3 ++- .../qemuxml2argv-disk-drive-network-nbd-ipv6-export.args | 3 ++- .../qemuxml2argv-disk-drive-network-nbd-ipv6.args | 3 ++- .../qemuxml2argv-disk-drive-network-nbd-unix.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-nbd.args | 3 ++- .../qemuxml2argv-disk-drive-network-rbd-auth.args | 2 +- .../qemuxml2argv-disk-drive-network-rbd-ceph-env.args | 4 ++-- .../qemuxml2argv-disk-drive-network-rbd-ipv6.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-rbd.args | 2 +- .../qemuxml2argv-disk-drive-network-sheepdog.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.args | 3 ++- .../qemuxml2argv-disk-drive-readonly-no-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.args | 3 ++- .../qemuxml2argv-disk-floppy-tray-no-device-cap.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-geometry.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-ide-drive-split.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-ide-wwn.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-order.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-sata-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device-auto.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-split.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-vpd.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-disk-wwn.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-scsi-lun-passthrough.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-megasas.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-virtio-scsi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-usb-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-usb.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-ccw-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-ccw.args | 3 ++- .../qemuxml2argv-disk-virtio-scsi-num_queues.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-event_idx.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-fs9p.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-sasl.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-websocket.args | 3 ++- .../qemuxml2argv-hostdev-pci-address-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-boot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-lsi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-scsi-readonly.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-hostdev-scsi-virtio-scsi.args | 3 ++- .../qemuxml2argv-hostdev-usb-address-device-boot.args | 3 ++- .../qemuxml2argv-hostdev-usb-address-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hostdev-vfio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hotplug-base.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-hugepages.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hyperv-off.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-hyperv.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse-addr.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-input-usbmouse.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-input-usbtablet.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-kvm.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-kvmclock+eoi-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-kvmclock.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-lease.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-aliases1.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-machine-aliases2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-core-off.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-core-on.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-memtune.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-metadata.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-migrate.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-minimal-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-minimal.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-acpi.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-disable-s3.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-disable-suspends.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-enable-s4.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-no-reboot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-misc-uuid.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-monitor-json.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-client.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-eth-ifname.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-eth-names.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-eth.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-hostdev-vfio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-mcast.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-server.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-user.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-netdev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio-s390.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-net-virtio.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-no-shutdown.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-nographics-vga.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-nographics.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-nosharepages.args | 3 ++- .../qemuxml2argv-numad-auto-memory-vcpu-cpuset.args | 3 ++- ...uxml2argv-numad-auto-memory-vcpu-no-cpuset-and-placement.args | 3 ++- .../qemuxml2argv-numad-auto-vcpu-static-numatune.args | 3 ++- .../qemuxml2argv-numad-static-memory-auto-vcpu.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-numad.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-numatune-memory.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-parallel-parport-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-parallel-tcp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-addr.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pci-autoadd-idx.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pci-bridge-many-disks.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pci-rom.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pcie-root.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pcihole64-none.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pcihole64-q35.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pcihole64.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-ppc-dtb.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-basic.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-default.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-usb-multi.args | 2 +- .../qemuxml2argvdata/qemuxml2argv-pseries-vio-user-assigned.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pseries-vio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-q35.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-qemu-ns-no-env.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-qemu-ns.args | 4 ++-- tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-disabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-reboot-timeout-enabled.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-restore-v1.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-restore-v2-fd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-restore-v2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-s390-piix-controllers.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-s390-usb-none.args | 2 +- .../qemuxml2argv-seclabel-dynamic-baselabel.args | 3 ++- .../qemuxml2argv-seclabel-dynamic-labelskip.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-seclabel-dynamic-override.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-dynamic.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-none.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-seclabel-static-labelskip.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-static-relabel.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-seclabel-static.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-dev-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-dev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-file-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-file.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-many-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-many.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-pty-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-pty.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-chardev.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-tcp-telnet.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-tcp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-udp-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-udp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-unix-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-unix.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-vc-chardev.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-serial-vc.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smartcard-controller.args | 3 ++- .../qemuxml2argv-smartcard-host-certificates.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smartcard-host.args | 3 ++- .../qemuxml2argv-smartcard-passthrough-spicevmc.args | 3 ++- .../qemuxml2argvdata/qemuxml2argv-smartcard-passthrough-tcp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smbios.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-smp.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-sound-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-sound.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-tpm-passthrough.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-usb-controller.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-hub.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-none.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-redir-boot.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-ccw.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-default.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-egd.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-virtio-rng-random.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-watchdog-dump.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-watchdog.args | 3 ++- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-commandline-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-commandline-ns1.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-commandline.args | 2 +- .../qemuxmlnsdata/qemuxmlns-qemu-ns-domain-commandline-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain-commandline.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain-ns0.args | 2 +- tests/qemuxmlnsdata/qemuxmlns-qemu-ns-domain.args | 2 +- 297 files changed, 549 insertions(+), 295 deletions(-) diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index 5344125..cd13d53 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -39,6 +39,8 @@ module Libvirtd_qemu = | str_entry "spice_tls_x509_cert_dir" | str_entry "spice_password" + let nogfx_entry = bool_entry "nographics_allow_host_audio" + let remote_display_entry = int_entry "remote_display_port_min" | int_entry "remote_display_port_max" | int_entry "remote_websocket_port_min" @@ -79,6 +81,7 @@ module Libvirtd_qemu = (* Each entry in the config is one of the following ... *) let entry = vnc_entry | spice_entry + | nogfx_entry | remote_display_entry | security_entry | save_entry diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf index cdf1ec4..5fd6263 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -140,6 +140,15 @@ #spice_password = "XYZ12345" +# By default, if no graphical front end is configured, libvirt will disable +# QEMU audio output since directly talking to alsa/pulseaudio may not work +# with various security settings. If you know what you're doing, enable +# the setting below and libvirt will passthrough the QEMU_AUDIO_DRV +# environment variable when using nographics. +# +#nographics_allow_host_audio = 1 + + # Override the port for creating both VNC and SPICE sessions (min). # This defaults to 5900 and increases for consecutive sessions # or when ports are occupied, until it hits the maximum. diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index e27945e..cf41c33 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -488,7 +488,7 @@ qemuSetupDevicesCgroup(virQEMUDriverPtr driver, defaultDeviceACL; if (vm->def->nsounds && - (!vm->def->ngraphics || + ((!vm->def->ngraphics && cfg->nogfxAllowHostAudio) || ((vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC && cfg->vncAllowHostAudio) || (vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL)))) { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f8fccea..9dfdb73 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7605,9 +7605,15 @@ qemuBuildCommandLine(virConnectPtr conn, * if you ask for nographic. So we have to make sure we override * these defaults ourselves... */ - if (!def->graphics) + if (!def->graphics) { virCommandAddArg(cmd, "-nographic"); + if (cfg->nogfxAllowHostAudio) + virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV"); + else + virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none"); + } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { /* Disable global config files and default devices */ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_USER_CONFIG)) @@ -8723,6 +8729,7 @@ qemuBuildCommandLine(virConnectPtr conn, def->graphics[i]) < 0) goto error; } + if (def->nvideos > 0) { int primaryVideoType = def->videos[0]->type; if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY) && diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 86ed9ed..1f57f72 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -338,6 +338,7 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg, GET_VALUE_BOOL("vnc_sasl", cfg->vncSASL); GET_VALUE_STR("vnc_sasl_dir", cfg->vncSASLdir); GET_VALUE_BOOL("vnc_allow_host_audio", cfg->vncAllowHostAudio); + GET_VALUE_BOOL("nographics_allow_host_audio", cfg->nogfxAllowHostAudio); p = virConfGetValue(conf, "security_driver"); if (p && p->type == VIR_CONF_LIST) { diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 8229cfc..206f2c6 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -128,6 +128,7 @@ struct _virQEMUDriverConfig { bool relaxedACS; bool vncAllowHostAudio; + bool nogfxAllowHostAudio; bool clearEmulatorCapabilities; bool allowDiskFormatProbing; bool setProcessName; diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qemu.aug.in index d4e4fae..ea770dc 100644 --- a/src/qemu/test_libvirtd_qemu.aug.in +++ b/src/qemu/test_libvirtd_qemu.aug.in @@ -15,6 +15,7 @@ module Test_libvirtd_qemu = { "spice_tls" = "1" } { "spice_tls_x509_cert_dir" = "/etc/pki/libvirt-spice" } { "spice_password" = "XYZ12345" } +{ "nographics_allow_host_audio" = "1" } { "remote_display_port_min" = "5900" } { "remote_display_port_max" = "65535" } { "remote_websocket_port_min" = "5700" } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-balloon-device-auto.args b/tests/qemuxml2argvdata/qemuxml2argv-balloon-device-auto.args index de4877b..bca7f6b 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-balloon-device-auto.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-balloon-device-auto.args @@ -1,4 +1,5 @@ -LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu -S -M \ pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor \ unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -hda \ /dev/HostVG/QEMUGuest1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,\

Wrong in-reply-to, resent with proper threading. - Cole On 08/30/2013 12:44 PM, Cole Robinson wrote:
On my machine, a guest fails to boot if it has a sound card, but not graphical device/display is configured, because pulseaudio fails to initialize since it can't access $HOME.
A workaround is removing the audio device, however on ARM boards there isn't any option to do that, so -nographic always fails.
Set QEMU_AUDIO_DRV=none if no <graphics> are configured. Unfortunately this has massive test suite fallout.
Add a qemu.conf parameter nographics_allow_host_audio, that if enabled will pass through QEMU_AUDIO_DRV from sysconfig (similar to vnc_allow_host_audio) ---

On 08/30/2013 10:44 AM, Cole Robinson wrote:
On my machine, a guest fails to boot if it has a sound card, but not graphical device/display is configured, because pulseaudio fails to initialize since it can't access $HOME.
A workaround is removing the audio device, however on ARM boards there isn't any option to do that, so -nographic always fails.
Set QEMU_AUDIO_DRV=none if no <graphics> are configured. Unfortunately this has massive test suite fallout.
Add a qemu.conf parameter nographics_allow_host_audio, that if enabled will pass through QEMU_AUDIO_DRV from sysconfig (similar to vnc_allow_host_audio) --- I've snipped the actual test changes since the mail was too large. It was generated with roughly
sed -i -e "s/LOGNAME=test /LOGNAME=test QEMU_AUDIO_DRV=none /" `grep "\-nographic" * | xargs`
ACK; I'm on the fence on whether this is okay for 1.1.2, but think it qualifies as a bug fix. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
participants (3)
-
Cole Robinson
-
Daniel P. Berrange
-
Eric Blake