A Full CPUModelInfo structure with props is sent to QEMU for expansion.
Signed-off-by: Chris Venteicher <cventeic(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 8 +++++---
src/qemu/qemu_monitor.c | 20 +++++++++++++++-----
src/qemu/qemu_monitor.h | 5 +++--
src/qemu/qemu_monitor_json.c | 12 +++++++-----
src/qemu/qemu_monitor_json.h | 4 ++--
tests/cputest.c | 11 ++++++++---
6 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index cd8d1439f6..463c803416 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2476,6 +2476,7 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
qemuMonitorPtr mon,
bool tcg)
{
+ qemuMonitorCPUModelInfoPtr input;
qemuMonitorCPUModelInfoPtr migratable = NULL;
qemuMonitorCPUModelInfoPtr nonMigratable = NULL;
qemuMonitorCPUModelInfoPtr augmented = NULL;
@@ -2508,7 +2509,8 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
else
type = QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC;
- if (qemuMonitorGetCPUModelExpansion(mon, type, model, true, &migratable) < 0)
+ if (!(input = qemuMonitorCPUModelInfoNew(model)) ||
+ qemuMonitorGetCPUModelExpansion(mon, type, input, true, &migratable) < 0)
goto cleanup;
if (!migratable) {
@@ -2517,8 +2519,7 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
}
/* Try to check migratability of each feature. */
- if (qemuMonitorGetCPUModelExpansion(mon, type, model, false,
- &nonMigratable) < 0)
+ if (qemuMonitorGetCPUModelExpansion(mon, type, input, false, &nonMigratable) <
0)
goto cleanup;
if (virQEMUCapsMigratablePropsCalc(migratable, nonMigratable, &augmented) <
0)
@@ -2528,6 +2529,7 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
ret = 0;
cleanup:
+ qemuMonitorCPUModelInfoFree(input);
qemuMonitorCPUModelInfoFree(migratable);
qemuMonitorCPUModelInfoFree(nonMigratable);
qemuMonitorCPUModelInfoFree(augmented);
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index ac9fc1cdc2..d6bb2488d1 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3669,20 +3669,30 @@ qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu)
}
+/**
+ * qemuMonitorGetCPUModelExpansion:
+ * @mon:
+ * @type: qemuMonitorCPUModelExpansionType
+ * @input: Input model
+ * @migratable: Prompt QEMU to include non-migratable props for X86 models if false
+ * @expansion: Expanded output model (or NULL if QEMU rejects model or request)
+ *
+ * Re-represent @input CPU props using a new constructed CPUModelInfo
+*/
int
qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ qemuMonitorCPUModelInfoPtr input,
bool migratable,
- qemuMonitorCPUModelInfoPtr *model_info)
+ qemuMonitorCPUModelInfoPtr *expansion
+ )
{
VIR_DEBUG("type=%d model_name=%s migratable=%d",
- type, model_name, migratable);
+ type, input->name, migratable);
QEMU_CHECK_MONITOR(mon);
- return qemuMonitorJSONGetCPUModelExpansion(mon, type, model_name,
- migratable, model_info);
+ return qemuMonitorJSONGetCPUModelExpansion(mon, type, input, migratable, expansion);
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index bb74f29cb4..4440e2f3d6 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1061,9 +1061,10 @@ typedef enum {
int qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ qemuMonitorCPUModelInfoPtr input,
bool migratable,
- qemuMonitorCPUModelInfoPtr *model_info);
+ qemuMonitorCPUModelInfoPtr *expansion)
+ ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(5);
void qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfoPtr model_info);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index a3998decf0..e5e56747a7 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5637,12 +5637,13 @@ qemuMonitorJSONBuildCPUModelInfoFromJSON(virJSONValuePtr
cpu_model)
return ret;
}
+
int
qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ qemuMonitorCPUModelInfoPtr input,
bool migratable,
- qemuMonitorCPUModelInfoPtr *model_info)
+ qemuMonitorCPUModelInfoPtr *expansion)
{
int ret = -1;
virJSONValuePtr json_model_in = NULL;
@@ -5653,9 +5654,9 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelInfoPtr model_in = NULL;
const char *typeStr = "";
- *model_info = NULL;
+ *expansion = NULL;
- if (!(model_in = qemuMonitorCPUModelInfoNew(model_name)))
+ if (!(model_in = qemuMonitorCPUModelInfoCopy(input)))
goto cleanup;
if (!migratable &&
@@ -5721,13 +5722,14 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
goto retry;
}
- if (!(*model_info = qemuMonitorJSONBuildCPUModelInfoFromJSON(cpu_model)))
+ if (!(*expansion = qemuMonitorJSONBuildCPUModelInfoFromJSON(cpu_model)))
goto cleanup;
ret = 0;
cleanup:
qemuMonitorCPUModelInfoFree(model_in);
+
virJSONValueFree(cmd);
virJSONValueFree(reply);
virJSONValueFree(json_model_in);
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 62772228fe..731f1ec010 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -364,9 +364,9 @@ int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
int qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ qemuMonitorCPUModelInfoPtr input,
bool migratable,
- qemuMonitorCPUModelInfoPtr *model_info)
+ qemuMonitorCPUModelInfoPtr *expansion)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(5);
int qemuMonitorJSONGetCommands(qemuMonitorPtr mon,
diff --git a/tests/cputest.c b/tests/cputest.c
index b75d864d8e..228f737824 100644
--- a/tests/cputest.c
+++ b/tests/cputest.c
@@ -480,6 +480,7 @@ cpuTestMakeQEMUCaps(const struct data *data)
virQEMUCapsPtr qemuCaps = NULL;
qemuMonitorTestPtr testMon = NULL;
qemuMonitorCPUModelInfoPtr model = NULL;
+ qemuMonitorCPUModelInfoPtr expansion = NULL;
char *json = NULL;
if (virAsprintf(&json, "%s/cputestdata/%s-cpuid-%s.json",
@@ -489,9 +490,12 @@ cpuTestMakeQEMUCaps(const struct data *data)
if (!(testMon = qemuMonitorTestNewFromFile(json, driver.xmlopt, true)))
goto error;
+ if (!(model = qemuMonitorCPUModelInfoNew("host")))
+ goto cleanup;
+
if (qemuMonitorGetCPUModelExpansion(qemuMonitorTestGetMonitor(testMon),
QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC,
- "host", true, &model) < 0)
+ model, true, &expansion) < 0)
goto error;
if (!(qemuCaps = virQEMUCapsNew()))
@@ -503,8 +507,8 @@ cpuTestMakeQEMUCaps(const struct data *data)
virQEMUCapsSet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS);
virQEMUCapsSetArch(qemuCaps, data->arch);
- virQEMUCapsSetCPUModelInfo(qemuCaps, VIR_DOMAIN_VIRT_KVM, model);
- model = NULL;
+ virQEMUCapsSetCPUModelInfo(qemuCaps, VIR_DOMAIN_VIRT_KVM, expansion);
+ expansion = NULL;
if (virQEMUCapsProbeQMPCPUDefinitions(qemuCaps,
qemuMonitorTestGetMonitor(testMon),
@@ -513,6 +517,7 @@ cpuTestMakeQEMUCaps(const struct data *data)
cleanup:
qemuMonitorCPUModelInfoFree(model);
+ qemuMonitorCPUModelInfoFree(expansion);
qemuMonitorTestFree(testMon);
VIR_FREE(json);
--
2.17.1