[PATCH 07/15] qemu: move qemuDomainDeviceDefValidateHostdev() to qemu_validate.c

Daniel Henrique Barboza danielhb413 at gmail.com
Thu Mar 26 21:31:17 UTC 2020


This function alone requires other 3 static functions to be
moved as well, thus let's move it in its own patch.

Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
---
 src/qemu/qemu_domain.c   | 190 +--------------------------------------
 src/qemu/qemu_validate.c | 188 ++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_validate.h |   3 +
 3 files changed, 192 insertions(+), 189 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 4726fa015d..25b889b2d6 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -5245,194 +5245,6 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net,
 }
 
 
-static int
-qemuDomainMdevDefVFIOPCIValidate(const virDomainHostdevDef *hostdev,
-                                 const virDomainDef *def,
-                                 virQEMUCapsPtr qemuCaps)
-{
-    const virDomainHostdevSubsysMediatedDev *dev;
-
-    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("VFIO PCI device assignment is not "
-                         "supported by this version of QEMU"));
-        return -1;
-    }
-
-    /* VFIO-PCI does not support boot */
-    if (hostdev->info->bootIndex) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("booting from assigned devices is not "
-                         "supported by mediated devices of "
-                         "model vfio-pci"));
-        return -1;
-    }
-
-    dev = &hostdev->source.subsys.u.mdev;
-    if (dev->display == VIR_TRISTATE_SWITCH_ABSENT)
-        return 0;
-
-    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY)) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("display property of device vfio-pci is "
-                         "not supported by this version of QEMU"));
-        return -1;
-    }
-
-    if (dev->model != VIR_MDEV_MODEL_TYPE_VFIO_PCI) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("<hostdev> attribute 'display' is only supported"
-                         " with model='vfio-pci'"));
-
-        return -1;
-    }
-
-    if (dev->display == VIR_TRISTATE_SWITCH_ON) {
-        if (def->ngraphics == 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("graphics device is needed for attribute value "
-                             "'display=on' in <hostdev>"));
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-
-static int
-qemuDomainMdevDefVFIOAPValidate(const virDomainHostdevDef *hostdev,
-                                const virDomainDef *def,
-                                virQEMUCapsPtr qemuCaps)
-{
-    size_t i;
-    bool vfioap_found = false;
-
-    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_AP)) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("VFIO AP device assignment is not "
-                         "supported by this version of QEMU"));
-        return -1;
-    }
-
-    /* VFIO-AP does not support boot */
-    if (hostdev->info->bootIndex) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("booting from assigned devices is not "
-                         "supported by mediated devices of "
-                         "model vfio-ap"));
-        return -1;
-    }
-
-    /* VFIO-AP is restricted to a single mediated device only */
-    for (i = 0; i < def->nhostdevs; i++) {
-        virDomainHostdevDefPtr hdev = def->hostdevs[i];
-
-        if (virHostdevIsMdevDevice(hdev) &&
-            hdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
-            if (vfioap_found) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("Only one hostdev of model vfio-ap is "
-                                 "supported"));
-                return -1;
-            }
-            vfioap_found = true;
-        }
-    }
-
-    return 0;
-}
-
-
-static int
-qemuDomainMdevDefValidate(const virDomainHostdevDef *hostdev,
-                          const virDomainDef *def,
-                          virQEMUCapsPtr qemuCaps)
-{
-    const virDomainHostdevSubsysMediatedDev *mdevsrc;
-
-    mdevsrc = &hostdev->source.subsys.u.mdev;
-    switch ((virMediatedDeviceModelType) mdevsrc->model) {
-    case VIR_MDEV_MODEL_TYPE_VFIO_PCI:
-        return qemuDomainMdevDefVFIOPCIValidate(hostdev, def, qemuCaps);
-    case VIR_MDEV_MODEL_TYPE_VFIO_AP:
-        return qemuDomainMdevDefVFIOAPValidate(hostdev, def, qemuCaps);
-    case VIR_MDEV_MODEL_TYPE_VFIO_CCW:
-        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("VFIO CCW device assignment is not "
-                             "supported by this version of QEMU"));
-            return -1;
-        }
-        break;
-    case VIR_MDEV_MODEL_TYPE_LAST:
-    default:
-        virReportEnumRangeError(virMediatedDeviceModelType,
-                                mdevsrc->model);
-        return -1;
-    }
-
-    return 0;
-}
-
-
-static int
-qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev,
-                                   const virDomainDef *def,
-                                   virQEMUCapsPtr qemuCaps)
-{
-    int backend;
-
-    /* forbid capabilities mode hostdev in this kind of hypervisor */
-    if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("hostdev mode 'capabilities' is not "
-                         "supported in %s"),
-                       virDomainVirtTypeToString(def->virtType));
-        return -1;
-    }
-
-    if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
-        switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
-            break;
-
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
-            backend = hostdev->source.subsys.u.pci.backend;
-
-            if (backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
-                if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
-                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                                   _("VFIO PCI device assignment is not "
-                                     "supported by this version of qemu"));
-                    return -1;
-                }
-            }
-            break;
-
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
-            if (hostdev->info->bootIndex) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("booting from assigned devices is not "
-                                 "supported by vhost SCSI devices"));
-                return -1;
-            }
-            break;
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
-            return qemuDomainMdevDefValidate(hostdev, def, qemuCaps);
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
-        default:
-            virReportEnumRangeError(virDomainHostdevSubsysType,
-                                    hostdev->source.subsys.type);
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-
 static int
 qemuDomainDeviceDefValidateVideo(const virDomainVideoDef *video,
                                  virQEMUCapsPtr qemuCaps)
@@ -7256,7 +7068,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
         break;
 
     case VIR_DOMAIN_DEVICE_HOSTDEV:
