When expanding a CPU model via query-cpu-model-expansion, any features
that were a part of the original model are discarded. For exmaple,
when expanding modelA with features f1, f2, a full expansion may reveal
feature f3, but the expanded model will not include f1 or f2.
Let's pass a virCPUDefPtr to the expansion function in preparation for
taking features into consideration.
Signed-off-by: Collin Walling <walling(a)linux.ibm.com>
---
src/qemu/qemu_capabilities.c | 9 +++++++--
src/qemu/qemu_monitor.c | 7 +++----
src/qemu/qemu_monitor.h | 2 +-
src/qemu/qemu_monitor_json.c | 8 ++++----
src/qemu/qemu_monitor_json.h | 2 +-
tests/cputest.c | 7 ++++++-
6 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 9b19930..bc0ac3d 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2497,6 +2497,7 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
qemuMonitorCPUModelInfoPtr nonMigratable = NULL;
virHashTablePtr hash = NULL;
const char *model;
+ virCPUDefPtr cpu;
qemuMonitorCPUModelExpansionType type;
virDomainVirtType virtType;
int ret = -1;
@@ -2512,6 +2513,9 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
model = "host";
}
+ if (VIR_ALLOC(cpu) < 0 || VIR_STRDUP(cpu->model, model) < 0)
+ goto cleanup;
+
/* Some x86_64 features defined in cpu_map.xml use spelling which differ
* from the one preferred by QEMU. Static expansion would give us only the
* preferred spelling. With new QEMU we always use the QEMU's canonical
@@ -2525,12 +2529,12 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
else
type = QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC;
- if (qemuMonitorGetCPUModelExpansion(mon, type, model, true, &modelInfo) < 0)
+ if (qemuMonitorGetCPUModelExpansion(mon, type, cpu, true, &modelInfo) < 0)
goto cleanup;
/* Try to check migratability of each feature. */
if (modelInfo &&
- qemuMonitorGetCPUModelExpansion(mon, type, model, false,
+ qemuMonitorGetCPUModelExpansion(mon, type, cpu, false,
&nonMigratable) < 0)
goto cleanup;
@@ -2574,6 +2578,7 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
virHashFree(hash);
qemuMonitorCPUModelInfoFree(nonMigratable);
qemuMonitorCPUModelInfoFree(modelInfo);
+ virCPUDefFree(cpu);
return ret;
}
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index aa230b3..7b454c2 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3716,16 +3716,15 @@ qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu)
int
qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ virCPUDefPtr cpu,
bool migratable,
qemuMonitorCPUModelInfoPtr *model_info)
{
- VIR_DEBUG("type=%d model_name=%s migratable=%d",
- type, model_name, migratable);
+ VIR_DEBUG("type=%d cpu=%p migratable=%d", type, cpu, migratable);
QEMU_CHECK_MONITOR(mon);
- return qemuMonitorJSONGetCPUModelExpansion(mon, type, model_name,
+ return qemuMonitorJSONGetCPUModelExpansion(mon, type, cpu,
migratable, model_info);
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 70000a1..672b4f9 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1157,7 +1157,7 @@ typedef enum {
int qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ virCPUDefPtr cpu,
bool migratable,
qemuMonitorCPUModelInfoPtr *model_info);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 3282593..3c6c330 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5782,7 +5782,7 @@ qemuMonitorJSONParseCPUModelProperty(const char *key,
static virJSONValuePtr
-qemuMonitorJSONMakeCPUModel(const char *model_name,
+qemuMonitorJSONMakeCPUModel(virCPUDefPtr cpu,
bool migratable)
{
virJSONValuePtr model = NULL;
@@ -5791,7 +5791,7 @@ qemuMonitorJSONMakeCPUModel(const char *model_name,
if (!(model = virJSONValueNewObject()))
goto error;
- if (virJSONValueObjectAppendString(model, "name", model_name) < 0)
+ if (virJSONValueObjectAppendString(model, "name", cpu->model) < 0)
goto error;
if (!migratable) {
@@ -5873,7 +5873,7 @@ qemuMonitorJSONParseCPUModel(const char *cpu_name,
int
qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ virCPUDefPtr cpu,
bool migratable,
qemuMonitorCPUModelInfoPtr *model_info)
{
@@ -5888,7 +5888,7 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
*model_info = NULL;
- if (!(model = qemuMonitorJSONMakeCPUModel(model_name, migratable)))
+ if (!(model = qemuMonitorJSONMakeCPUModel(cpu, migratable)))
return -1;
retry:
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 61e64e8..bdccd36 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -390,7 +390,7 @@ int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
int qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
qemuMonitorCPUModelExpansionType type,
- const char *model_name,
+ virCPUDefPtr cpu,
bool migratable,
qemuMonitorCPUModelInfoPtr *model_info)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(5);
diff --git a/tests/cputest.c b/tests/cputest.c
index 7037bcc..3c17ed4 100644
--- a/tests/cputest.c
+++ b/tests/cputest.c
@@ -481,6 +481,7 @@ cpuTestMakeQEMUCaps(const struct data *data)
virQEMUCapsPtr qemuCaps = NULL;
qemuMonitorTestPtr testMon = NULL;
qemuMonitorCPUModelInfoPtr model = NULL;
+ virCPUDefPtr cpu = NULL;
char *json = NULL;
if (virAsprintf(&json, "%s/cputestdata/%s-cpuid-%s.json",
@@ -490,9 +491,12 @@ cpuTestMakeQEMUCaps(const struct data *data)
if (!(testMon = qemuMonitorTestNewFromFile(json, driver.xmlopt, true)))
goto error;
+ if (VIR_ALLOC(cpu) < 0 || VIR_STRDUP(cpu->model, "host") < 0)
+ goto cleanup;
+
if (qemuMonitorGetCPUModelExpansion(qemuMonitorTestGetMonitor(testMon),
QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC,
- "host", true, &model) < 0)
+ cpu, true, &model) < 0)
goto error;
if (!(qemuCaps = virQEMUCapsNew()))
@@ -515,6 +519,7 @@ cpuTestMakeQEMUCaps(const struct data *data)
cleanup:
qemuMonitorCPUModelInfoFree(model);
qemuMonitorTestFree(testMon);
+ virCPUDefFree(cpu);
VIR_FREE(json);
return qemuCaps;
--
2.7.4