]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Add controllers in specified order
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 5 Nov 2012 10:51:44 +0000 (11:51 +0100)
committerCole Robinson <crobinso@redhat.com>
Sun, 9 Dec 2012 21:25:19 +0000 (16:25 -0500)
qemu is sensitive to the order of arguments passed. Hence, if a
device requires a controller, the controller cmd string must
precede device cmd string. The same apply for controllers, when
for instance ccid controller requires usb controller. So
controllers create partial ordering in which they should be added
to qemu cmd line.
(cherry picked from commit 0f720ab35a1a836aa23b66ef4bafbc5e57290357)

src/qemu/qemu_command.c

index 7dca06ccad71477b0769f9cffabda2b20f05a4a1..d6fc0fc1b7e0c9a7e5de1ed8ce47e910a7460824 100644 (file)
@@ -4473,6 +4473,16 @@ qemuBuildCommandLine(virConnectPtr conn,
     int usbcontroller = 0;
     bool usblegacy = false;
     uname_normalize(&ut);
+    int contOrder[] = {
+        /* We don't add an explicit IDE or FD controller because the
+         * provided PIIX4 device already includes one. It isn't possible to
+         * remove the PIIX4. */
+        VIR_DOMAIN_CONTROLLER_TYPE_USB,
+        VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
+        VIR_DOMAIN_CONTROLLER_TYPE_SATA,
+        VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL,
+        VIR_DOMAIN_CONTROLLER_TYPE_CCID,
+    };
 
     VIR_DEBUG("conn=%p driver=%p def=%p mon=%p json=%d "
               "caps=%p migrateFrom=%s migrateFD=%d "
@@ -5051,15 +5061,11 @@ qemuBuildCommandLine(virConnectPtr conn,
     }
 
     if (qemuCapsGet(caps, QEMU_CAPS_DEVICE)) {
-        for (j = 0; j < 1; j++) {
+        for (j = 0; j < ARRAY_CARDINALITY(contOrder); j++) {
             for (i = 0; i < def->ncontrollers; i++) {
                 virDomainControllerDefPtr cont = def->controllers[i];
 
-                /* We don't add an explicit IDE or FD controller because the
-                 * provided PIIX4 device already includes one. It isn't possible to
-                 * remove the PIIX4. */
-                if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE ||
-                    cont->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC)
+                if (cont->type != contOrder[j])
                     continue;
 
                 /* Also, skip USB controllers with type none.*/