Some caps are cleared according to some more advanced logic after
detection. Split all that logic out into virQEMUCapsInitProcessCaps.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 85 +++++++++++++++++++++---------------
1 file changed, 50 insertions(+), 35 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 04199b1a76..0e48022fdb 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4212,6 +4212,55 @@ virQEMUCapsInitQMPVersionCaps(virQEMUCapsPtr qemuCaps)
}
+/**
+ * virQEMUCapsInitProcessCaps:
+ * @qemuCaps: QEMU capabilities
+ *
+ * Some capability bits are enabled or disabled according to specific logic.
+ * This function collects all capability processing after the capabilities
+ * are detected.
+ */
+static void
+virQEMUCapsInitProcessCaps(virQEMUCapsPtr qemuCaps)
+{
+ /* 'intel-iommu' shows up as a device since 2.2.0, but can
+ * not be used with -device until 2.7.0. Before that it
+ * requires -machine iommu=on. So we must clear the device
+ * capability we detected on older QEMUs
+ */
+ if (qemuCaps->version < 2007000 &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU)) {
+ virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU);
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU);
+ }
+
+ /* Prealloc on NVDIMMs is broken on older QEMUs leading to
+ * user data corruption. If we are dealing with such version
+ * of QEMU pretend we don't know how to NVDIMM. */
+ if (qemuCaps->version < 2009000 &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM))
+ virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM);
+
+ if (ARCH_IS_X86(qemuCaps->arch) &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_CACHE);
+
+ if (ARCH_IS_S390(qemuCaps->arch)) {
+ /* Legacy assurance for QEMU_CAPS_CCW */
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW) &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW))
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_CCW);
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW_CSSID_UNRESTRICTED))
+ virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW);
+ }
+
+ /* To avoid guest ABI regression, blockdev shall be enabled only when
+ * we are able to pass the custom 'device_id' for SCSI disks and cdroms. */
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_DISK_DEVICE_ID))
+ virQEMUCapsClear(qemuCaps, QEMU_CAPS_BLOCKDEV);
+}
+
+
static int
virQEMUCapsProbeQMPSchemaCapabilities(virQEMUCapsPtr qemuCaps,
qemuMonitorPtr mon)
@@ -4320,17 +4369,6 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
if (virQEMUCapsProbeQMPHostCPU(qemuCaps, mon, false) < 0)
goto cleanup;
- /* 'intel-iommu' shows up as a device since 2.2.0, but can
- * not be used with -device until 2.7.0. Before that it
- * requires -machine iommu=on. So we must clear the device
- * capability we detected on older QEMUs
- */
- if (qemuCaps->version < 2007000 &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU)) {
- virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_INTEL_IOMMU);
- virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU);
- }
-
/* GIC capabilities, eg. available GIC versions */
if ((qemuCaps->arch == VIR_ARCH_AARCH64 ||
qemuCaps->arch == VIR_ARCH_ARMV6L ||
@@ -4338,26 +4376,6 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
virQEMUCapsProbeQMPGICCapabilities(qemuCaps, mon) < 0)
goto cleanup;
- /* Prealloc on NVDIMMs is broken on older QEMUs leading to
- * user data corruption. If we are dealing with such version
- * of QEMU pretend we don't know how to NVDIMM. */
- if (qemuCaps->version < 2009000 &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM))
- virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_NVDIMM);
-
- if (ARCH_IS_X86(qemuCaps->arch) &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
- virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_CACHE);
-
- if (ARCH_IS_S390(qemuCaps->arch)) {
- /* Legacy assurance for QEMU_CAPS_CCW */
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW) &&
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_CCW))
- virQEMUCapsSet(qemuCaps, QEMU_CAPS_CCW);
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCW_CSSID_UNRESTRICTED))
- virQEMUCapsClear(qemuCaps, QEMU_CAPS_DEVICE_VFIO_CCW);
- }
-
/* Probe for SEV capabilities */
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEV_GUEST)) {
int rc = virQEMUCapsProbeQMPSEVCapabilities(qemuCaps, mon);
@@ -4369,10 +4387,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
virQEMUCapsClear(qemuCaps, QEMU_CAPS_SEV_GUEST);
}
- /* To avoid guest ABI regression, blockdev shall be enabled only when
- * we are able to pass the custom 'device_id' for SCSI disks and cdroms. */
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_DISK_DEVICE_ID))
- virQEMUCapsClear(qemuCaps, QEMU_CAPS_BLOCKDEV);
+ virQEMUCapsInitProcessCaps(qemuCaps);
ret = 0;
cleanup:
--
2.20.1