Bi-directional conversion functions.
Converts model / name and features / properties.
---
src/qemu/qemu_capabilities.c | 137 +++++++++++++++++++++++++++++------
src/qemu/qemu_capabilities.h | 3 +
2 files changed, 118 insertions(+), 22 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index da6fb1f614..89a313b55d 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2737,7 +2737,7 @@ virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
virCPUDefPtr cpu,
bool migratable)
{
- size_t i;
+ virCPUDefPtr tmp = NULL;
if (!modelInfo) {
if (type == VIR_DOMAIN_VIRT_KVM) {
@@ -2750,30 +2750,12 @@ virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
return 2;
}
- if (VIR_STRDUP(cpu->model, modelInfo->name) < 0 ||
- VIR_ALLOC_N(cpu->features, modelInfo->nprops) < 0)
+ if (!(tmp = virQEMUCapsCPUModelInfoToCPUDef(migratable, modelInfo)))
return -1;
- cpu->nfeatures_max = modelInfo->nprops;
- cpu->nfeatures = 0;
-
- for (i = 0; i < modelInfo->nprops; i++) {
- virCPUFeatureDefPtr feature = cpu->features + cpu->nfeatures;
- qemuMonitorCPUPropertyPtr prop = modelInfo->props + i;
+ *cpu = *tmp;
- if (prop->type != QEMU_MONITOR_CPU_PROPERTY_BOOLEAN)
- continue;
-
- if (VIR_STRDUP(feature->name, prop->name) < 0)
- return -1;
-
- if (!prop->value.boolean ||
- (migratable && prop->migratable == VIR_TRISTATE_BOOL_NO))
- feature->policy = VIR_CPU_FEATURE_DISABLE;
- else
- feature->policy = VIR_CPU_FEATURE_REQUIRE;
- cpu->nfeatures++;
- }
+ VIR_FREE(tmp);
return 0;
}
@@ -3526,6 +3508,117 @@ virQEMUCapsLoadCache(virArch hostArch,
return ret;
}
+/* virCPUDef model => qemuMonitorCPUModelInfo name
+ * virCPUDef features => qemuMonitorCPUModelInfo boolean properties */
+qemuMonitorCPUModelInfoPtr
+virQEMUCapsCPUModelInfoFromCPUDef(const virCPUDef *cpuDef)
+{
+ size_t i;
+ qemuMonitorCPUModelInfoPtr cpuModel = NULL;
+ qemuMonitorCPUModelInfoPtr ret = NULL;
+
+ if (!cpuDef || (VIR_ALLOC(cpuModel) < 0))
+ goto cleanup;
+
+ VIR_DEBUG("cpuDef->model = %s", NULLSTR(cpuDef->model));
+
+ if (VIR_STRDUP(cpuModel->name, cpuDef->model) < 0 ||
+ VIR_ALLOC_N(cpuModel->props, cpuDef->nfeatures) < 0)
+ goto cleanup;
+
+ /* no visibility on migratability of properties / features */
+ cpuModel->props_migratable_valid = false;
+
+ cpuModel->nprops = 0;
+
+ for (i = 0; i < cpuDef->nfeatures; i++) {
+ qemuMonitorCPUPropertyPtr prop = &(cpuModel->props[cpuModel->nprops]);
+ virCPUFeatureDefPtr feature = &(cpuDef->features[i]);
+
+ if (!feature || !(feature->name))
+ continue;
+
+ if (VIR_STRDUP(prop->name, feature->name) < 0)
+ goto cleanup;
+
+ prop->migratable = VIR_TRISTATE_BOOL_ABSENT;
+ prop->type = QEMU_MONITOR_CPU_PROPERTY_BOOLEAN;
+
+ switch (feature->policy) {
+ case VIR_CPU_FEATURE_FORCE:
+ case VIR_CPU_FEATURE_REQUIRE:
+ prop->value.boolean = true;
+ break;
+
+ case VIR_CPU_FEATURE_FORBID:
+ case VIR_CPU_FEATURE_DISABLE:
+ case VIR_CPU_FEATURE_OPTIONAL:
+ case VIR_CPU_FEATURE_LAST:
+ prop->value.boolean = false;
+ break;
+ }
+
+ cpuModel->nprops += 1;
+ }
+
+ VIR_STEAL_PTR(ret, cpuModel);
+
+ cleanup:
+ qemuMonitorCPUModelInfoFree(cpuModel);
+ return ret;
+}
+
+
+/* qemuMonitorCPUModelInfo name => virCPUDef model
+ * qemuMonitorCPUModelInfo boolean properties => virCPUDef features
+ *
+ * migratable_only true: mark non-migratable features as disabled
+ * false: allow all features as required
+ */
+virCPUDefPtr
+virQEMUCapsCPUModelInfoToCPUDef(bool migratable_only, qemuMonitorCPUModelInfoPtr model)
+{
+ virCPUDefPtr cpu = NULL;
+ virCPUDefPtr ret = NULL;
+ size_t i;
+
+ if (!model || (VIR_ALLOC(cpu) < 0))
+ goto cleanup;
+
+ VIR_DEBUG("model->name= %s", NULLSTR(model->name));
+
+ if (VIR_STRDUP(cpu->model, model->name) < 0 ||
+ VIR_ALLOC_N(cpu->features, model->nprops) < 0)
+ goto cleanup;
+
+ cpu->nfeatures_max = model->nprops;
+ cpu->nfeatures = 0;
+
+ for (i = 0; i < model->nprops; i++) {
+ virCPUFeatureDefPtr feature = cpu->features + cpu->nfeatures;
+ qemuMonitorCPUPropertyPtr prop = model->props + i;
+
+ if (prop->type != QEMU_MONITOR_CPU_PROPERTY_BOOLEAN)
+ continue;
+
+ if (VIR_STRDUP(feature->name, prop->name) < 0)
+ goto cleanup;
+
+ if (!prop->value.boolean ||
+ (migratable_only && prop->migratable == VIR_TRISTATE_BOOL_NO))
+ feature->policy = VIR_CPU_FEATURE_DISABLE;
+ else
+ feature->policy = VIR_CPU_FEATURE_REQUIRE;
+
+ cpu->nfeatures++;
+ }
+
+ VIR_STEAL_PTR(ret, cpu);
+
+ cleanup:
+ virCPUDefFree(cpu);
+ return ret;
+}
static void
virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 3519a194e9..af263c9780 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -562,6 +562,9 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
const char *machineType);
+qemuMonitorCPUModelInfoPtr virQEMUCapsCPUModelInfoFromCPUDef(const virCPUDef *cpuDef);
+virCPUDefPtr virQEMUCapsCPUModelInfoToCPUDef(bool migratable_only,
qemuMonitorCPUModelInfoPtr model);
+
virFileCachePtr virQEMUCapsCacheNew(const char *libDir,
const char *cacheDir,
uid_t uid,
--
2.17.1