-        ret = qemuDomainDeviceDefValidateHostdev(dev->data.hostdev, def,
+        ret = qemuValidateDomainDeviceDefHostdev(dev->data.hostdev, def,
                                                  qemuCaps);
         break;
 
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 9b67c753c2..62ecca3c84 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -1531,3 +1531,191 @@ qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev,
 
     return 0;
 }
+
+
+static int
+qemuValidateDomainMdevDefVFIOPCI(const virDomainHostdevDef *hostdev,
+                                 const virDomainDef *def,
+                                 virQEMUCapsPtr qemuCaps)
+{
+    const virDomainHostdevSubsysMediatedDev *dev;
+
+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("VFIO PCI device assignment is not "
+                         "supported by this version of QEMU"));
+        return -1;
+    }
+
+    /* VFIO-PCI does not support boot */
+    if (hostdev->info->bootIndex) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("booting from assigned devices is not "
+                         "supported by mediated devices of "
+                         "model vfio-pci"));
+        return -1;
+    }
+
+    dev = &hostdev->source.subsys.u.mdev;
+    if (dev->display == VIR_TRISTATE_SWITCH_ABSENT)
+        return 0;
+
+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("display property of device vfio-pci is "
+                         "not supported by this version of QEMU"));
+        return -1;
+    }
+
+    if (dev->model != VIR_MDEV_MODEL_TYPE_VFIO_PCI) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("<hostdev> attribute 'display' is only supported"
+                         " with model='vfio-pci'"));
+
+        return -1;
+    }
+
+    if (dev->display == VIR_TRISTATE_SWITCH_ON) {
+        if (def->ngraphics == 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("graphics device is needed for attribute value "
+                             "'display=on' in <hostdev>"));
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+
+static int
+qemuValidateDomainMdevDefVFIOAP(const virDomainHostdevDef *hostdev,
+                                const virDomainDef *def,
+                                virQEMUCapsPtr qemuCaps)
+{
+    size_t i;
+    bool vfioap_found = false;
+
+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_AP)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("VFIO AP device assignment is not "
+                         "supported by this version of QEMU"));
+        return -1;
+    }
+
+    /* VFIO-AP does not support boot */
+    if (hostdev->info->bootIndex) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("booting from assigned devices is not "
+                         "supported by mediated devices of "
+                         "model vfio-ap"));
+        return -1;
+    }
+
+    /* VFIO-AP is restricted to a single mediated device only */
+    for (i = 0; i < def->nhostdevs; i++) {
+        virDomainHostdevDefPtr hdev = def->hostdevs[i];
+
+        if (virHostdevIsMdevDevice(hdev) &&
+            hdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
+            if (vfioap_found) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("Only one hostdev of model vfio-ap is "
+                                 "supported"));
+                return -1;
+            }
+            vfioap_found = true;
+        }
+    }
+
+    return 0;
+}
+
+
+static int
+qemuValidateDomainMdevDef(const virDomainHostdevDef *hostdev,
+                          const virDomainDef *def,
+                          virQEMUCapsPtr qemuCaps)
+{
+    const virDomainHostdevSubsysMediatedDev *mdevsrc;
+
+    mdevsrc = &hostdev->source.subsys.u.mdev;
+    switch ((virMediatedDeviceModelType) mdevsrc->model) {
+    case VIR_MDEV_MODEL_TYPE_VFIO_PCI:
+        return qemuValidateDomainMdevDefVFIOPCI(hostdev, def, qemuCaps);
+    case VIR_MDEV_MODEL_TYPE_VFIO_AP:
+        return qemuValidateDomainMdevDefVFIOAP(hostdev, def, qemuCaps);
+    case VIR_MDEV_MODEL_TYPE_VFIO_CCW:
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("VFIO CCW device assignment is not "
+                             "supported by this version of QEMU"));
+            return -1;
+        }
+        break;
+    case VIR_MDEV_MODEL_TYPE_LAST:
+    default:
+        virReportEnumRangeError(virMediatedDeviceModelType,
+                                mdevsrc->model);
+        return -1;
+    }
+
+    return 0;
+}
+
+
+int
+qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
+                                   const virDomainDef *def,
+                                   virQEMUCapsPtr qemuCaps)
+{
+    int backend;
+
+    /* forbid capabilities mode hostdev in this kind of hypervisor */
+    if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("hostdev mode 'capabilities' is not "
+                         "supported in %s"),
+                       virDomainVirtTypeToString(def->virtType));
+        return -1;
+    }
+
+    if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
+        switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+            break;
+
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+            backend = hostdev->source.subsys.u.pci.backend;
+
+            if (backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
+                if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                                   _("VFIO PCI device assignment is not "
+                                     "supported by this version of qemu"));
+                    return -1;
+                }
+            }
+            break;
+
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+            if (hostdev->info->bootIndex) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("booting from assigned devices is not "
+                                 "supported by vhost SCSI devices"));
+                return -1;
+            }
+            break;
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+            return qemuValidateDomainMdevDef(hostdev, def, qemuCaps);
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
+        default:
+            virReportEnumRangeError(virDomainHostdevSubsysType,
+                                    hostdev->source.subsys.type);
+            return -1;
+        }
+    }
+
+    return 0;
+}
diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h
index d2238445be..ca1449c27f 100644
--- a/src/qemu/qemu_validate.h
+++ b/src/qemu/qemu_validate.h
@@ -41,3 +41,6 @@ int qemuValidateDomainRedirdevDef(const virDomainRedirdevDef *def,
                                   virQEMUCapsPtr qemuCaps);
 int qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev,
                                   const virDomainDef *def);
+int qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
+                                       const virDomainDef *def,
+                                       virQEMUCapsPtr qemuCaps);
-- 
2.25.1





More information about the libvir-list mailing list