[libvirt] [PATCH 3/4] Implement RHEL-5.4 KVM QXL support in QEMU driver

Daniel P. Berrange berrange at redhat.com
Tue Sep 29 15:43:51 UTC 2009


This supports the -qxl argument in RHEL-5's fork of KVM
which has SPICE support. QXL is a graphics card, but
inexplicably doesn't use the standard -vga syntax for
generic configuration. Also -qxl is rather useless unless
you also supply -spice (coming in next patch)

* src/qemu_conf.c: Probe for -qxl arg in QEMU help. Format a
  -qxl arg for launching VMs
* src/qemu_conf.h: Add flag for -qxl arg availability
* tests/qemuhelpdata/kvm-83-rhel, tests/qemuhelptest.c: test
  for -qxl arg help parsing
* tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c,
  tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args,
  tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml: add
  tests for -qxl graphics XML to ARGV handling
---
 src/qemu/qemu_conf.c                               |   41 +++++-
 src/qemu/qemu_conf.h                               |    2 +-
 tests/qemuhelpdata/kvm-83-rhel                     |  151 ++++++++++++++++++++
 tests/qemuhelptest.c                               |   16 ++
 .../qemuxml2argv-graphics-spice.args               |    1 +
 .../qemuxml2argv-graphics-spice.xml                |   25 ++++
 tests/qemuxml2argvtest.c                           |    3 +
 tests/qemuxml2xmltest.c                            |    1 +
 8 files changed, 235 insertions(+), 5 deletions(-)
 create mode 100644 tests/qemuhelpdata/kvm-83-rhel
 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 ae171bc..695ee7c 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -87,7 +87,7 @@ VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
               "vmware",
               NULL, /* no arg needed for xen */
               NULL, /* don't support vbox */
-              NULL, /* Not implemented yet */);
+              NULL, /* qxl is a bizarre special case  */);
 
 #define PROC_MOUNT_BUF_LEN 255
 
@@ -865,6 +865,8 @@ static unsigned int qemudComputeCmdFlags(const char *help,
     }
     if (strstr(help, "-vga") && !strstr(help, "-std-vga"))
         flags |= QEMUD_CMD_FLAG_VGA;
+    if (strstr(help, "-qxl"))
+        flags |= QEMUD_CMD_FLAG_QXL;
     if (strstr(help, "boot=on"))
         flags |= QEMUD_CMD_FLAG_DRIVE_BOOT;
     if (strstr(help, "serial=s"))
