[PATCH v2 25/38] qemu: Validate PCI support for USB controllers

Andrea Bolognani via Devel posted 38 patches 1 week, 2 days ago
[PATCH v2 25/38] qemu: Validate PCI support for USB controllers
Posted by Andrea Bolognani via Devel 1 week, 2 days ago
Attempting to use a USB controller that's a PCI device with
a machine type that doesn't support PCI should result in an
error.

Note that, while all USB controllers supported by the libvirt
QEMU driver today are PCI devices, QEMU itself implements
machine types that come with non-PCI USB controllers. Having
a separate helper with a switch/case statement ensures that
things will need to be updated accordingly if libvirt will
ever grow support for those USB controllers.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
 src/qemu/qemu_command.c | 44 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index f48165f75c..a17e5eaaab 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2558,6 +2558,38 @@ qemuBuildFilesystemCommandLine(virCommand *cmd,
 }
 
 
+static bool
+qemuDomainControllerUSBIsPCI(const virDomainControllerDef *controller)
+{
+    switch ((virDomainControllerModelUSB)controller->model) {
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI:
+        /* The models above are PCI devices */
+        return true;
+
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2:
+        /* The models above are not relevant to the QEMU driver */
+        return false;
+
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT:
+    case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST:
+    default:
+        return false;
+    }
+}
+
+
 static int
 qemuControllerModelUSBToCaps(int model)
 {
@@ -2589,6 +2621,7 @@ qemuControllerModelUSBToCaps(int model)
 
 static int
 qemuValidateDomainDeviceDefControllerUSB(const virDomainControllerDef *controller,
+                                         const virDomainDef *def,
                                          virQEMUCaps *qemuCaps)
 {
     if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT) {
@@ -2598,6 +2631,15 @@ qemuValidateDomainDeviceDefControllerUSB(const virDomainControllerDef *controlle
         return -1;
     }
 
+    if (qemuDomainControllerUSBIsPCI(controller) &&
+        !qemuDomainSupportsPCI(def)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("USB controller model '%1$s' requires PCI but machine type '%2$s' does not support PCI"),
+                       virDomainControllerModelUSBTypeToString(controller->model),
+                       def->os.machine);
+        return -1;
+    }
+
     if (!virQEMUCapsGet(qemuCaps, qemuControllerModelUSBToCaps(controller->model))) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("USB controller model '%1$s' not supported in this QEMU binary"),
@@ -2651,7 +2693,7 @@ qemuBuildUSBControllerDevProps(const virDomainDef *domainDef,
 {
     g_autoptr(virJSONValue) props = NULL;
 
-    if (qemuValidateDomainDeviceDefControllerUSB(def, qemuCaps) < 0)
+    if (qemuValidateDomainDeviceDefControllerUSB(def, domainDef, qemuCaps) < 0)
         return NULL;
 
     if (virJSONValueObjectAdd(&props,
-- 
2.51.0
Re: [PATCH v2 25/38] qemu: Validate PCI support for USB controllers
Posted by Peter Krempa via Devel 1 day, 17 hours ago
On Thu, Sep 25, 2025 at 20:07:11 +0200, Andrea Bolognani via Devel wrote:
> Attempting to use a USB controller that's a PCI device with
> a machine type that doesn't support PCI should result in an
> error.
> 
> Note that, while all USB controllers supported by the libvirt
> QEMU driver today are PCI devices, QEMU itself implements
> machine types that come with non-PCI USB controllers. Having
> a separate helper with a switch/case statement ensures that
> things will need to be updated accordingly if libvirt will
> ever grow support for those USB controllers.
> 
> Signed-off-by: Andrea Bolognani <abologna@redhat.com>
> ---
>  src/qemu/qemu_command.c | 44 ++++++++++++++++++++++++++++++++++++++++-

Reviewed-by: Peter Krempa <pkrempa@redhat.com>