]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Add USB option capability
authorLi Zhang <zhlcindy@linux.vnet.ibm.com>
Sun, 7 Apr 2013 08:31:57 +0000 (16:31 +0800)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 12 Apr 2013 09:56:03 +0000 (10:56 +0100)
To avoid the collision for creating USB controllers in machine->init()
and -device xx command line, it needs to set usb=off to avoid one USB
controller created in machine->init(). So that libvirt can use -device
or -usb to create USB controller sucessfully.
So QEMU_CAPS_MACHINE_USB_OPT capability is added, and it is for QEMU
v1.3.0 onwards which supports USB option.

Signed-off-by: Li Zhang <zhlcindy@linux.vnet.ibm.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.args [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.xml [new file with mode: 0644]
tests/qemuxml2argvtest.c

index 50712b0bfd0b0c737bad71104bc1dbf8cb7298f3..07cda1f205c811eefdd4ad9f23dfe660b807e0e4 100644 (file)
@@ -216,6 +216,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
 
               "ipv6-migration", /* 135 */
               "machine-opt",
+              "machine-usb-opt",
     );
 
 struct _virQEMUCaps {
@@ -1078,6 +1079,10 @@ virQEMUCapsComputeCmdFlags(const char *help,
     if (strstr(help, "-machine"))
         virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_OPT);
 
+     /* USB option is supported v1.3.0 onwards */
+    if (qemuCaps->version >= 1003000)
+        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_USB_OPT);
+
     /*
      * Handling of -incoming arg with varying features
      *  -incoming tcp    (kvm >= 79, qemu >= 0.10.0)
@@ -2435,6 +2440,10 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
 
     virQEMUCapsInitQMPBasic(qemuCaps);
 
+    /* USB option is supported v1.3.0 onwards */
+    if (qemuCaps->version >= 1003000)
+        virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_USB_OPT);
+
     if (!(archstr = qemuMonitorGetTargetArch(mon)))
         goto cleanup;
 
index b2dc5885ab501fbbcc1ae2cfbf9e11cb99e1068d..9f24d6aada02a8d64b885840b3b6ccf2d138b551 100644 (file)
@@ -176,6 +176,7 @@ enum virQEMUCapsFlags {
     QEMU_CAPS_SCSI_MEGASAS       = 134, /* -device megasas */
     QEMU_CAPS_IPV6_MIGRATION     = 135, /* -incoming [::] */
     QEMU_CAPS_MACHINE_OPT        = 136, /* -machine xxxx*/
+    QEMU_CAPS_MACHINE_USB_OPT    = 137, /* -machine xxx,usb=on/off */
 
     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
index d89923973a0c446da2aa1bb6a3fe4239b23e015f..d748dcc7ec9974448e209dbc81a1104f7ba06b04 100644 (file)
@@ -5257,6 +5257,12 @@ qemuBuildMachineArgStr(virCommandPtr cmd,
         virCommandAddArg(cmd, "-machine");
         virBufferAdd(&buf, def->os.machine, -1);
 
+        /* To avoid the collision of creating USB controllers when calling
+         * machine->init in QEMU, it needs to set usb=off
+         */
+        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_USB_OPT))
+            virBufferAsprintf(&buf, ",usb=off");
+
         if (def->mem.dump_core) {
             if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DUMP_GUEST_CORE)) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.args b/tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.args
new file mode 100644 (file)
index 0000000..ed88850
--- /dev/null
@@ -0,0 +1,5 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu \
+-S -machine pc,usb=off -m 214 -smp 1 -nographic \
+-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \
+-hda /dev/HostVG/QEMUGuest1 -net none -serial \
+none -parallel none
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.xml b/tests/qemuxml2argvdata/qemuxml2argv-machine-usb-opt.xml
new file mode 100644 (file)
index 0000000..c4d483a
--- /dev/null
@@ -0,0 +1,26 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>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' target='0' unit='0'/>
+    </disk>
+    <controller type='usb' index='0'/>
+    <controller type='ide' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
index d6575e7c2186ac7b3fb214d6866dad4951893412..36d51225558ab7edc64536291b42f85cac3f32f6 100644 (file)
@@ -369,6 +369,8 @@ mymain(void)
             QEMU_CAPS_DUMP_GUEST_CORE);
     DO_TEST_FAILURE("machine-core-on", NONE);
     DO_TEST_FAILURE("machine-core-on", QEMU_CAPS_MACHINE_OPT);
+    DO_TEST("machine-usb-opt", QEMU_CAPS_MACHINE_OPT,
+            QEMU_CAPS_MACHINE_USB_OPT);
     DO_TEST("boot-cdrom", NONE);
     DO_TEST("boot-network", NONE);
     DO_TEST("boot-floppy", NONE);