[libvirt] [PATCH] qemu: detect multi-head qxl via more than version check

Multi-head QXL support is so useful that distros have started to backport it to qemu earlier than 1.2. After discussion with Alon Levy, we determined that the existence of the qxl-vga.surfaces property is a reliable indicator of whether '-device qxl-vga' works, or whether we have to stick to the older '-vga qxl'. I'm leaving in the existing check for QEMU_CAPS_DEVICE_VIDEO_PRIMARY tied to qemu 1.2 and newer (in case qemu is built without qxl support), but for those distros that backport qxl, this additional capability check will allow the correct command line for both RHEL 6.3 (which lacks the feature) and RHEL 6.4 (where qemu still claims to be version 0.12.2.x, but has backported multi-head qxl). * src/qemu/qemu_capabilities.c (virQEMUCapsObjectPropsQxlVga): New property test. (virQEMUCapsExtractDeviceStr): Probe for backport of new capability to qemu earlier than 1.2. * tests/qemuhelpdata/qemu-kvm-1.2.0-device: Update test. * tests/qemuhelpdata/qemu-1.2.0-device: Likewise. * tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel62-beta-device: Likewise. --- src/qemu/qemu_capabilities.c | 7 +++++++ tests/qemuhelpdata/qemu-1.2.0-device | 16 ++++++++++++++++ tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel62-beta-device | 10 ++++++++++ tests/qemuhelpdata/qemu-kvm-1.2.0-device | 16 ++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 79cfdb3..17747c1 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1383,6 +1383,10 @@ static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsUsbHost[] = { { "bootindex", QEMU_CAPS_USB_HOST_BOOTINDEX }, }; +static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsQxlVga[] = { + { "surfaces", QEMU_CAPS_DEVICE_VIDEO_PRIMARY }, +}; + struct virQEMUCapsObjectTypeProps { const char *type; struct virQEMUCapsStringFlags *props; @@ -1416,6 +1420,8 @@ static struct virQEMUCapsObjectTypeProps virQEMUCapsObjectProps[] = { ARRAY_CARDINALITY(virQEMUCapsObjectPropsUsbRedir) }, { "usb-host", virQEMUCapsObjectPropsUsbHost, ARRAY_CARDINALITY(virQEMUCapsObjectPropsUsbHost) }, + { "qxl-vga", virQEMUCapsObjectPropsQxlVga, + ARRAY_CARDINALITY(virQEMUCapsObjectPropsQxlVga) }, }; @@ -1613,6 +1619,7 @@ virQEMUCapsExtractDeviceStr(const char *qemu, "-device", "usb-redir,?", "-device", "ide-drive,?", "-device", "usb-host,?", + "-device", "qxl-vga,?", NULL); /* qemu -help goes to stdout, but qemu -device ? goes to stderr. */ virCommandSetErrorBuffer(cmd, &output); diff --git a/tests/qemuhelpdata/qemu-1.2.0-device b/tests/qemuhelpdata/qemu-1.2.0-device index 5613e00..027d99a 100644 --- a/tests/qemuhelpdata/qemu-1.2.0-device +++ b/tests/qemuhelpdata/qemu-1.2.0-device @@ -208,3 +208,19 @@ usb-host.bootindex=int32 usb-host.pipeline=on/off usb-host.port=string usb-host.full-path=on/off +qxl-vga.ram_size=uint32 +qxl-vga.vram_size=uint32 +qxl-vga.revision=uint32 +qxl-vga.debug=uint32 +qxl-vga.guestdebug=uint32 +qxl-vga.cmdlog=uint32 +qxl-vga.ram_size_mb=uint32 +qxl-vga.vram_size_mb=uint32 +qxl-vga.vram64_size_mb=uint32 +qxl-vga.vgamem_mb=uint32 +qxl-vga.surfaces=int32 +qxl-vga.addr=pci-devfn +qxl-vga.romfile=string +qxl-vga.rombar=uint32 +qxl-vga.multifunction=on/off +qxl-vga.command_serr_enable=on/off diff --git a/tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel62-beta-device b/tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel62-beta-device index ee0fd78..5eab539 100644 --- a/tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel62-beta-device +++ b/tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel62-beta-device @@ -118,3 +118,13 @@ virtio-net-pci.addr=pci-devfn virtio-net-pci.romfile=string virtio-net-pci.rombar=uint32 virtio-net-pci.multifunction=on/off +qxl-vga.ram_size=uint32 +qxl-vga.vram_size=uint32 +qxl-vga.revision=uint32 +qxl-vga.debug=uint32 +qxl-vga.guestdebug=uint32 +qxl-vga.cmdlog=uint32 +qxl-vga.addr=pci-devfn +qxl-vga.romfile=string +qxl-vga.rombar=uint32 +qxl-vga.multifunction=on/off diff --git a/tests/qemuhelpdata/qemu-kvm-1.2.0-device b/tests/qemuhelpdata/qemu-kvm-1.2.0-device index 879a049..ebc27f0 100644 --- a/tests/qemuhelpdata/qemu-kvm-1.2.0-device +++ b/tests/qemuhelpdata/qemu-kvm-1.2.0-device @@ -220,3 +220,19 @@ usb-host.bootindex=int32 usb-host.pipeline=on/off usb-host.port=string usb-host.full-path=on/off +qxl-vga.ram_size=uint32 +qxl-vga.vram_size=uint32 +qxl-vga.revision=uint32 +qxl-vga.debug=uint32 +qxl-vga.guestdebug=uint32 +qxl-vga.cmdlog=uint32 +qxl-vga.ram_size_mb=uint32 +qxl-vga.vram_size_mb=uint32 +qxl-vga.vram64_size_mb=uint32 +qxl-vga.vgamem_mb=uint32 +qxl-vga.surfaces=int32 +qxl-vga.addr=pci-devfn +qxl-vga.romfile=string +qxl-vga.rombar=uint32 +qxl-vga.multifunction=on/off +qxl-vga.command_serr_enable=on/off -- 1.8.1.4

On Wed, Mar 13, 2013 at 18:48:46 -0600, Eric Blake wrote:
Multi-head QXL support is so useful that distros have started to backport it to qemu earlier than 1.2. After discussion with Alon Levy, we determined that the existence of the qxl-vga.surfaces property is a reliable indicator of whether '-device qxl-vga' works, or whether we have to stick to the older '-vga qxl'. I'm leaving in the existing check for QEMU_CAPS_DEVICE_VIDEO_PRIMARY tied to qemu 1.2 and newer (in case qemu is built without qxl support),
So in other words, QEMU_CAPS_DEVICE_VIDEO_PRIMARY will be set iff qemu version is 1.2 or newer or qxl-vga.surfaces exists. That seems fine. ACK Jirka

On 03/14/2013 08:47 AM, Jiri Denemark wrote:
On Wed, Mar 13, 2013 at 18:48:46 -0600, Eric Blake wrote:
Multi-head QXL support is so useful that distros have started to backport it to qemu earlier than 1.2. After discussion with Alon Levy, we determined that the existence of the qxl-vga.surfaces property is a reliable indicator of whether '-device qxl-vga' works, or whether we have to stick to the older '-vga qxl'. I'm leaving in the existing check for QEMU_CAPS_DEVICE_VIDEO_PRIMARY tied to qemu 1.2 and newer (in case qemu is built without qxl support),
So in other words, QEMU_CAPS_DEVICE_VIDEO_PRIMARY will be set iff qemu version is 1.2 or newer or qxl-vga.surfaces exists. That seems fine.
Correct.
ACK
Thanks; pushed. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
participants (2)
-
Eric Blake
-
Jiri Denemark