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(a)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