]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Move <hostdev/> PCI backend setting into qemuDomainPrepareHostdev()
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 21 Apr 2023 14:56:10 +0000 (16:56 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 25 Apr 2023 10:36:30 +0000 (12:36 +0200)
virsh command domxml-to-native failed with below error but start
command succeed for same domain xml.

  "internal error: invalid PCI passthrough type 'default'"

If a <hostdev> PCI backend is not set in the XML, the supported
one is then chosen in qemuHostdevPreparePCIDevicesCheckSupport().
But this function is not called anywhere from
qemuConnectDomainXMLToNative(). But qemuDomainPrepareHostdev()
is. And it is also called from domain startup/hotplug code.
Therefore, move the backend setting to the common path and drop
qemuHostdevPreparePCIDevicesCheckSupport().

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_hostdev.c
src/qemu/qemu_hotplug.c

index f462476d2a46fe83f1d694e86cbbe4ea5940d324..58cd3dd710b5d3612cc74dc90c82a32e052a757e 100644 (file)
@@ -11292,6 +11292,53 @@ qemuDomainPrepareHostdevSCSI(virDomainHostdevDef *hostdev,
 }
 
 
+static int
+qemuDomainPrepareHostdevPCI(virDomainHostdevDef *hostdev,
+                            virQEMUCaps *qemuCaps)
+{
+    bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
+    virDomainHostdevSubsysPCIBackendType *backend = &hostdev->source.subsys.u.pci.backend;
+
+    /* assign defaults for hostdev passthrough */
+    switch (*backend) {
+    case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
+        if (supportsPassthroughVFIO) {
+            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
+                *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
+            } else {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("VFIO PCI device assignment is not supported by this version of QEMU"));
+                return -1;
+            }
+        } else {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("host doesn't support passthrough of host PCI devices"));
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
+        if (!supportsPassthroughVFIO) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("host doesn't support VFIO PCI passthrough"));
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("host doesn't support legacy PCI passthrough"));
+        return false;
+
+    case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN:
+    case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
+        break;
+    }
+
+    return true;
+}
+
+
 int
 qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
                          qemuDomainObjPrivate *priv)
@@ -11302,8 +11349,9 @@ qemuDomainPrepareHostdev(virDomainHostdevDef *hostdev,
     switch ((virDomainHostdevSubsysType)hostdev->source.subsys.type) {
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
         return qemuDomainPrepareHostdevSCSI(hostdev, priv);
-    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+        return qemuDomainPrepareHostdevPCI(hostdev, priv->qemuCaps);
+    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
index 45cd1066f0a541de854a6e8ac0426ccd2f0cac52..49347019eac5fd63bffed8d01c807512e2d508ea 100644 (file)
@@ -153,60 +153,6 @@ qemuHostdevHostSupportsPassthroughVFIO(void)
 }
 
 
-static bool
-qemuHostdevPreparePCIDevicesCheckSupport(virDomainHostdevDef **hostdevs,
-                                         size_t nhostdevs,
-                                         virQEMUCaps *qemuCaps)
-{
-    bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
-    size_t i;
-
-    /* assign defaults for hostdev passthrough */
-    for (i = 0; i < nhostdevs; i++) {
-        virDomainHostdevDef *hostdev = hostdevs[i];
-        virDomainHostdevSubsysPCIBackendType *backend = &hostdev->source.subsys.u.pci.backend;
-
-        if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
-            continue;
-        if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
-            continue;
-
-        switch (*backend) {
-        case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
-            if (supportsPassthroughVFIO &&
-                virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
-                *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
-            } else {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("host doesn't support passthrough of "
-                                 "host PCI devices"));
-                return false;
-            }
-
-            break;
-
-        case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
-            if (!supportsPassthroughVFIO) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("host doesn't support VFIO PCI passthrough"));
-                return false;
-            }
-            break;
-
-        case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("host doesn't support legacy PCI passthrough"));
-            return false;
-
-        case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN:
-        case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
-            break;
-        }
-    }
-
-    return true;
-}
-
 int
 qemuHostdevPrepareOneNVMeDisk(virQEMUDriver *driver,
                               const char *name,
@@ -235,15 +181,11 @@ qemuHostdevPreparePCIDevices(virQEMUDriver *driver,
                              const unsigned char *uuid,
                              virDomainHostdevDef **hostdevs,
                              int nhostdevs,
-                             virQEMUCaps *qemuCaps,
+                             virQEMUCaps *qemuCaps G_GNUC_UNUSED,
                              unsigned int flags)
 {
-    virHostdevManager *hostdev_mgr = driver->hostdevMgr;
-
-    if (!qemuHostdevPreparePCIDevicesCheckSupport(hostdevs, nhostdevs, qemuCaps))
-        return -1;
-
-    return virHostdevPreparePCIDevices(hostdev_mgr, QEMU_DRIVER_NAME,
+    return virHostdevPreparePCIDevices(driver->hostdevMgr,
+                                       QEMU_DRIVER_NAME,
                                        name, uuid, hostdevs,
                                        nhostdevs, flags);
 }
index d4cded15e79194051dc2d3cf9de2e9d867f34bf5..9cefac9001895bbbdd979b6383577805befee3c9 100644 (file)
@@ -1495,7 +1495,7 @@ qemuDomainAttachHostPCIDevice(virQEMUDriver *driver,
                                      &hostdev, 1, priv->qemuCaps, flags) < 0)
         return -1;
 
-    /* this could have been changed by qemuHostdevPreparePCIDevices */
+    /* this could have been changed by qemuDomainPrepareHostdevPCI() */
     backend = hostdev->source.subsys.u.pci.backend;
 
     switch (backend) {