@@ -2174,9 +2176,15 @@ int qemudBuildCommandLine(virConnectPtr conn,
         }
 
         if (qemuCmdFlags & QEMUD_CMD_FLAG_VGA) {
-            if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) {
+            switch (def->videos[0]->type) {
+            case VIR_DOMAIN_VIDEO_TYPE_XEN:
                 /* nothing - vga has no effect on Xen pvfb */
-            } else {
+                break;
+            case VIR_DOMAIN_VIDEO_TYPE_QXL:
+                /* handle later */
+                break;
+            default:
+            {
                 const char *vgastr = qemuVideoTypeToString(def->videos[0]->type);
                 if (!vgastr) {
                     qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
@@ -2187,9 +2195,10 @@ int qemudBuildCommandLine(virConnectPtr conn,
 
                 ADD_ARG_LIT("-vga");
                 ADD_ARG_LIT(vgastr);
+                break;
+            }
             }
         } else {
-
             switch (def->videos[0]->type) {
             case VIR_DOMAIN_VIDEO_TYPE_VGA:
                 ADD_ARG_LIT("-std-vga");
@@ -2204,6 +2213,10 @@ int qemudBuildCommandLine(virConnectPtr conn,
                 /* No special args - this is the default */
                 break;
 
+            case VIR_DOMAIN_VIDEO_TYPE_QXL:
+                /* handle later */
+                break;
+
             default:
                 qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
                                  _("video type %s is not supported with QEMU"),
@@ -2211,6 +2224,26 @@ int qemudBuildCommandLine(virConnectPtr conn,
                 goto error;
             }
         }
+
+        if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
+
+            if (qemuCmdFlags & QEMUD_CMD_FLAG_QXL) {
+                char *optstr;
+
+                if (virAsprintf(&optstr, "%u,ram=%u",
+                                def->videos[0]->heads,
+                                (def->videos[0]->vram /1024)) < 0)
+                    goto no_memory;
+
+                ADD_ARG_LIT("-qxl");
+                ADD_ARG(optstr);
+            } else {
+                qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+                                 _("qxl graphics are not supported with this QEMU"));
+                goto error;
+            }
+        }
+
     }
 
     /* Add sound hardware */
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 96b7c0c..c8e3276 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -60,7 +60,6 @@ enum qemud_cmd_flags {
     QEMUD_CMD_FLAG_KVM               = (1 << 13), /* Whether KVM is compiled in */
     QEMUD_CMD_FLAG_DRIVE_FORMAT      = (1 << 14), /* Is -drive format= avail */
     QEMUD_CMD_FLAG_VGA               = (1 << 15), /* Is -vga avail */
-
     /* features added in qemu-0.10.0 */
     QEMUD_CMD_FLAG_0_10         = (1 << 16),
     QEMUD_CMD_FLAG_NET_NAME     = QEMUD_CMD_FLAG_0_10, /* -net ...,name=str */
@@ -70,6 +69,7 @@ enum qemud_cmd_flags {
     QEMUD_CMD_FLAG_MEM_PATH      = (1 << 18), /* mmap'ped guest backing supported */
     QEMUD_CMD_FLAG_DRIVE_SERIAL  = (1 << 19), /* -driver serial=  available */
     QEMUD_CMD_FLAG_XEN_DOMID     = (1 << 20), /* -xen-domid (new style xen integration) */
+    QEMUD_CMD_FLAG_QXL           = (1 << 21), /* Is -qxl avail (RHEL-5/6 custom) */
 };
 
 /* Main driver state */
diff --git a/tests/qemuhelpdata/kvm-83-rhel b/tests/qemuhelpdata/kvm-83-rhel
new file mode 100644
index 0000000..aeae3a4
--- /dev/null
+++ b/tests/qemuhelpdata/kvm-83-rhel
@@ -0,0 +1,151 @@
+QEMU PC emulator version 0.9.1 (kvm-83-maint-snapshot-20090205), Copyright (c) 2003-2008 Fabrice Bellard
+usage: qemu [options] [disk_image]
+
+'disk_image' is a raw hard image image for IDE hard disk 0
+
+Standard options:
+-M machine      select emulated machine (-M ? for list)
+-cpu cpu        select CPU (-cpu ? for list)
+-fda/-fdb file  use 'file' as floppy disk 0/1 image
+-hda/-hdb file  use 'file' as IDE hard disk 0/1 image
+-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image
+-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)
+-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
+       [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
+       [,cache=writethrough|writeback|none][,format=f][,serial=s]
+       [,boot=on|off]
+                use 'file' as a drive image
+-mtdblock file  use 'file' as on-board Flash memory image
+-sd file        use 'file' as SecureDigital card image
+-pflash file    use 'file' as a parallel flash image
+-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)
+-snapshot       write to temporary files instead of disk image files
+-no-frame       open SDL window without a frame and window decorations
+-alt-grab       use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)
+-no-quit        disable SDL window close capability
+-no-fd-bootchk  disable boot signature checking for floppy disks
+-m megs         set virtual RAM size to megs MB [default=128]
+-smp n          set the number of CPUs to 'n' [default=1]
+-nographic      disable graphical output and redirect serial I/Os to console
+-portrait       rotate graphical output 90 deg left (only PXA LCD)
+-k language     use keyboard layout (for example "fr" for French)
+-audio-help     print list of audio drivers and their options
+-soundhw c1,... enable audio support
+                and only specified sound cards (comma separated list)
+                use -soundhw ? to get the list of supported cards
+                use -soundhw all to enable all of them
+-vga [std|cirrus|vmware]
+                select video card type
+-localtime      set the real time clock to local time [default=utc]
+-full-screen    start in full screen
+-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug
+-rtc-td-hack    use it to fix time drift in Windows ACPI HAL
+-usb            enable the USB driver (will be the default soon)
+-usbdevice name add the host or guest USB device 'name'
+-name string    set the name of the guest
+-uuid %08x-%04x-%04x-%04x-%012x specify machine UUID
+-notify event   enable async-notifications for event
+-qxl <num>[,ram=megs]
+                use 'num' qxl display devices, each with RAM size of 'megs' MB
+                [default=64]
+-spice <args>   use spice
+-spice-help     show spice usage
+
+Network options:
+-net nic[,vlan=n][,macaddr=addr][,model=type][,name=str]
+                create a new Network Interface Card and connect it to VLAN 'n'
+-net user[,vlan=n][,name=str][,hostname=host]
+                connect the user mode network stack to VLAN 'n' and send
+                hostname 'host' to DHCP clients
+-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile]
+                connect the host TAP network interface to VLAN 'n' and use the
+                network scripts 'file' (default=/etc/qemu-ifup)
+                and 'dfile' (default=/etc/qemu-ifdown);
+                use '[down]script=no' to disable script execution;
+                use 'fd=h' to connect to an already opened TAP interface
+-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]
+                connect the vlan 'n' to another VLAN using a socket connection
+-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]
+                connect the vlan 'n' to multicast maddr and port
+-net none       use it alone to have zero network devices; if no -net option
+                is provided, the default is '-net nic -net user'
+
+-bt hci,null    Dumb bluetooth HCI - doesn't respond to commands
+-bt hci,host[:id]
+                Use host's HCI with the given name
+-bt hci[,vlan=n]
+                Emulate a standard HCI in virtual scatternet 'n'
+-bt vhci[,vlan=n]
+                Add host computer to virtual scatternet 'n' using VHCI
+-bt device:dev[,vlan=n]
+                Emulate a bluetooth device 'dev' in scatternet 'n'
+
+-tftp dir       allow tftp access to files in dir [-net user]
+-bootp file     advertise file in BOOTP replies
+-smb dir        allow SMB access to files in 'dir' [-net user]
+-redir [tcp|udp]:host-port:[guest-host]:guest-port
+                redirect TCP or UDP connections from host to guest [-net user]
+
+Linux boot specific:
+-kernel bzImage use 'bzImage' as kernel image
+-append cmdline use 'cmdline' as kernel command line
+-initrd file    use 'file' as initial ram disk
+
+Debug/Expert options:
+-monitor dev    redirect the monitor to char device 'dev'
+-vmchannel di:DI,dev  redirect the hypercall device with device id DI, to char device 'dev'
+-balloon dev    redirect the balloon hypercall device to char device 'dev'
+-serial dev     redirect the serial port to char device 'dev'
+-parallel dev   redirect the parallel port to char device 'dev'
+-pidfile file   Write PID to 'file'
+-S              freeze CPU at startup (use 'c' to start execution)
+-s              wait gdb connection to port
+-p port         set gdb connection port [default=1234]
+-d item1,...    output log to /tmp/qemu.log (use -d ? for a list of log items)
+-hdachs c,h,s[,t]  force hard disk 0 physical geometry and the optional BIOS
+                translation (t=none or lba) (usually qemu can guess them)
+-L path         set the directory for the BIOS, VGA BIOS and keymaps
+-no-kvm         disable KVM hardware virtualization
+-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC
+-no-kvm-pit	    disable KVM kernel mode PIT
+-no-kvm-pit-reinjection disable KVM kernel mode PIT interrupt reinjection
+-enable-nesting enable support for running a VM inside the VM (AMD only)
+-pcidevice host=bus:dev.func[,dma=none][,name=string]
+                expose a PCI device to the guest OS.
+                dma=none: don't perform any dma translations (default is to use an iommu)
+                'string' is used in log output.
+-no-acpi        disable ACPI
+-no-hpet        disable HPET
+-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]...]
+                ACPI table description
+-smbios file=binary
+                Load SMBIOS entry from binary file
+-smbios type=0[,vendor=str][,version=str][,date=str][,release=%d.%d]
+                Specify SMBIOS type 0 fields
+-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str]
+              [,uuid=uuid][,sku=str][,family=str]
+                Specify SMBIOS type 1 fields
+-no-reboot      exit instead of rebooting
+-no-shutdown    stop before shutdown
+-loadvm [tag|id]  start right away with a saved state (loadvm in monitor)
+-vnc display    start a VNC server on display
+-daemonize      daemonize QEMU after initializing
+-tdf            inject timer interrupts that got lost
+-kvm-shadow-memory megs set the amount of shadow pages to be allocated
+-mem-path       set the path to hugetlbfs/tmpfs mounted directory, also
+                enables allocation of guest memory with huge pages
+-mem-prealloc   toggles preallocation of -mem-path backed physical memory
+                at startup.  Default is enabled.
+-option-rom rom load a file, rom, into the option ROM space
+-clock          force the use of the given methods for timer alarm.
+                To see what timers are available use -clock ?
+-startdate      select initial date of the clock
+-icount [N|auto]
+                Enable virtual instruction counter with 2^N clock ticks per instruction
+
+During emulation, the following keys are useful:
+ctrl-alt-f      toggle full screen
+ctrl-alt-n      switch to virtual console 'n'
+ctrl-alt        toggle mouse and keyboard grab
+
+When using -nographic, press 'ctrl-a h' to get some help.
diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c
index 428d9a3..7fd9e92 100644
--- a/tests/qemuhelptest.c
+++ b/tests/qemuhelptest.c
@@ -179,6 +179,22 @@ mymain(int argc, char **argv)
             QEMUD_CMD_FLAG_PCIDEVICE |
             QEMUD_CMD_FLAG_MEM_PATH,
             10092, 1,  0);
