In addition to the code in qemuDomainControllerDefPostParse(),
which we have just factored into its own function, we also have
some code in qemuDomainDefAddDefaultDevices() that deals with
choosing the model for a USB controller, specifically for q35
guests. Integrate it into the newly-created function.
Since we want slightly different behaviors depending on whether
the USB controller that we're working on is the one that we try
to automatically add for certain new guests (addDefaultUSB), we
need to introduce a new parameter to the function.
Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
src/qemu/qemu_domain.c | 50 ++++++++++++++++++++++++++++--------------
1 file changed, 33 insertions(+), 17 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a970bf5c18..6801a883f4 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4159,6 +4159,7 @@ qemuDomainDefaultSCSIControllerModel(virDomainControllerModelSCSI
*model,
static int
qemuDomainDefaultUSBControllerModel(virDomainControllerModelUSB *model,
+ bool autoAdded,
const virDomainDef *def,
virQEMUCaps *qemuCaps,
unsigned int parseFlags)
@@ -4195,16 +4196,34 @@ qemuDomainDefaultUSBControllerModel(virDomainControllerModelUSB
*model,
*model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI;
}
+ if (ARCH_IS_X86(def->os.arch)) {
+ if (qemuDomainIsQ35(def) && autoAdded) {
+ /* Prefer adding a USB3 controller if supported, fall back
+ * to USB2 if there is no USB3 available, and if that's
+ * unavailable don't add anything.
+ */
+ 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;
+ else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_USB_EHCI1))
+ *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1;
+ else
+ *model = VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT;
+ }
+ }
+
return 0;
}
static int
qemuDomainDefAddDefaultDevices(virQEMUDriver *driver,
virDomainDef *def,
- virQEMUCaps *qemuCaps)
+ virQEMUCaps *qemuCaps,
+ unsigned int parseFlags)
{
bool addDefaultUSB = false;
- int usbModel = -1; /* "default for machinetype" */
+ virDomainControllerModelUSB usbModel = VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT;
int pciRoot; /* index within def->controllers */
bool addImplicitSATA = false;
bool addPCIRoot = false;
@@ -4235,19 +4254,6 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver,
addPCIeRoot = true;
addImplicitSATA = true;
addITCOWatchdog = true;
-
- /* Prefer adding a USB3 controller if supported, fall back
- * to USB2 if there is no USB3 available, and if that's
- * unavailable don't add anything.
- */
- if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI))
- usbModel = VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI;
- else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI))
- usbModel = VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI;
- else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ICH9_USB_EHCI1))
- usbModel = VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1;
- else
- addDefaultUSB = false;
break;
}
if (qemuDomainIsI440FX(def))
@@ -4340,6 +4346,16 @@ qemuDomainDefAddDefaultDevices(virQEMUDriver *driver,
break;
}
+ if (addDefaultUSB) {
+ /* If no reasonable model can be figured out, we should
+ * simply not add the default USB controller */
+ if (qemuDomainDefaultUSBControllerModel(&usbModel, true, def, qemuCaps,
parseFlags) < 0 ||
+ usbModel == VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT) {
+ addDefaultUSB = false;
+ }
+ }
+
+
if (addDefaultUSB &&
virDomainControllerFind(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0) < 0
&&
virDomainDefAddUSBController(def, 0, usbModel) < 0)
@@ -5083,7 +5099,7 @@ qemuDomainDefPostParse(virDomainDef *def,
if (qemuDomainDefBootPostParse(def, driver, parseFlags) < 0)
return -1;
- if (qemuDomainDefAddDefaultDevices(driver, def, qemuCaps) < 0)
+ if (qemuDomainDefAddDefaultDevices(driver, def, qemuCaps, parseFlags) < 0)
return -1;
if (qemuDomainDefSetDefaultCPU(def, driver->hostarch, qemuCaps) < 0)
@@ -5695,7 +5711,7 @@ qemuDomainControllerDefPostParse(virDomainControllerDef *cont,
case VIR_DOMAIN_CONTROLLER_TYPE_USB:
if (qemuCaps &&
cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT &&
- qemuDomainDefaultUSBControllerModel(&cont->model, def, qemuCaps,
parseFlags) < 0) {
+ qemuDomainDefaultUSBControllerModel(&cont->model, false, def,
qemuCaps, parseFlags) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to determine model for USB controller
idx=%1$d"),
cont->idx);
--
2.43.0