[PATCH v2 14/17] qemu: Add qemuDomainDefaultUSBControllerModel()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Extract the logic from qemuDomainControllerDefPostParse().

The behavior is unchanged, we simply use an out argument to
return the model and entertain the possibility of the process
failing, even though the current implementation never will.

Signed-off-by: Andrea Bolognani <abologna@xxxxxxxxxx>
---
 src/qemu/qemu_domain.c | 80 +++++++++++++++++++++++++-----------------
 1 file changed, 48 insertions(+), 32 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index c194928ed1..a970bf5c18 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4157,6 +4157,47 @@ qemuDomainDefaultSCSIControllerModel(virDomainControllerModelSCSI *model,
 }
 
 
+static int
+qemuDomainDefaultUSBControllerModel(virDomainControllerModelUSB *model,
+                                    const virDomainDef *def,
+                                    virQEMUCaps *qemuCaps,
+                                    unsigned int parseFlags)
+{
+    /* Default USB controller is piix3-uhci if available. */
+    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI))
+        *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
+
+    if (ARCH_IS_S390(def->os.arch)) {
+        /* No default model on s390x, one has to be provided
+         * explicitly by the user */
+        *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE;
+    } else if (ARCH_IS_PPC64(def->os.arch)) {
+        /* To not break migration we need to set default USB controller
+         * for ppc64 to pci-ohci if we cannot change ABI of the VM.
+         * The nec-usb-xhci or qemu-xhci controller is used as default
+         * only for newly defined domains or devices. */
+        if ((parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE) &&
+            virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) {
+            *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI;
+        } else if ((parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE) &&
+                   virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI)) {
+            *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI;
+        } else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) {
+            *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI;
+        } else {
+            /* Explicitly fallback to legacy USB controller for PPC64. */
+            *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT;
+        }
+    } else if (def->os.arch == VIR_ARCH_AARCH64) {
+        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI))
+            *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI;
+        else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI))
+            *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI;
+    }
+
+    return 0;
+}
+
 static int
 qemuDomainDefAddDefaultDevices(virQEMUDriver *driver,
                                virDomainDef *def,
@@ -5652,38 +5693,13 @@ qemuDomainControllerDefPostParse(virDomainControllerDef *cont,
         break;
 
     case VIR_DOMAIN_CONTROLLER_TYPE_USB:
-        if (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT && qemuCaps) {
-            /* Default USB controller is piix3-uhci if available. */
-            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI))
-                cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
-
-            if (ARCH_IS_S390(def->os.arch)) {
-                /* No default model on s390x, one has to be provided
-                 * explicitly by the user */
-                cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE;
-            } else if (ARCH_IS_PPC64(def->os.arch)) {
-                /* To not break migration we need to set default USB controller
-                 * for ppc64 to pci-ohci if we cannot change ABI of the VM.
-                 * The nec-usb-xhci or qemu-xhci controller is used as default
-                 * only for newly defined domains or devices. */
-                if ((parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE) &&
-                    virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI)) {
-                    cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI;
-                } else if ((parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE) &&
-                    virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI)) {
-                    cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI;
-                } else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI)) {
-                    cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI;
-                } else {
-                    /* Explicitly fallback to legacy USB controller for PPC64. */
-                    cont->model = -1;
-                }
-            } else if (def->os.arch == VIR_ARCH_AARCH64) {
-                if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI))
-                    cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI;
-                else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI))
-                    cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI;
-            }
+        if (qemuCaps &&
+            cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT &&
+            qemuDomainDefaultUSBControllerModel(&cont->model, def, qemuCaps, parseFlags) < 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("Unable to determine model for USB controller idx=%1$d"),
+                           cont->idx);
+            return -1;
         }
 
         /* Make sure the 'none' USB controller doesn't have an address
-- 
2.43.0
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux