[libvirt] [PATCH 3/9] Implement QEMU/KVM QXL video card support in QEMU driver

Daniel P. Berrange berrange at redhat.com
Mon Nov 8 19:27:22 UTC 2010


This supports the '-vga qxl' parameter in upstream QEMU/KVM
which has SPICE support added. This isn't particularly useful
until you get the next patch for -spice support. Also note that
while the libvirt XML supports multiple video devices, this
patch only supports a single one. A later patch can add support
for 2nd, 3rd, etc PCI devices for QXL

* src/qemu/qemu_conf.h: Flag for QXL support
* src/qemu/qemu_conf.c: Probe for '-vga qxl' support and implement it
* tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c,
  tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args,
  tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml: Test
  case for generating spice args with RHEL6 kvm
---
 src/qemu/qemu_conf.c                               |   15 +++++++++-
 src/qemu/qemu_conf.h                               |    1 +
 .../qemuxml2argv-graphics-spice.args               |    1 +
 .../qemuxml2argv-graphics-spice.xml                |   27 ++++++++++++++++++++
 tests/qemuxml2argvtest.c                           |    4 +++
 tests/qemuxml2xmltest.c                            |    1 +
 6 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 104e874..45af71f 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -93,7 +93,7 @@ VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
               "vmware",
               "", /* no arg needed for xen */
               "", /* don't support vbox */
-              "", /* Not implemented QXL yet */);
+              "qxl");
 
 int qemudLoadDriverConfig(struct qemud_driver *driver,
                           const char *filename) {
@@ -1202,8 +1202,12 @@ static unsigned long long qemudComputeCmdFlags(const char *help,
         if (strstr(help, "readonly="))
             flags |= QEMUD_CMD_FLAG_DRIVE_READONLY;
     }
-    if (strstr(help, "-vga") && !strstr(help, "-std-vga"))
+    if (strstr(help, "-vga") && !strstr(help, "-std-vga")) {
         flags |= QEMUD_CMD_FLAG_VGA;
+
+        if (strstr(help, "|qxl"))
+            flags |= QEMUD_CMD_FLAG_VGA_QXL;
+    }
     if (strstr(help, "boot=on"))
         flags |= QEMUD_CMD_FLAG_DRIVE_BOOT;
     if (strstr(help, "serial=s"))
@@ -5081,6 +5085,13 @@ int qemudBuildCommandLine(virConnectPtr conn,
             if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) {
                 /* nothing - vga has no effect on Xen pvfb */
             } else {
+                if ((def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) &&
+                    !(qemuCmdFlags & QEMUD_CMD_FLAG_VGA_QXL)) {
+                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                                    _("This QEMU does not support QXL graphics adapters"));
+                    goto error;
+                }
+
                 const char *vgastr = qemuVideoTypeToString(def->videos[0]->type);
                 if (!vgastr || STREQ(vgastr, "")) {
                     qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 2b143e6..60c4c23 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -98,6 +98,7 @@ enum qemud_cmd_flags {
     QEMUD_CMD_FLAG_NAME_PROCESS  = (1LL << 42), /* Is -name process= available */
     QEMUD_CMD_FLAG_DRIVE_READONLY= (1LL << 43), /* -drive readonly=on|off */
     QEMUD_CMD_FLAG_SMBIOS_TYPE   = (1LL << 44), /* Is -smbios type= available */
+    QEMUD_CMD_FLAG_VGA_QXL       = (1LL << 45), /* The 'qxl' arg for '-vga' */
 };
 
 /* Main driver state */
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
new file mode 100644
index 0000000..94cd90e
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
@@ -0,0 +1 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -usb -vga qxl -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
new file mode 100644
index 0000000..031a622
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
@@ -0,0 +1,27 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory>219200</memory>
+  <currentMemory>219200</currentMemory>
+  <vcpu>1</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' unit='0'/>
+    </disk>
+    <controller type='ide' index='0'/>
+    <video>
+      <model type='qxl' vram='65536' heads='1'/>
+    </video>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 7040aee..18f9dfe 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -323,6 +323,10 @@ mymain(int argc, char **argv)
     DO_TEST("graphics-sdl", 0, false);
     DO_TEST("graphics-sdl-fullscreen", 0, false);
     DO_TEST("nographics-vga", QEMUD_CMD_FLAG_VGA, false);
+    DO_TEST("graphics-spice",
+            QEMUD_CMD_FLAG_VGA | QEMUD_CMD_FLAG_VGA_QXL |
+            QEMUD_CMD_FLAG_DEVICE, false);
+
     DO_TEST("input-usbmouse", 0, false);
     DO_TEST("input-usbtablet", 0, false);
     DO_TEST("input-xen", QEMUD_CMD_FLAG_DOMID, true);
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index cdc4390..326a1f1 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -149,6 +149,7 @@ mymain(int argc, char **argv)
     DO_TEST("graphics-vnc-tls");
     DO_TEST("graphics-sdl");
     DO_TEST("graphics-sdl-fullscreen");
+    DO_TEST("graphics-spice");
     DO_TEST("input-usbmouse");
     DO_TEST("input-usbtablet");
     DO_TEST("input-xen");
-- 
1.7.2.3




More information about the libvir-list mailing list