+    DO_TEST("kvm-83-rhel",
+            QEMUD_CMD_FLAG_VNC_COLON |
+            QEMUD_CMD_FLAG_NO_REBOOT |
+            QEMUD_CMD_FLAG_DRIVE |
+            QEMUD_CMD_FLAG_DRIVE_BOOT |
+            QEMUD_CMD_FLAG_NAME |
+            QEMUD_CMD_FLAG_UUID |
+            QEMUD_CMD_FLAG_VNET_HDR |
+            QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP |
+            QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC |
+            QEMUD_CMD_FLAG_DRIVE_CACHE_V2 |
+            QEMUD_CMD_FLAG_KVM |
+            QEMUD_CMD_FLAG_DRIVE_FORMAT |
+            QEMUD_CMD_FLAG_VGA |
+            QEMUD_CMD_FLAG_QXL,
+            9001, 1,  0);
 
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args
new file mode 100644
index 0000000..d401b85
--- /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 -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb -qxl 3,ram=64
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
new file mode 100644
index 0000000..17f4b20
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml
@@ -0,0 +1,25 @@
+<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'/>
+    </disk>
+    <video>
+      <model type='qxl' vram='65536' heads='3'/>
+    </video>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 3255146..142ee76 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -244,6 +244,9 @@ mymain(int argc, char **argv)
 
     DO_TEST("graphics-sdl", 0);
     DO_TEST("graphics-sdl-fullscreen", 0);
+
+    DO_TEST("graphics-spice", QEMUD_CMD_FLAG_QXL);
+
     DO_TEST("input-usbmouse", 0);
     DO_TEST("input-usbtablet", 0);
     DO_TEST("input-xen", QEMUD_CMD_FLAG_DOMID);
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 2cba47b..defc35d 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -107,6 +107,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.6.2.5




More information about the libvir-list mailing list