[PATCH v2 0/5] Allow Guest CPU Model with Deprecated Features Disabled

# Changelog v2 - rebased on latest master changes # Description Add support for libvirt to query and cache an array of deprecated CPU features (aka CPU properties) for the host-model. This data is queried via a full query-cpu-model-expansion and cached in the QEMU capabilities file. This model expansion will depend on the availability of the "deprecated-props" field resulting from a query-cpu-model-expansion command. Currently, only s390x supports this field. The purpose of these patches is to make it easy for users to create guests with a CPU model that will be compatible & migratable with future hardware. An updated host CPU model with deprecated features paired with the policy "disable" may be visable via an update to the virsh domcapabilities command with the --disable-deprecated-features flag. An example is shown below. Note: other CPU model queries (e.g. baseline and comparison) currently do not consider deprecated features, as their outputs do not consider feature policy. If implementation is desired, it will require a discussion on how these commands should report policies. Examples: virsh domcapabilities --disable-deprecated-features e.g. output (trimmed): <mode name='host-model' supported='yes'> <model fallback='forbid'>z14.2-base</model> <feature policy='require' name='aen'/> <feature policy='require' name='cmmnt'/> <feature policy='require' name='aefsi'/> <feature policy='require' name='diag318'/> <feature policy='require' name='mepoch'/> <feature policy='require' name='msa8'/> <feature policy='require' name='msa7'/> <feature policy='require' name='msa6'/> <feature policy='require' name='msa5'/> <feature policy='require' name='msa4'/> <feature policy='require' name='msa3'/> <feature policy='require' name='msa2'/> <feature policy='require' name='msa1'/> <feature policy='require' name='sthyi'/> <feature policy='require' name='edat'/> <feature policy='require' name='ri'/> <feature policy='require' name='edat2'/> <feature policy='require' name='etoken'/> <feature policy='require' name='vx'/> <feature policy='require' name='ipter'/> <feature policy='require' name='mepochptff'/> <feature policy='require' name='ap'/> <feature policy='require' name='vxeh'/> <feature policy='require' name='vxpd'/> <feature policy='require' name='esop'/> <feature policy='require' name='apqi'/> <feature policy='require' name='apft'/> <feature policy='require' name='els'/> <feature policy='require' name='iep'/> <feature policy='require' name='apqci'/> <feature policy='disable' name='cte'/> <feature policy='require' name='ais'/> <feature policy='disable' name='bpb'/> <feature policy='require' name='ctop'/> <feature policy='require' name='gs'/> <feature policy='require' name='ppa15'/> <feature policy='require' name='zpci'/> <feature policy='require' name='sea_esop2'/> <feature policy='disable' name='te'/> <feature policy='require' name='cmm'/> <feature policy='disable' name='csske'/> </mode> A domain may be defined with a new <cpu> XML attribute, deprecated_features='on|off': <cpu mode='host-model' check='partial' deprecated_features='off'/> e.g. after guest has started (trimmed): <cpu mode='custom' match='exact' check='partial' deprecated_features='off'> <model fallback='forbid'>z14.2-base</model> <feature policy='require' name='aen'/> <feature policy='require' name='cmmnt'/> <feature policy='require' name='aefsi'/> <feature policy='require' name='diag318'/> <feature policy='require' name='mepoch'/> <feature policy='require' name='msa8'/> <feature policy='require' name='msa7'/> <feature policy='require' name='msa6'/> <feature policy='require' name='msa5'/> <feature policy='require' name='msa4'/> <feature policy='require' name='msa3'/> <feature policy='require' name='msa2'/> <feature policy='require' name='msa1'/> <feature policy='require' name='sthyi'/> <feature policy='require' name='edat'/> <feature policy='require' name='ri'/> <feature policy='require' name='edat2'/> <feature policy='require' name='etoken'/> <feature policy='require' name='vx'/> <feature policy='require' name='ipter'/> <feature policy='require' name='mepochptff'/> <feature policy='require' name='ap'/> <feature policy='require' name='vxeh'/> <feature policy='require' name='vxpd'/> <feature policy='require' name='esop'/> <feature policy='require' name='apqi'/> <feature policy='require' name='apft'/> <feature policy='require' name='els'/> <feature policy='require' name='iep'/> <feature policy='require' name='apqci'/> <feature policy='disable' name='cte'/> <feature policy='require' name='ais'/> <feature policy='disable' name='bpb'/> <feature policy='require' name='ctop'/> <feature policy='require' name='gs'/> <feature policy='require' name='ppa15'/> <feature policy='require' name='zpci'/> <feature policy='require' name='sea_esop2'/> <feature policy='disable' name='te'/> <feature policy='require' name='cmm'/> <feature policy='disable' name='csske'/> </cpu> Collin Walling (5): qemuMonitorJSONGetCPUModelExpansion: refactor parsing functions qemu: parse deprecated-props from query-cpu-model-expansion response qemu_capabilities: query deprecated features for host-model virsh: add --disable-deprecated-features flag to domcapabilities conf: add deprecated_features attribute docs/manpages/virsh.rst | 6 + include/libvirt/libvirt-domain.h | 12 + src/conf/cpu_conf.c | 10 + src/conf/cpu_conf.h | 1 + src/conf/schemas/cputypes.rng | 12 + src/libvirt-domain.c | 2 +- src/qemu/qemu_capabilities.c | 89 +++++ src/qemu/qemu_capabilities.h | 4 + src/qemu/qemu_driver.c | 8 +- src/qemu/qemu_monitor.c | 10 + src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 64 +++- src/qemu/qemu_process.c | 4 + .../caps_9.1.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 13 + .../caps_9.2.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 13 + tools/virsh-host.c | 9 +- 18 files changed, 940 insertions(+), 14 deletions(-) -- 2.45.1

Refactor the CPU Model parsing functions within qemuMonitorJSONGetCPUModelExpansion. The new functions, qemuMonitorJSONParseCPUModelExpansionData and qemuMonitorJSONParseCPUModelExpansion invoke the functions they replace and leave room for a subsequent patch to handle parsing the (optional) deprecated_props field resulting from the command. Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_monitor_json.c | 46 ++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 1b4288b744..fa8c5b1aea 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5100,6 +5100,37 @@ qemuMonitorJSONParseCPUModel(const char *cpu_name, } +static int +qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, + bool fail_no_props, + virJSONValue **cpu_model, + virJSONValue **cpu_props, + const char **cpu_name) +{ + if (qemuMonitorJSONParseCPUModelData(data, "query-cpu-model-expansion", + fail_no_props, cpu_model, cpu_props, + cpu_name) < 0) + return -1; + + return 0; +} + + +static int +qemuMonitorJSONParseCPUModelExpansion(const char *cpu_name, + virJSONValue *cpu_props, + qemuMonitorCPUModelInfo **model_info) +{ + g_autoptr(qemuMonitorCPUModelInfo) expanded_model = NULL; + + if (qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, &expanded_model) < 0) + return -1; + + *model_info = g_steal_pointer(&expanded_model); + return 0; +} + + static int qemuMonitorJSONQueryCPUModelExpansionOne(qemuMonitor *mon, qemuMonitorCPUModelExpansionType type, @@ -5170,9 +5201,9 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, if ((rc = qemuMonitorJSONQueryCPUModelExpansionOne(mon, type, &model, &data)) <= 0) return rc; - if (qemuMonitorJSONParseCPUModelData(data, "query-cpu-model-expansion", - fail_no_props, &cpu_model, &cpu_props, - &cpu_name) < 0) + if (qemuMonitorJSONParseCPUModelExpansionData(data, fail_no_props, + &cpu_model, &cpu_props, + &cpu_name) < 0) return -1; /* QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL requests "full" expansion @@ -5188,13 +5219,14 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, if ((rc = qemuMonitorJSONQueryCPUModelExpansionOne(mon, type, &fullModel, &fullData)) <= 0) return rc; - if (qemuMonitorJSONParseCPUModelData(fullData, "query-cpu-model-expansion", - fail_no_props, &cpu_model, &cpu_props, - &cpu_name) < 0) + if (qemuMonitorJSONParseCPUModelExpansionData(fullData, fail_no_props, + &cpu_model, &cpu_props, + &cpu_name) < 0) return -1; } - return qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, model_info); + return qemuMonitorJSONParseCPUModelExpansion(cpu_name, cpu_props, + model_info); } -- 2.45.1

Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com> On 11/25/24 20:46, Collin Walling wrote:
Refactor the CPU Model parsing functions within qemuMonitorJSONGetCPUModelExpansion. The new functions, qemuMonitorJSONParseCPUModelExpansionData and qemuMonitorJSONParseCPUModelExpansion invoke the functions they replace and leave room for a subsequent patch to handle parsing the (optional) deprecated_props field resulting from the command.
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_monitor_json.c | 46 ++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 1b4288b744..fa8c5b1aea 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5100,6 +5100,37 @@ qemuMonitorJSONParseCPUModel(const char *cpu_name, }
+static int +qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, + bool fail_no_props, + virJSONValue **cpu_model, + virJSONValue **cpu_props, + const char **cpu_name) +{ + if (qemuMonitorJSONParseCPUModelData(data, "query-cpu-model-expansion", + fail_no_props, cpu_model, cpu_props, + cpu_name) < 0) + return -1; + + return 0; +} + + +static int +qemuMonitorJSONParseCPUModelExpansion(const char *cpu_name, + virJSONValue *cpu_props, + qemuMonitorCPUModelInfo **model_info) +{ + g_autoptr(qemuMonitorCPUModelInfo) expanded_model = NULL; + + if (qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, &expanded_model) < 0) + return -1; + + *model_info = g_steal_pointer(&expanded_model); + return 0; +} + + static int qemuMonitorJSONQueryCPUModelExpansionOne(qemuMonitor *mon, qemuMonitorCPUModelExpansionType type, @@ -5170,9 +5201,9 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, if ((rc = qemuMonitorJSONQueryCPUModelExpansionOne(mon, type, &model, &data)) <= 0) return rc;
- if (qemuMonitorJSONParseCPUModelData(data, "query-cpu-model-expansion", - fail_no_props, &cpu_model, &cpu_props, - &cpu_name) < 0) + if (qemuMonitorJSONParseCPUModelExpansionData(data, fail_no_props, + &cpu_model, &cpu_props, + &cpu_name) < 0) return -1;
/* QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL requests "full" expansion @@ -5188,13 +5219,14 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, if ((rc = qemuMonitorJSONQueryCPUModelExpansionOne(mon, type, &fullModel, &fullData)) <= 0) return rc;
- if (qemuMonitorJSONParseCPUModelData(fullData, "query-cpu-model-expansion", - fail_no_props, &cpu_model, &cpu_props, - &cpu_name) < 0) + if (qemuMonitorJSONParseCPUModelExpansionData(fullData, fail_no_props, + &cpu_model, &cpu_props, + &cpu_name) < 0) return -1; }
- return qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, model_info); + return qemuMonitorJSONParseCPUModelExpansion(cpu_name, cpu_props, + model_info); }
-- Mit freundlichen Grüßen/Kind regards Boris Fiuczynski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Wolfgang Wendt Geschäftsführung: David Faller Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294

On Mon, Nov 25, 2024 at 14:46:35 -0500, Collin Walling wrote:
Refactor the CPU Model parsing functions within qemuMonitorJSONGetCPUModelExpansion. The new functions, qemuMonitorJSONParseCPUModelExpansionData and qemuMonitorJSONParseCPUModelExpansion invoke the functions they replace and leave room for a subsequent patch to handle parsing the (optional) deprecated_props field resulting from the command.
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_monitor_json.c | 46 ++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-)
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>

query-cpu-model-expansion may report an array of deprecated properties. This array is optional, and may not be supported for a particular architecture or reported for a particular CPU model. If the output is present, then capture it and store in a qemuMonitorCPUModelInfo struct for later use. The deprecated features will be retained in qemuCaps->kvm->hostCPU.info and will be stored in the capabilities cache file under the <hostCPU> element using the following format: <deprecatedFeatures> <property name='bpb'/> <property name='csske'/> <property name='cte'/> <property name='te'/> </deprecatedFeatures> At this time the data is only queried, parsed, and cached. The data will be utilized in a subsequent patch. Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 31 +++++++++++++++++++ src/qemu/qemu_monitor.c | 10 ++++++ src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 18 +++++++++++ .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 6 ++++ .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 6 ++++ 6 files changed, 72 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 5ac9f306f5..9fa868c8b7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4015,6 +4015,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsAccel *caps, const char *typeStr) { xmlNodePtr hostCPUNode; + xmlNodePtr deprecated_props; g_autofree xmlNodePtr *nodes = NULL; VIR_XPATH_NODE_AUTORESTORE(ctxt) g_autoptr(qemuMonitorCPUModelInfo) hostCPU = NULL; @@ -4107,6 +4108,24 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsAccel *caps, } } + ctxt->node = hostCPUNode; + + if ((deprecated_props = virXPathNode("./deprecatedFeatures", ctxt))) { + g_autoptr(GPtrArray) props = virXMLNodeGetSubelementList(deprecated_props, NULL); + + hostCPU->deprecated_props = g_new0(char *, props->len); + + for (i = 0; i < props->len; i++) { + xmlNodePtr prop = g_ptr_array_index(props, i); + + if (!(hostCPU->deprecated_props[i] = virXMLPropString(prop, "name"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing 'name' attribute for a host CPU model deprecated property in QEMU capabilities cache")); + return -1; + } + } + } + caps->hostCPU.info = g_steal_pointer(&hostCPU); return 0; } @@ -4839,6 +4858,18 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsAccel *caps, virBufferAddLit(buf, "/>\n"); } + if (model->deprecated_props) { + virBufferAddLit(buf, "<deprecatedFeatures>\n"); + virBufferAdjustIndent(buf, 2); + + for (i = 0; i < g_strv_length(model->deprecated_props); i++) + virBufferAsprintf(buf, "<property name='%s'/>\n", + model->deprecated_props[i]); + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</deprecatedFeatures>\n"); + } + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</hostCPU>\n"); } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 73f37d26eb..94089e1c1c 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3306,6 +3306,7 @@ qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfo *model_info) g_free(model_info->props[i].value.string); } + g_strfreev(model_info->deprecated_props); g_free(model_info->props); g_free(model_info->name); g_free(model_info); @@ -3350,6 +3351,15 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) } } + if (orig->deprecated_props) { + copy->deprecated_props = g_new0(char *, + g_strv_length(orig->deprecated_props)); + + for (i = 0; i < g_strv_length(orig->deprecated_props); i++) { + copy->deprecated_props[i] = g_strdup(orig->deprecated_props[i]); + } + } + return copy; } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 89a59dfd27..d4d9b98ba7 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1150,6 +1150,7 @@ struct _qemuMonitorCPUModelInfo { char *name; size_t nprops; qemuMonitorCPUProperty *props; + GStrv deprecated_props; bool migratability; }; diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index fa8c5b1aea..6500e01d3f 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5105,6 +5105,7 @@ qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, bool fail_no_props, virJSONValue **cpu_model, virJSONValue **cpu_props, + virJSONValue **cpu_deprecated_props, const char **cpu_name) { if (qemuMonitorJSONParseCPUModelData(data, "query-cpu-model-expansion", @@ -5112,6 +5113,12 @@ qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, cpu_name) < 0) return -1; + /* + * Unconditionally check for the deprecated-props array, as + * it is not a guarantee response even if QEMU supports it. + */ + *cpu_deprecated_props = virJSONValueObjectGetArray(data, "deprecated-props"); + return 0; } @@ -5119,6 +5126,7 @@ qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, static int qemuMonitorJSONParseCPUModelExpansion(const char *cpu_name, virJSONValue *cpu_props, + virJSONValue *cpu_deprecated_props, qemuMonitorCPUModelInfo **model_info) { g_autoptr(qemuMonitorCPUModelInfo) expanded_model = NULL; @@ -5126,6 +5134,12 @@ qemuMonitorJSONParseCPUModelExpansion(const char *cpu_name, if (qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, &expanded_model) < 0) return -1; + if (cpu_deprecated_props && + virJSONValueArraySize(cpu_deprecated_props) && + (!(expanded_model->deprecated_props = virJSONValueArrayToStringList(cpu_deprecated_props)))) { + return -1; + } + *model_info = g_steal_pointer(&expanded_model); return 0; } @@ -5190,6 +5204,7 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, g_autoptr(virJSONValue) fullData = NULL; virJSONValue *cpu_model; virJSONValue *cpu_props = NULL; + virJSONValue *cpu_deprecated_props = NULL; const char *cpu_name = ""; int rc; @@ -5203,6 +5218,7 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, if (qemuMonitorJSONParseCPUModelExpansionData(data, fail_no_props, &cpu_model, &cpu_props, + &cpu_deprecated_props, &cpu_name) < 0) return -1; @@ -5221,11 +5237,13 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, if (qemuMonitorJSONParseCPUModelExpansionData(fullData, fail_no_props, &cpu_model, &cpu_props, + &cpu_deprecated_props, &cpu_name) < 0) return -1; } return qemuMonitorJSONParseCPUModelExpansion(cpu_name, cpu_props, + cpu_deprecated_props, model_info); } diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml index 50e9a60a1f..5e8db88e52 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml @@ -193,6 +193,12 @@ <property name='te' type='boolean' value='true'/> <property name='cmm' type='boolean' value='true'/> <property name='vxpdeh2' type='boolean' value='true'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='kvm' name='z13' typename='z13-s390x-cpu' usable='yes'/> <cpu type='kvm' name='z990.3' typename='z990.3-s390x-cpu' usable='yes'/> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml index 6d4f6726fb..79a149d187 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml @@ -196,6 +196,12 @@ <property name='te' type='boolean' value='true'/> <property name='cmm' type='boolean' value='true'/> <property name='vxpdeh2' type='boolean' value='true'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='kvm' name='z13' typename='z13-s390x-cpu' usable='yes'/> <cpu type='kvm' name='z990.3' typename='z990.3-s390x-cpu' usable='yes'/> -- 2.45.1

On Mon, Nov 25, 2024 at 14:46:36 -0500, Collin Walling wrote:
query-cpu-model-expansion may report an array of deprecated properties. This array is optional, and may not be supported for a particular architecture or reported for a particular CPU model. If the output is present, then capture it and store in a qemuMonitorCPUModelInfo struct for later use.
The deprecated features will be retained in qemuCaps->kvm->hostCPU.info and will be stored in the capabilities cache file under the <hostCPU> element using the following format:
<deprecatedFeatures> <property name='bpb'/> <property name='csske'/> <property name='cte'/> <property name='te'/> </deprecatedFeatures>
At this time the data is only queried, parsed, and cached. The data will be utilized in a subsequent patch.
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 31 +++++++++++++++++++ src/qemu/qemu_monitor.c | 10 ++++++ src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 18 +++++++++++ .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 6 ++++ .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 6 ++++ 6 files changed, 72 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 5ac9f306f5..9fa868c8b7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c ... @@ -4107,6 +4108,24 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsAccel *caps, } }
+ ctxt->node = hostCPUNode; + + if ((deprecated_props = virXPathNode("./deprecatedFeatures", ctxt))) { + g_autoptr(GPtrArray) props = virXMLNodeGetSubelementList(deprecated_props, NULL); + + hostCPU->deprecated_props = g_new0(char *, props->len);
hostCPU->deprecated_props is a NULL terminated array of strings so you need to allocate it big enough for props->len + 1 items
+ + for (i = 0; i < props->len; i++) { + xmlNodePtr prop = g_ptr_array_index(props, i); + + if (!(hostCPU->deprecated_props[i] = virXMLPropString(prop, "name"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing 'name' attribute for a host CPU model deprecated property in QEMU capabilities cache")); + return -1; + } + } + } + caps->hostCPU.info = g_steal_pointer(&hostCPU); return 0; } ... diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 73f37d26eb..94089e1c1c 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c ... @@ -3350,6 +3351,15 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) } }
+ if (orig->deprecated_props) { + copy->deprecated_props = g_new0(char *, + g_strv_length(orig->deprecated_props)); + + for (i = 0; i < g_strv_length(orig->deprecated_props); i++) { + copy->deprecated_props[i] = g_strdup(orig->deprecated_props[i]); + } + }
Again, the array is too small, but instead of making the copy this way you could just do copy->deprecated_props = g_strdupv(orig->deprecated_props); Perhaps with some typecasting if the compiler complains about GStrv not being char **.
+ return copy; }
... Jirka

Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com> On 11/25/24 20:46, Collin Walling wrote:
query-cpu-model-expansion may report an array of deprecated properties. This array is optional, and may not be supported for a particular architecture or reported for a particular CPU model. If the output is present, then capture it and store in a qemuMonitorCPUModelInfo struct for later use.
The deprecated features will be retained in qemuCaps->kvm->hostCPU.info and will be stored in the capabilities cache file under the <hostCPU> element using the following format:
<deprecatedFeatures> <property name='bpb'/> <property name='csske'/> <property name='cte'/> <property name='te'/> </deprecatedFeatures>
At this time the data is only queried, parsed, and cached. The data will be utilized in a subsequent patch.
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 31 +++++++++++++++++++ src/qemu/qemu_monitor.c | 10 ++++++ src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 18 +++++++++++ .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 6 ++++ .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 6 ++++ 6 files changed, 72 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 5ac9f306f5..9fa868c8b7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4015,6 +4015,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsAccel *caps, const char *typeStr) { xmlNodePtr hostCPUNode; + xmlNodePtr deprecated_props; g_autofree xmlNodePtr *nodes = NULL; VIR_XPATH_NODE_AUTORESTORE(ctxt) g_autoptr(qemuMonitorCPUModelInfo) hostCPU = NULL; @@ -4107,6 +4108,24 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsAccel *caps, } }
+ ctxt->node = hostCPUNode; + + if ((deprecated_props = virXPathNode("./deprecatedFeatures", ctxt))) { + g_autoptr(GPtrArray) props = virXMLNodeGetSubelementList(deprecated_props, NULL); + + hostCPU->deprecated_props = g_new0(char *, props->len); + + for (i = 0; i < props->len; i++) { + xmlNodePtr prop = g_ptr_array_index(props, i); + + if (!(hostCPU->deprecated_props[i] = virXMLPropString(prop, "name"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing 'name' attribute for a host CPU model deprecated property in QEMU capabilities cache")); + return -1; + } + } + } + caps->hostCPU.info = g_steal_pointer(&hostCPU); return 0; } @@ -4839,6 +4858,18 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsAccel *caps, virBufferAddLit(buf, "/>\n"); }
+ if (model->deprecated_props) { + virBufferAddLit(buf, "<deprecatedFeatures>\n"); + virBufferAdjustIndent(buf, 2); + + for (i = 0; i < g_strv_length(model->deprecated_props); i++) + virBufferAsprintf(buf, "<property name='%s'/>\n", + model->deprecated_props[i]); + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</deprecatedFeatures>\n"); + } + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</hostCPU>\n"); } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 73f37d26eb..94089e1c1c 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3306,6 +3306,7 @@ qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfo *model_info) g_free(model_info->props[i].value.string); }
+ g_strfreev(model_info->deprecated_props); g_free(model_info->props); g_free(model_info->name); g_free(model_info); @@ -3350,6 +3351,15 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) } }
+ if (orig->deprecated_props) { + copy->deprecated_props = g_new0(char *, + g_strv_length(orig->deprecated_props)); + + for (i = 0; i < g_strv_length(orig->deprecated_props); i++) { + copy->deprecated_props[i] = g_strdup(orig->deprecated_props[i]); + } + } + return copy; }
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 89a59dfd27..d4d9b98ba7 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1150,6 +1150,7 @@ struct _qemuMonitorCPUModelInfo { char *name; size_t nprops; qemuMonitorCPUProperty *props; + GStrv deprecated_props; bool migratability; };
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index fa8c5b1aea..6500e01d3f 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5105,6 +5105,7 @@ qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, bool fail_no_props, virJSONValue **cpu_model, virJSONValue **cpu_props, + virJSONValue **cpu_deprecated_props, const char **cpu_name) { if (qemuMonitorJSONParseCPUModelData(data, "query-cpu-model-expansion", @@ -5112,6 +5113,12 @@ qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, cpu_name) < 0) return -1;
+ /* + * Unconditionally check for the deprecated-props array, as + * it is not a guarantee response even if QEMU supports it. + */ + *cpu_deprecated_props = virJSONValueObjectGetArray(data, "deprecated-props"); + return 0; }
@@ -5119,6 +5126,7 @@ qemuMonitorJSONParseCPUModelExpansionData(virJSONValue *data, static int qemuMonitorJSONParseCPUModelExpansion(const char *cpu_name, virJSONValue *cpu_props, + virJSONValue *cpu_deprecated_props, qemuMonitorCPUModelInfo **model_info) { g_autoptr(qemuMonitorCPUModelInfo) expanded_model = NULL; @@ -5126,6 +5134,12 @@ qemuMonitorJSONParseCPUModelExpansion(const char *cpu_name, if (qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, &expanded_model) < 0) return -1;
+ if (cpu_deprecated_props && + virJSONValueArraySize(cpu_deprecated_props) && + (!(expanded_model->deprecated_props = virJSONValueArrayToStringList(cpu_deprecated_props)))) { + return -1; + } + *model_info = g_steal_pointer(&expanded_model); return 0; } @@ -5190,6 +5204,7 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon, g_autoptr(virJSONValue) fullData = NULL; virJSONValue *cpu_model; virJSONValue *cpu_props = NULL; + virJSONValue *cpu_deprecated_props = NULL; const char *cpu_name = ""; int rc;
@@ -5203,6 +5218,7 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
if (qemuMonitorJSONParseCPUModelExpansionData(data, fail_no_props, &cpu_model, &cpu_props, + &cpu_deprecated_props, &cpu_name) < 0) return -1;
@@ -5221,11 +5237,13 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitor *mon,
if (qemuMonitorJSONParseCPUModelExpansionData(fullData, fail_no_props, &cpu_model, &cpu_props, + &cpu_deprecated_props, &cpu_name) < 0) return -1; }
return qemuMonitorJSONParseCPUModelExpansion(cpu_name, cpu_props, + cpu_deprecated_props, model_info); }
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml index 50e9a60a1f..5e8db88e52 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml @@ -193,6 +193,12 @@ <property name='te' type='boolean' value='true'/> <property name='cmm' type='boolean' value='true'/> <property name='vxpdeh2' type='boolean' value='true'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='kvm' name='z13' typename='z13-s390x-cpu' usable='yes'/> <cpu type='kvm' name='z990.3' typename='z990.3-s390x-cpu' usable='yes'/> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml index 6d4f6726fb..79a149d187 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml @@ -196,6 +196,12 @@ <property name='te' type='boolean' value='true'/> <property name='cmm' type='boolean' value='true'/> <property name='vxpdeh2' type='boolean' value='true'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='kvm' name='z13' typename='z13-s390x-cpu' usable='yes'/> <cpu type='kvm' name='z990.3' typename='z990.3-s390x-cpu' usable='yes'/>
-- Mit freundlichen Grüßen/Kind regards Boris Fiuczynski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Wolfgang Wendt Geschäftsführung: David Faller Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294

Add QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS for detecting if query-cpu-model-expansion can report deprecated CPU model properties. QEMU introduced this capability in 9.1 release. Add flag and deprecated features to the capabilities test data for QEMU 9.1 and 9.2 replies/XML since it can now be accounted for. When probing for the host CPU, perform a full CPU model expansion to retrieve the list of features deprecated across the entire architecture. The list and count are stored in the host's CPU model info within the QEMU capabilities. Other info resulting from this query (e.g. model name, etc) is ignored. The new capabilities flag is used to fence off the extra query for architectures/QEMU binaries that do not report deprecated CPU model features. Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 38 ++ src/qemu/qemu_capabilities.h | 1 + .../caps_9.1.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 7 + .../caps_9.2.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 7 + 6 files changed, 745 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 9fa868c8b7..50905750fb 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -721,6 +721,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "chardev-reconnect-miliseconds", /* QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS */ "virtio-ccw.loadparm", /* QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM */ "netdev-stream-reconnect-miliseconds", /* QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS */ + "query-cpu-model-expansion.deprecated-props", /* QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS */ ); @@ -1594,6 +1595,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = { { "screendump/arg-type/device", QEMU_CAPS_SCREENDUMP_DEVICE }, { "screendump/arg-type/format/^png", QEMU_CAPS_SCREENSHOT_FORMAT_PNG }, { "set-numa-node/arg-type/+hmat-lb", QEMU_CAPS_NUMA_HMAT }, + { "query-cpu-model-expansion/ret-type/deprecated-props", QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS }, }; typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps; @@ -3146,6 +3148,38 @@ virQEMUCapsProbeHypervCapabilities(virQEMUCaps *qemuCaps, } +/** + * virQEMUCapsProbeFullDeprecatedProperties + * @mon: QEMU monitor + * @cpu: CPU definition to be expanded + * @props: the array to be filled with deprecated features + * + * Performs a full CPU model expansion to retrieve an array of deprecated + * properties. If the expansion succeeds, then data previously stored in + * @props is freed. + * + * Returns: -1 if the expansion failed; otherwise 0. + */ +static int +virQEMUCapsProbeFullDeprecatedProperties(qemuMonitor *mon, + virCPUDef *cpu, + GStrv *props) +{ + g_autoptr(qemuMonitorCPUModelInfo) propsInfo = NULL; + + if (qemuMonitorGetCPUModelExpansion(mon, QEMU_MONITOR_CPU_MODEL_EXPANSION_FULL, + cpu, true, false, false, &propsInfo) < 0) + return -1; + + if (propsInfo && propsInfo->deprecated_props) { + g_free(*props); + *props = g_steal_pointer(&propsInfo->deprecated_props); + } + + return 0; +} + + static int virQEMUCapsProbeQMPHostCPU(virQEMUCaps *qemuCaps, virQEMUCapsAccel *accel, @@ -3227,6 +3261,10 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCaps *qemuCaps, modelInfo->migratability = true; } + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS) && + virQEMUCapsProbeFullDeprecatedProperties(mon, cpu, &modelInfo->deprecated_props) < 0) + return -1; + if (virQEMUCapsTypeIsAccelerated(virtType) && (ARCH_IS_X86(qemuCaps->arch) || ARCH_IS_ARM(qemuCaps->arch))) { g_autoptr(qemuMonitorCPUModelInfo) fullQEMU = NULL; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 48e4530c95..8347fd7fbb 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -700,6 +700,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for chardevs supported */ QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM, /* loadparm available on CCW device for multi device boot */ QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for netdev stream supported */ + QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS, /* query-cpu-model-expansion may report deprecated CPU properties */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies index 2d4ab8ed75..0a523ba47e 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies @@ -32252,6 +32252,89 @@ "id": "libvirt-40" } +{ + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "host" + } + }, + "id": "libvirt-41" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen16a-base", + "props": { + "nnpa": true, + "aen": true, + "cmmnt": true, + "vxpdeh": true, + "aefsi": true, + "diag318": true, + "csske": true, + "mepoch": true, + "msa9": true, + "msa8": true, + "msa7": true, + "msa6": true, + "msa5": true, + "msa4": true, + "msa3": true, + "msa2": true, + "msa1": true, + "sthyi": true, + "edat": true, + "ri": true, + "deflate": true, + "edat2": true, + "etoken": true, + "vx": true, + "ipter": true, + "pai": true, + "paie": true, + "mepochptff": true, + "ap": true, + "vxeh": true, + "vxpd": true, + "esop": true, + "msa9_pckmo": true, + "vxeh2": true, + "esort": true, + "appv": true, + "apqi": true, + "apft": true, + "els": true, + "iep": true, + "appvi": true, + "apqci": true, + "cte": true, + "ais": true, + "bpb": true, + "ctop": true, + "gs": true, + "ppa15": true, + "zpci": true, + "rdp": true, + "sea_esop2": true, + "beareh": true, + "te": true, + "cmm": true, + "vxpdeh2": true + } + } + }, + "id": "libvirt-41" +} + { "execute": "qmp_capabilities", "id": "libvirt-1" @@ -36262,10 +36345,271 @@ } { - "execute": "query-machines", + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "max" + } + }, + "id": "libvirt-4" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen15a-base", + "props": { + "pfmfi": false, + "exrl": true, + "stfle45": true, + "kmctr-etdea-192": false, + "kmctr-etdea-128": false, + "nnpa": false, + "cmma": false, + "dateh2": false, + "gen13ptff": false, + "aen": true, + "kmo-etdea-192": false, + "kmf-etdea-192": false, + "kmc-etdea-192": false, + "kmac-tdea-192": false, + "kimd-sha-512": true, + "dateh": true, + "km-aes-256": false, + "km-aes-192": false, + "kmctr-aes-256": false, + "kma-gcm-eaes-192": false, + "kmo-tdea-192": false, + "kmf-tdea-192": false, + "kmctr-tdea-192": false, + "kmctr-tdea-128": false, + "km-etdea-192": false, + "kmc-tdea-192": false, + "cmmnt": false, + "iacc2": true, + "parseh": false, + "klmd-sha-512": true, + "kma-gcm-eaes-128": false, + "csst": true, + "pcc-xts-aes-256": false, + "pcc-xts-aes-128": false, + "pckmo-aes-128": false, + "idter": false, + "idtes": true, + "prno-trng-qrtcr": false, + "pcc-cmac-eaes-128": false, + "vxpdeh": false, + "aefsi": true, + "pckmo-etdea-192": false, + "pckmo-etdea-128": false, + "diag318": false, + "pcc-cmac-eaes-256": false, + "msa-base": true, + "pcc-cmac-etdea-192": false, + "hpma2": false, + "kmctr-eaes-256": false, + "csske": false, + "csst2": true, + "mepoch": false, + "msa9": false, + "msa6": false, + "msa1": false, + "kmctr-aes-192": false, + "pckmo-aes-256": false, + "sthyi": false, + "stckf": true, + "stfle": true, + "edat": false, + "etf3": true, + "etf2": true, + "hfpm": false, + "ri": false, + "pcc-xts-eaes-256": false, + "deflate": false, + "km-xts-eaes-256": false, + "km-xts-eaes-128": false, + "edat2": false, + "hfpue": false, + "kmo-aes-192": false, + "kmf-aes-192": false, + "km-eaes-192": false, + "kmc-aes-192": false, + "unpack": false, + "dfp": false, + "kmo-aes-128": false, + "kmf-aes-128": false, + "km-eaes-128": false, + "kmctr-dea": false, + "mvcos": true, + "etoken": false, + "pcc-cmac-tdea-192": false, + "km-dea": false, + "sprogp": true, + "sigpif": false, + "kmac-eaes-128": false, + "ldisphp": true, + "pckmo-aes-192": false, + "ipter": false, + "vx": true, + "pai": false, + "kimd-ghash": false, + "emon": false, + "kimd-sha-1": false, + "cei": false, + "cmpsceh": false, + "kmctr-eaes-192": false, + "kmctr-eaes-128": false, + "ginste": true, + "km-xts-aes-256": false, + "kmac-eaes-256": false, + "kmo-eaes-128": false, + "kmf-eaes-128": false, + "kmc-eaes-128": false, + "kmac-aes-128": false, + "paie": false, + "dfppc": false, + "dfpzc": false, + "dfphp": false, + "kmo-eaes-256": false, + "kmf-eaes-256": false, + "kmc-eaes-256": false, + "kmac-aes-256": false, + "kmac-etdea-192": false, + "kmac-etdea-128": false, + "kmo-dea": false, + "kmf-dea": false, + "km-edea": false, + "kmc-dea": false, + "stfle49": true, + "klmd-sha-1": false, + "mepochptff": false, + "opc": false, + "ap": false, + "asnlxr": false, + "gpereh": false, + "minste2": true, + "pcc-cmac-dea": false, + "vxpd": false, + "vxeh": true, + "esop": true, + "ectg": true, + "ib": false, + "km-tdea-192": false, + "km-tdea-128": false, + "msa9_pckmo": false, + "siif": false, + "kma-gcm-aes-256": false, + "kma-gcm-aes-192": false, + "kma-gcm-aes-128": false, + "pcc-cmac-aes-256": false, + "tsi": false, + "vxeh2": true, + "tpei": false, + "esort": false, + "esan3": true, + "fpe": true, + "ibs": false, + "pcc-xts-eaes-128": false, + "kmac-eaes-192": false, + "zarch": true, + "kmo-edea": false, + "kmf-edea": false, + "kmc-edea": false, + "kmac-dea": false, + "appv": false, + "apqi": false, + "apft": false, + "stfle53": true, + "ppno-sha-512-drng": false, + "pcc-cmac-tdea-128": false, + "kmo-aes-256": false, + "kmf-aes-256": false, + "km-eaes-256": false, + "kmc-aes-256": false, + "els": false, + "sief2": false, + "eimm": true, + "pcc-cmac-etdea-128": false, + "iep": true, + "irbm": false, + "km-xts-aes-128": false, + "srs": true, + "appvi": false, + "apqci": false, + "kmo-tdea-128": false, + "kmf-tdea-128": false, + "km-etdea-128": false, + "kmc-tdea-128": false, + "kss": false, + "cte": false, + "kmac-edea": false, + "prno-trng": true, + "kma-gcm-eaes-256": false, + "ais": true, + "fpseh": true, + "ltlbc": true, + "ldisp": true, + "kmo-etdea-128": false, + "kmf-etdea-128": false, + "kmc-etdea-128": false, + "kmac-tdea-128": false, + "pcc-cmac-edea": false, + "bpb": false, + "kmctr-edea": false, + "64bscao": false, + "ctop": false, + "kmo-eaes-192": false, + "kmf-eaes-192": false, + "kmc-eaes-192": false, + "kmac-aes-192": false, + "gs": false, + "sema": false, + "etf3eh": true, + "etf2eh": true, + "eec": false, + "pcc-cmac-eaes-192": false, + "ppa15": false, + "kmc-prng": false, + "zpci": true, + "rdp": false, + "nonqks": false, + "sea_esop2": true, + "minste3": true, + "beareh": false, + "pfpo": false, + "te": false, + "msa8-base": true, + "msa4-base": true, + "msa3-base": true, + "msa5-base": true, + "pcc-cmac-aes-192": false, + "cmm": false, + "tods": false, + "pcc-cmac-aes-128": false, + "plo": true, + "pckmo-edea": false, + "gsls": false, + "kmctr-aes-128": false, + "skey": false, + "vxpdeh2": false + } + } + }, "id": "libvirt-4" } +{ + "execute": "query-machines", + "id": "libvirt-5" +} + { "return": [ { @@ -36568,5 +36912,5 @@ "default-ram-id": "s390.ram" } ], - "id": "libvirt-4" + "id": "libvirt-5" } diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml index 5e8db88e52..b3265dcc18 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml @@ -133,6 +133,7 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='query-cpu-model-expansion.deprecated-props'/> <version>9001000</version> <microcodeVersion>39100246</microcodeVersion> <package>v9.1.0</package> @@ -356,6 +357,12 @@ <property name='msa3-base' type='boolean' value='true'/> <property name='msa5-base' type='boolean' value='true'/> <property name='tods' type='boolean' value='false'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='tcg' name='z13' typename='z13-s390x-cpu' usable='no'> <blocker name='ppno-sha-512-drng'/> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies index 91c9a049bf..9a58acaf08 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies @@ -32411,6 +32411,89 @@ "id": "libvirt-40" } +{ + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "host" + } + }, + "id": "libvirt-41" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen16a-base", + "props": { + "nnpa": true, + "aen": true, + "cmmnt": true, + "vxpdeh": true, + "aefsi": true, + "diag318": true, + "csske": true, + "mepoch": true, + "msa9": true, + "msa8": true, + "msa7": true, + "msa6": true, + "msa5": true, + "msa4": true, + "msa3": true, + "msa2": true, + "msa1": true, + "sthyi": true, + "edat": true, + "ri": true, + "deflate": true, + "edat2": true, + "etoken": true, + "vx": true, + "ipter": true, + "pai": true, + "paie": true, + "mepochptff": true, + "ap": true, + "vxeh": true, + "vxpd": true, + "esop": true, + "msa9_pckmo": true, + "vxeh2": true, + "esort": true, + "appv": true, + "apqi": true, + "apft": true, + "els": true, + "iep": true, + "appvi": true, + "apqci": true, + "cte": true, + "ais": true, + "bpb": true, + "ctop": true, + "gs": true, + "ppa15": true, + "zpci": true, + "rdp": true, + "sea_esop2": true, + "beareh": true, + "te": true, + "cmm": true, + "vxpdeh2": true + } + } + }, + "id": "libvirt-41" +} + { "execute": "qmp_capabilities", "id": "libvirt-1" @@ -36421,10 +36504,271 @@ } { - "execute": "query-machines", + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "max" + } + }, + "id": "libvirt-4" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen15a-base", + "props": { + "pfmfi": false, + "exrl": true, + "stfle45": true, + "kmctr-etdea-192": false, + "kmctr-etdea-128": false, + "nnpa": false, + "cmma": false, + "dateh2": false, + "gen13ptff": false, + "aen": true, + "kmo-etdea-192": false, + "kmf-etdea-192": false, + "kmc-etdea-192": false, + "kmac-tdea-192": false, + "kimd-sha-512": true, + "dateh": true, + "km-aes-256": false, + "km-aes-192": false, + "kmctr-aes-256": false, + "kma-gcm-eaes-192": false, + "kmo-tdea-192": false, + "kmf-tdea-192": false, + "kmctr-tdea-192": false, + "kmctr-tdea-128": false, + "km-etdea-192": false, + "kmc-tdea-192": false, + "cmmnt": false, + "iacc2": true, + "parseh": false, + "klmd-sha-512": true, + "kma-gcm-eaes-128": false, + "csst": true, + "pcc-xts-aes-256": false, + "pcc-xts-aes-128": false, + "pckmo-aes-128": false, + "idter": false, + "idtes": true, + "prno-trng-qrtcr": false, + "pcc-cmac-eaes-128": false, + "vxpdeh": false, + "aefsi": true, + "pckmo-etdea-192": false, + "pckmo-etdea-128": false, + "diag318": false, + "pcc-cmac-eaes-256": false, + "msa-base": true, + "pcc-cmac-etdea-192": false, + "hpma2": false, + "kmctr-eaes-256": false, + "csske": false, + "csst2": true, + "mepoch": false, + "msa9": false, + "msa6": false, + "msa1": false, + "kmctr-aes-192": false, + "pckmo-aes-256": false, + "sthyi": false, + "stckf": true, + "stfle": true, + "edat": false, + "etf3": true, + "etf2": true, + "hfpm": false, + "ri": false, + "pcc-xts-eaes-256": false, + "deflate": false, + "km-xts-eaes-256": false, + "km-xts-eaes-128": false, + "edat2": false, + "hfpue": false, + "kmo-aes-192": false, + "kmf-aes-192": false, + "km-eaes-192": false, + "kmc-aes-192": false, + "unpack": false, + "dfp": false, + "kmo-aes-128": false, + "kmf-aes-128": false, + "km-eaes-128": false, + "kmctr-dea": false, + "mvcos": true, + "etoken": false, + "pcc-cmac-tdea-192": false, + "km-dea": false, + "sprogp": true, + "sigpif": false, + "kmac-eaes-128": false, + "ldisphp": true, + "pckmo-aes-192": false, + "ipter": false, + "vx": true, + "pai": false, + "kimd-ghash": false, + "emon": false, + "kimd-sha-1": false, + "cei": false, + "cmpsceh": false, + "kmctr-eaes-192": false, + "kmctr-eaes-128": false, + "ginste": true, + "km-xts-aes-256": false, + "kmac-eaes-256": false, + "kmo-eaes-128": false, + "kmf-eaes-128": false, + "kmc-eaes-128": false, + "kmac-aes-128": false, + "paie": false, + "dfppc": false, + "dfpzc": false, + "dfphp": false, + "kmo-eaes-256": false, + "kmf-eaes-256": false, + "kmc-eaes-256": false, + "kmac-aes-256": false, + "kmac-etdea-192": false, + "kmac-etdea-128": false, + "kmo-dea": false, + "kmf-dea": false, + "km-edea": false, + "kmc-dea": false, + "stfle49": true, + "klmd-sha-1": false, + "mepochptff": false, + "opc": false, + "ap": false, + "asnlxr": false, + "gpereh": false, + "minste2": true, + "pcc-cmac-dea": false, + "vxpd": false, + "vxeh": true, + "esop": true, + "ectg": true, + "ib": false, + "km-tdea-192": false, + "km-tdea-128": false, + "msa9_pckmo": false, + "siif": false, + "kma-gcm-aes-256": false, + "kma-gcm-aes-192": false, + "kma-gcm-aes-128": false, + "pcc-cmac-aes-256": false, + "tsi": false, + "vxeh2": true, + "tpei": false, + "esort": false, + "esan3": true, + "fpe": true, + "ibs": false, + "pcc-xts-eaes-128": false, + "kmac-eaes-192": false, + "zarch": true, + "kmo-edea": false, + "kmf-edea": false, + "kmc-edea": false, + "kmac-dea": false, + "appv": false, + "apqi": false, + "apft": false, + "stfle53": true, + "ppno-sha-512-drng": false, + "pcc-cmac-tdea-128": false, + "kmo-aes-256": false, + "kmf-aes-256": false, + "km-eaes-256": false, + "kmc-aes-256": false, + "els": false, + "sief2": false, + "eimm": true, + "pcc-cmac-etdea-128": false, + "iep": true, + "irbm": false, + "km-xts-aes-128": false, + "srs": true, + "appvi": false, + "apqci": false, + "kmo-tdea-128": false, + "kmf-tdea-128": false, + "km-etdea-128": false, + "kmc-tdea-128": false, + "kss": false, + "cte": false, + "kmac-edea": false, + "prno-trng": true, + "kma-gcm-eaes-256": false, + "ais": true, + "fpseh": true, + "ltlbc": true, + "ldisp": true, + "kmo-etdea-128": false, + "kmf-etdea-128": false, + "kmc-etdea-128": false, + "kmac-tdea-128": false, + "pcc-cmac-edea": false, + "bpb": false, + "kmctr-edea": false, + "64bscao": false, + "ctop": false, + "kmo-eaes-192": false, + "kmf-eaes-192": false, + "kmc-eaes-192": false, + "kmac-aes-192": false, + "gs": false, + "sema": false, + "etf3eh": true, + "etf2eh": true, + "eec": false, + "pcc-cmac-eaes-192": false, + "ppa15": false, + "kmc-prng": false, + "zpci": true, + "rdp": false, + "nonqks": false, + "sea_esop2": true, + "minste3": true, + "beareh": false, + "pfpo": false, + "te": false, + "msa8-base": true, + "msa4-base": true, + "msa3-base": true, + "msa5-base": true, + "pcc-cmac-aes-192": false, + "cmm": false, + "tods": false, + "pcc-cmac-aes-128": false, + "plo": true, + "pckmo-edea": false, + "gsls": false, + "kmctr-aes-128": false, + "skey": false, + "vxpdeh2": false + } + } + }, "id": "libvirt-4" } +{ + "execute": "query-machines", + "id": "libvirt-5" +} + { "return": [ { @@ -36737,5 +37081,5 @@ "default-ram-id": "s390.ram" } ], - "id": "libvirt-4" + "id": "libvirt-5" } diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml index 79a149d187..c3a9b62ec0 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml @@ -136,6 +136,7 @@ <flag name='chardev-reconnect-miliseconds'/> <flag name='virtio-ccw.loadparm'/> <flag name='netdev-stream-reconnect-miliseconds'/> + <flag name='query-cpu-model-expansion.deprecated-props'/> <version>9001050</version> <microcodeVersion>39100247</microcodeVersion> <package>v9.1.0-1348-g11b8920ed2</package> @@ -360,6 +361,12 @@ <property name='msa3-base' type='boolean' value='true'/> <property name='msa5-base' type='boolean' value='true'/> <property name='tods' type='boolean' value='false'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='tcg' name='z13' typename='z13-s390x-cpu' usable='no'> <blocker name='ppno-sha-512-drng'/> -- 2.45.1

On Mon, Nov 25, 2024 at 14:46:37 -0500, Collin Walling wrote:
Add QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS for detecting if query-cpu-model-expansion can report deprecated CPU model properties. QEMU introduced this capability in 9.1 release. Add flag and deprecated features to the capabilities test data for QEMU 9.1 and 9.2 replies/XML since it can now be accounted for.
When probing for the host CPU, perform a full CPU model expansion to retrieve the list of features deprecated across the entire architecture. The list and count are stored in the host's CPU model info within the QEMU capabilities. Other info resulting from this query (e.g. model name, etc) is ignored.
The new capabilities flag is used to fence off the extra query for architectures/QEMU binaries that do not report deprecated CPU model features.
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 38 ++ src/qemu/qemu_capabilities.h | 1 + .../caps_9.1.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 7 + .../caps_9.2.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 7 + 6 files changed, 745 insertions(+), 4 deletions(-)
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>

Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com> On 11/25/24 20:46, Collin Walling wrote:
Add QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS for detecting if query-cpu-model-expansion can report deprecated CPU model properties. QEMU introduced this capability in 9.1 release. Add flag and deprecated features to the capabilities test data for QEMU 9.1 and 9.2 replies/XML since it can now be accounted for.
When probing for the host CPU, perform a full CPU model expansion to retrieve the list of features deprecated across the entire architecture. The list and count are stored in the host's CPU model info within the QEMU capabilities. Other info resulting from this query (e.g. model name, etc) is ignored.
The new capabilities flag is used to fence off the extra query for architectures/QEMU binaries that do not report deprecated CPU model features.
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 38 ++ src/qemu/qemu_capabilities.h | 1 + .../caps_9.1.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 7 + .../caps_9.2.0_s390x.replies | 348 +++++++++++++++++- .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 7 + 6 files changed, 745 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 9fa868c8b7..50905750fb 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -721,6 +721,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "chardev-reconnect-miliseconds", /* QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS */ "virtio-ccw.loadparm", /* QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM */ "netdev-stream-reconnect-miliseconds", /* QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS */ + "query-cpu-model-expansion.deprecated-props", /* QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS */ );
@@ -1594,6 +1595,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = { { "screendump/arg-type/device", QEMU_CAPS_SCREENDUMP_DEVICE }, { "screendump/arg-type/format/^png", QEMU_CAPS_SCREENSHOT_FORMAT_PNG }, { "set-numa-node/arg-type/+hmat-lb", QEMU_CAPS_NUMA_HMAT }, + { "query-cpu-model-expansion/ret-type/deprecated-props", QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS }, };
typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps; @@ -3146,6 +3148,38 @@ virQEMUCapsProbeHypervCapabilities(virQEMUCaps *qemuCaps, }
+/** + * virQEMUCapsProbeFullDeprecatedProperties + * @mon: QEMU monitor + * @cpu: CPU definition to be expanded + * @props: the array to be filled with deprecated features + * + * Performs a full CPU model expansion to retrieve an array of deprecated + * properties. If the expansion succeeds, then data previously stored in + * @props is freed. + * + * Returns: -1 if the expansion failed; otherwise 0. + */ +static int +virQEMUCapsProbeFullDeprecatedProperties(qemuMonitor *mon, + virCPUDef *cpu, + GStrv *props) +{ + g_autoptr(qemuMonitorCPUModelInfo) propsInfo = NULL; + + if (qemuMonitorGetCPUModelExpansion(mon, QEMU_MONITOR_CPU_MODEL_EXPANSION_FULL, + cpu, true, false, false, &propsInfo) < 0) + return -1; + + if (propsInfo && propsInfo->deprecated_props) { + g_free(*props); + *props = g_steal_pointer(&propsInfo->deprecated_props); + } + + return 0; +} + + static int virQEMUCapsProbeQMPHostCPU(virQEMUCaps *qemuCaps, virQEMUCapsAccel *accel, @@ -3227,6 +3261,10 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCaps *qemuCaps, modelInfo->migratability = true; }
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS) && + virQEMUCapsProbeFullDeprecatedProperties(mon, cpu, &modelInfo->deprecated_props) < 0) + return -1; + if (virQEMUCapsTypeIsAccelerated(virtType) && (ARCH_IS_X86(qemuCaps->arch) || ARCH_IS_ARM(qemuCaps->arch))) { g_autoptr(qemuMonitorCPUModelInfo) fullQEMU = NULL; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 48e4530c95..8347fd7fbb 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -700,6 +700,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for chardevs supported */ QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM, /* loadparm available on CCW device for multi device boot */ QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for netdev stream supported */ + QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS, /* query-cpu-model-expansion may report deprecated CPU properties */
QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies index 2d4ab8ed75..0a523ba47e 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.replies @@ -32252,6 +32252,89 @@ "id": "libvirt-40" }
+{ + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "host" + } + }, + "id": "libvirt-41" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen16a-base", + "props": { + "nnpa": true, + "aen": true, + "cmmnt": true, + "vxpdeh": true, + "aefsi": true, + "diag318": true, + "csske": true, + "mepoch": true, + "msa9": true, + "msa8": true, + "msa7": true, + "msa6": true, + "msa5": true, + "msa4": true, + "msa3": true, + "msa2": true, + "msa1": true, + "sthyi": true, + "edat": true, + "ri": true, + "deflate": true, + "edat2": true, + "etoken": true, + "vx": true, + "ipter": true, + "pai": true, + "paie": true, + "mepochptff": true, + "ap": true, + "vxeh": true, + "vxpd": true, + "esop": true, + "msa9_pckmo": true, + "vxeh2": true, + "esort": true, + "appv": true, + "apqi": true, + "apft": true, + "els": true, + "iep": true, + "appvi": true, + "apqci": true, + "cte": true, + "ais": true, + "bpb": true, + "ctop": true, + "gs": true, + "ppa15": true, + "zpci": true, + "rdp": true, + "sea_esop2": true, + "beareh": true, + "te": true, + "cmm": true, + "vxpdeh2": true + } + } + }, + "id": "libvirt-41" +} + { "execute": "qmp_capabilities", "id": "libvirt-1" @@ -36262,10 +36345,271 @@ }
{ - "execute": "query-machines", + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "max" + } + }, + "id": "libvirt-4" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen15a-base", + "props": { + "pfmfi": false, + "exrl": true, + "stfle45": true, + "kmctr-etdea-192": false, + "kmctr-etdea-128": false, + "nnpa": false, + "cmma": false, + "dateh2": false, + "gen13ptff": false, + "aen": true, + "kmo-etdea-192": false, + "kmf-etdea-192": false, + "kmc-etdea-192": false, + "kmac-tdea-192": false, + "kimd-sha-512": true, + "dateh": true, + "km-aes-256": false, + "km-aes-192": false, + "kmctr-aes-256": false, + "kma-gcm-eaes-192": false, + "kmo-tdea-192": false, + "kmf-tdea-192": false, + "kmctr-tdea-192": false, + "kmctr-tdea-128": false, + "km-etdea-192": false, + "kmc-tdea-192": false, + "cmmnt": false, + "iacc2": true, + "parseh": false, + "klmd-sha-512": true, + "kma-gcm-eaes-128": false, + "csst": true, + "pcc-xts-aes-256": false, + "pcc-xts-aes-128": false, + "pckmo-aes-128": false, + "idter": false, + "idtes": true, + "prno-trng-qrtcr": false, + "pcc-cmac-eaes-128": false, + "vxpdeh": false, + "aefsi": true, + "pckmo-etdea-192": false, + "pckmo-etdea-128": false, + "diag318": false, + "pcc-cmac-eaes-256": false, + "msa-base": true, + "pcc-cmac-etdea-192": false, + "hpma2": false, + "kmctr-eaes-256": false, + "csske": false, + "csst2": true, + "mepoch": false, + "msa9": false, + "msa6": false, + "msa1": false, + "kmctr-aes-192": false, + "pckmo-aes-256": false, + "sthyi": false, + "stckf": true, + "stfle": true, + "edat": false, + "etf3": true, + "etf2": true, + "hfpm": false, + "ri": false, + "pcc-xts-eaes-256": false, + "deflate": false, + "km-xts-eaes-256": false, + "km-xts-eaes-128": false, + "edat2": false, + "hfpue": false, + "kmo-aes-192": false, + "kmf-aes-192": false, + "km-eaes-192": false, + "kmc-aes-192": false, + "unpack": false, + "dfp": false, + "kmo-aes-128": false, + "kmf-aes-128": false, + "km-eaes-128": false, + "kmctr-dea": false, + "mvcos": true, + "etoken": false, + "pcc-cmac-tdea-192": false, + "km-dea": false, + "sprogp": true, + "sigpif": false, + "kmac-eaes-128": false, + "ldisphp": true, + "pckmo-aes-192": false, + "ipter": false, + "vx": true, + "pai": false, + "kimd-ghash": false, + "emon": false, + "kimd-sha-1": false, + "cei": false, + "cmpsceh": false, + "kmctr-eaes-192": false, + "kmctr-eaes-128": false, + "ginste": true, + "km-xts-aes-256": false, + "kmac-eaes-256": false, + "kmo-eaes-128": false, + "kmf-eaes-128": false, + "kmc-eaes-128": false, + "kmac-aes-128": false, + "paie": false, + "dfppc": false, + "dfpzc": false, + "dfphp": false, + "kmo-eaes-256": false, + "kmf-eaes-256": false, + "kmc-eaes-256": false, + "kmac-aes-256": false, + "kmac-etdea-192": false, + "kmac-etdea-128": false, + "kmo-dea": false, + "kmf-dea": false, + "km-edea": false, + "kmc-dea": false, + "stfle49": true, + "klmd-sha-1": false, + "mepochptff": false, + "opc": false, + "ap": false, + "asnlxr": false, + "gpereh": false, + "minste2": true, + "pcc-cmac-dea": false, + "vxpd": false, + "vxeh": true, + "esop": true, + "ectg": true, + "ib": false, + "km-tdea-192": false, + "km-tdea-128": false, + "msa9_pckmo": false, + "siif": false, + "kma-gcm-aes-256": false, + "kma-gcm-aes-192": false, + "kma-gcm-aes-128": false, + "pcc-cmac-aes-256": false, + "tsi": false, + "vxeh2": true, + "tpei": false, + "esort": false, + "esan3": true, + "fpe": true, + "ibs": false, + "pcc-xts-eaes-128": false, + "kmac-eaes-192": false, + "zarch": true, + "kmo-edea": false, + "kmf-edea": false, + "kmc-edea": false, + "kmac-dea": false, + "appv": false, + "apqi": false, + "apft": false, + "stfle53": true, + "ppno-sha-512-drng": false, + "pcc-cmac-tdea-128": false, + "kmo-aes-256": false, + "kmf-aes-256": false, + "km-eaes-256": false, + "kmc-aes-256": false, + "els": false, + "sief2": false, + "eimm": true, + "pcc-cmac-etdea-128": false, + "iep": true, + "irbm": false, + "km-xts-aes-128": false, + "srs": true, + "appvi": false, + "apqci": false, + "kmo-tdea-128": false, + "kmf-tdea-128": false, + "km-etdea-128": false, + "kmc-tdea-128": false, + "kss": false, + "cte": false, + "kmac-edea": false, + "prno-trng": true, + "kma-gcm-eaes-256": false, + "ais": true, + "fpseh": true, + "ltlbc": true, + "ldisp": true, + "kmo-etdea-128": false, + "kmf-etdea-128": false, + "kmc-etdea-128": false, + "kmac-tdea-128": false, + "pcc-cmac-edea": false, + "bpb": false, + "kmctr-edea": false, + "64bscao": false, + "ctop": false, + "kmo-eaes-192": false, + "kmf-eaes-192": false, + "kmc-eaes-192": false, + "kmac-aes-192": false, + "gs": false, + "sema": false, + "etf3eh": true, + "etf2eh": true, + "eec": false, + "pcc-cmac-eaes-192": false, + "ppa15": false, + "kmc-prng": false, + "zpci": true, + "rdp": false, + "nonqks": false, + "sea_esop2": true, + "minste3": true, + "beareh": false, + "pfpo": false, + "te": false, + "msa8-base": true, + "msa4-base": true, + "msa3-base": true, + "msa5-base": true, + "pcc-cmac-aes-192": false, + "cmm": false, + "tods": false, + "pcc-cmac-aes-128": false, + "plo": true, + "pckmo-edea": false, + "gsls": false, + "kmctr-aes-128": false, + "skey": false, + "vxpdeh2": false + } + } + }, "id": "libvirt-4" }
+{ + "execute": "query-machines", + "id": "libvirt-5" +} + { "return": [ { @@ -36568,5 +36912,5 @@ "default-ram-id": "s390.ram" } ], - "id": "libvirt-4" + "id": "libvirt-5" } diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml index 5e8db88e52..b3265dcc18 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml @@ -133,6 +133,7 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='snapshot-internal-qmp'/> + <flag name='query-cpu-model-expansion.deprecated-props'/> <version>9001000</version> <microcodeVersion>39100246</microcodeVersion> <package>v9.1.0</package> @@ -356,6 +357,12 @@ <property name='msa3-base' type='boolean' value='true'/> <property name='msa5-base' type='boolean' value='true'/> <property name='tods' type='boolean' value='false'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='tcg' name='z13' typename='z13-s390x-cpu' usable='no'> <blocker name='ppno-sha-512-drng'/> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies index 91c9a049bf..9a58acaf08 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.replies @@ -32411,6 +32411,89 @@ "id": "libvirt-40" }
+{ + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "host" + } + }, + "id": "libvirt-41" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen16a-base", + "props": { + "nnpa": true, + "aen": true, + "cmmnt": true, + "vxpdeh": true, + "aefsi": true, + "diag318": true, + "csske": true, + "mepoch": true, + "msa9": true, + "msa8": true, + "msa7": true, + "msa6": true, + "msa5": true, + "msa4": true, + "msa3": true, + "msa2": true, + "msa1": true, + "sthyi": true, + "edat": true, + "ri": true, + "deflate": true, + "edat2": true, + "etoken": true, + "vx": true, + "ipter": true, + "pai": true, + "paie": true, + "mepochptff": true, + "ap": true, + "vxeh": true, + "vxpd": true, + "esop": true, + "msa9_pckmo": true, + "vxeh2": true, + "esort": true, + "appv": true, + "apqi": true, + "apft": true, + "els": true, + "iep": true, + "appvi": true, + "apqci": true, + "cte": true, + "ais": true, + "bpb": true, + "ctop": true, + "gs": true, + "ppa15": true, + "zpci": true, + "rdp": true, + "sea_esop2": true, + "beareh": true, + "te": true, + "cmm": true, + "vxpdeh2": true + } + } + }, + "id": "libvirt-41" +} + { "execute": "qmp_capabilities", "id": "libvirt-1" @@ -36421,10 +36504,271 @@ }
{ - "execute": "query-machines", + "execute": "query-cpu-model-expansion", + "arguments": { + "type": "full", + "model": { + "name": "max" + } + }, + "id": "libvirt-4" +} + +{ + "return": { + "deprecated-props": [ + "bpb", + "te", + "cte", + "csske" + ], + "model": { + "name": "gen15a-base", + "props": { + "pfmfi": false, + "exrl": true, + "stfle45": true, + "kmctr-etdea-192": false, + "kmctr-etdea-128": false, + "nnpa": false, + "cmma": false, + "dateh2": false, + "gen13ptff": false, + "aen": true, + "kmo-etdea-192": false, + "kmf-etdea-192": false, + "kmc-etdea-192": false, + "kmac-tdea-192": false, + "kimd-sha-512": true, + "dateh": true, + "km-aes-256": false, + "km-aes-192": false, + "kmctr-aes-256": false, + "kma-gcm-eaes-192": false, + "kmo-tdea-192": false, + "kmf-tdea-192": false, + "kmctr-tdea-192": false, + "kmctr-tdea-128": false, + "km-etdea-192": false, + "kmc-tdea-192": false, + "cmmnt": false, + "iacc2": true, + "parseh": false, + "klmd-sha-512": true, + "kma-gcm-eaes-128": false, + "csst": true, + "pcc-xts-aes-256": false, + "pcc-xts-aes-128": false, + "pckmo-aes-128": false, + "idter": false, + "idtes": true, + "prno-trng-qrtcr": false, + "pcc-cmac-eaes-128": false, + "vxpdeh": false, + "aefsi": true, + "pckmo-etdea-192": false, + "pckmo-etdea-128": false, + "diag318": false, + "pcc-cmac-eaes-256": false, + "msa-base": true, + "pcc-cmac-etdea-192": false, + "hpma2": false, + "kmctr-eaes-256": false, + "csske": false, + "csst2": true, + "mepoch": false, + "msa9": false, + "msa6": false, + "msa1": false, + "kmctr-aes-192": false, + "pckmo-aes-256": false, + "sthyi": false, + "stckf": true, + "stfle": true, + "edat": false, + "etf3": true, + "etf2": true, + "hfpm": false, + "ri": false, + "pcc-xts-eaes-256": false, + "deflate": false, + "km-xts-eaes-256": false, + "km-xts-eaes-128": false, + "edat2": false, + "hfpue": false, + "kmo-aes-192": false, + "kmf-aes-192": false, + "km-eaes-192": false, + "kmc-aes-192": false, + "unpack": false, + "dfp": false, + "kmo-aes-128": false, + "kmf-aes-128": false, + "km-eaes-128": false, + "kmctr-dea": false, + "mvcos": true, + "etoken": false, + "pcc-cmac-tdea-192": false, + "km-dea": false, + "sprogp": true, + "sigpif": false, + "kmac-eaes-128": false, + "ldisphp": true, + "pckmo-aes-192": false, + "ipter": false, + "vx": true, + "pai": false, + "kimd-ghash": false, + "emon": false, + "kimd-sha-1": false, + "cei": false, + "cmpsceh": false, + "kmctr-eaes-192": false, + "kmctr-eaes-128": false, + "ginste": true, + "km-xts-aes-256": false, + "kmac-eaes-256": false, + "kmo-eaes-128": false, + "kmf-eaes-128": false, + "kmc-eaes-128": false, + "kmac-aes-128": false, + "paie": false, + "dfppc": false, + "dfpzc": false, + "dfphp": false, + "kmo-eaes-256": false, + "kmf-eaes-256": false, + "kmc-eaes-256": false, + "kmac-aes-256": false, + "kmac-etdea-192": false, + "kmac-etdea-128": false, + "kmo-dea": false, + "kmf-dea": false, + "km-edea": false, + "kmc-dea": false, + "stfle49": true, + "klmd-sha-1": false, + "mepochptff": false, + "opc": false, + "ap": false, + "asnlxr": false, + "gpereh": false, + "minste2": true, + "pcc-cmac-dea": false, + "vxpd": false, + "vxeh": true, + "esop": true, + "ectg": true, + "ib": false, + "km-tdea-192": false, + "km-tdea-128": false, + "msa9_pckmo": false, + "siif": false, + "kma-gcm-aes-256": false, + "kma-gcm-aes-192": false, + "kma-gcm-aes-128": false, + "pcc-cmac-aes-256": false, + "tsi": false, + "vxeh2": true, + "tpei": false, + "esort": false, + "esan3": true, + "fpe": true, + "ibs": false, + "pcc-xts-eaes-128": false, + "kmac-eaes-192": false, + "zarch": true, + "kmo-edea": false, + "kmf-edea": false, + "kmc-edea": false, + "kmac-dea": false, + "appv": false, + "apqi": false, + "apft": false, + "stfle53": true, + "ppno-sha-512-drng": false, + "pcc-cmac-tdea-128": false, + "kmo-aes-256": false, + "kmf-aes-256": false, + "km-eaes-256": false, + "kmc-aes-256": false, + "els": false, + "sief2": false, + "eimm": true, + "pcc-cmac-etdea-128": false, + "iep": true, + "irbm": false, + "km-xts-aes-128": false, + "srs": true, + "appvi": false, + "apqci": false, + "kmo-tdea-128": false, + "kmf-tdea-128": false, + "km-etdea-128": false, + "kmc-tdea-128": false, + "kss": false, + "cte": false, + "kmac-edea": false, + "prno-trng": true, + "kma-gcm-eaes-256": false, + "ais": true, + "fpseh": true, + "ltlbc": true, + "ldisp": true, + "kmo-etdea-128": false, + "kmf-etdea-128": false, + "kmc-etdea-128": false, + "kmac-tdea-128": false, + "pcc-cmac-edea": false, + "bpb": false, + "kmctr-edea": false, + "64bscao": false, + "ctop": false, + "kmo-eaes-192": false, + "kmf-eaes-192": false, + "kmc-eaes-192": false, + "kmac-aes-192": false, + "gs": false, + "sema": false, + "etf3eh": true, + "etf2eh": true, + "eec": false, + "pcc-cmac-eaes-192": false, + "ppa15": false, + "kmc-prng": false, + "zpci": true, + "rdp": false, + "nonqks": false, + "sea_esop2": true, + "minste3": true, + "beareh": false, + "pfpo": false, + "te": false, + "msa8-base": true, + "msa4-base": true, + "msa3-base": true, + "msa5-base": true, + "pcc-cmac-aes-192": false, + "cmm": false, + "tods": false, + "pcc-cmac-aes-128": false, + "plo": true, + "pckmo-edea": false, + "gsls": false, + "kmctr-aes-128": false, + "skey": false, + "vxpdeh2": false + } + } + }, "id": "libvirt-4" }
+{ + "execute": "query-machines", + "id": "libvirt-5" +} + { "return": [ { @@ -36737,5 +37081,5 @@ "default-ram-id": "s390.ram" } ], - "id": "libvirt-4" + "id": "libvirt-5" } diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml index 79a149d187..c3a9b62ec0 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml @@ -136,6 +136,7 @@ <flag name='chardev-reconnect-miliseconds'/> <flag name='virtio-ccw.loadparm'/> <flag name='netdev-stream-reconnect-miliseconds'/> + <flag name='query-cpu-model-expansion.deprecated-props'/> <version>9001050</version> <microcodeVersion>39100247</microcodeVersion> <package>v9.1.0-1348-g11b8920ed2</package> @@ -360,6 +361,12 @@ <property name='msa3-base' type='boolean' value='true'/> <property name='msa5-base' type='boolean' value='true'/> <property name='tods' type='boolean' value='false'/> + <deprecatedFeatures> + <property name='bpb'/> + <property name='te'/> + <property name='cte'/> + <property name='csske'/> + </deprecatedFeatures> </hostCPU> <cpu type='tcg' name='z13' typename='z13-s390x-cpu' usable='no'> <blocker name='ppno-sha-512-drng'/>
-- Mit freundlichen Grüßen/Kind regards Boris Fiuczynski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Wolfgang Wendt Geschäftsführung: David Faller Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294

Add a new flag, --disable-deprecated-features, to the domcapabilities command. This will modify the output to show the 'host-model' CPU with features flagged as deprecated paired with the 'disable' policy. virsh domcapabilities --disable-deprecated-features Signed-off-by: Collin Walling <walling@linux.ibm.com> --- docs/manpages/virsh.rst | 6 ++++++ include/libvirt/libvirt-domain.h | 12 ++++++++++++ src/libvirt-domain.c | 2 +- src/qemu/qemu_capabilities.c | 20 ++++++++++++++++++++ src/qemu/qemu_capabilities.h | 3 +++ src/qemu/qemu_driver.c | 8 +++++++- tools/virsh-host.c | 9 ++++++++- 7 files changed, 57 insertions(+), 3 deletions(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 2e525d3fac..d3b8ff4e1c 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -568,6 +568,7 @@ domcapabilities domcapabilities [virttype] [emulatorbin] [arch] [machine] [--xpath EXPRESSION] [--wrap] + [--disabled-deprecated-features] Print an XML document describing the domain capabilities for the @@ -609,6 +610,11 @@ a standalone document, however, for ease of additional processing, the **--wrap** argument will cause the matching node to be wrapped in a common root node. +The **--disabled-deprecated-features** argument will modify the contents +of host-model CPU XML, updating the features list with any features +flagged as deprecated for the CPU model by the hypervisor. These +features will be paired with the "disable" policy. + pool-capabilities ----------------- diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index d4f1573954..0d7e54a3dc 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -1491,6 +1491,18 @@ int virDomainMigrateGetMaxSpeed(virDomainPtr domain, int virDomainMigrateStartPostCopy(virDomainPtr domain, unsigned int flags); +/** + * virConnectGetDomainCapabilitiesFlags: + * + * Domain capabilities flags. + * + * Since: 10.10.0 + */ +typedef enum { + /* Report host model with deprecated features disabled. (Since: 10.10.0) */ + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES = (1 << 0), +} virConnectGetDomainCapabilitiesFlags; + char * virConnectGetDomainCapabilities(virConnectPtr conn, const char *emulatorbin, const char *arch, diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 7c6b93963c..e8e5379672 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -12166,7 +12166,7 @@ virDomainSetUserPassword(virDomainPtr dom, * @arch: domain architecture * @machine: machine type * @virttype: virtualization type - * @flags: extra flags; not used yet, so callers should always pass 0 + * @flags: extra flags; bitwise-OR of virConnectGetDomainCapabilitiesFlags * * Prior creating a domain (for instance via virDomainCreateXML * or virDomainDefineXML) it may be suitable to know what the diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 50905750fb..0701b2f4b0 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3326,6 +3326,26 @@ virQEMUCapsGetCPUFeatures(virQEMUCaps *qemuCaps, } +void +virQEMUCapsUpdateCPUDeprecatedFeatures(virQEMUCaps *qemuCaps, + virDomainVirtType virtType, + virCPUDef *cpu) +{ + qemuMonitorCPUModelInfo *modelInfo; + size_t i; + + modelInfo = virQEMUCapsGetCPUModelInfo(qemuCaps, virtType); + + if (!modelInfo || !modelInfo->deprecated_props) + return; + + for (i = 0; i < g_strv_length(modelInfo->deprecated_props); i++) { + virCPUDefUpdateFeature(cpu, modelInfo->deprecated_props[i], + VIR_CPU_FEATURE_DISABLE); + } +} + + struct tpmTypeToCaps { int type; virQEMUCapsFlags caps; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 8347fd7fbb..6bfe99fce4 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -764,6 +764,9 @@ int virQEMUCapsGetCPUFeatures(virQEMUCaps *qemuCaps, virDomainVirtType virtType, bool migratable, char ***features); +void virQEMUCapsUpdateCPUDeprecatedFeatures(virQEMUCaps *qemuCaps, + virDomainVirtType virtType, + virCPUDef *cpu); virDomainVirtType virQEMUCapsGetVirtType(virQEMUCaps *qemuCaps); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5b9c55f704..86ab0bd39a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16521,7 +16521,8 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn, virDomainVirtType virttype; g_autoptr(virDomainCaps) domCaps = NULL; - virCheckFlags(0, NULL); + virCheckFlags(VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES, + NULL); if (virConnectGetDomainCapabilitiesEnsureACL(conn) < 0) return NULL; @@ -16540,6 +16541,11 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn, arch, virttype))) return NULL; + if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) { + virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, virttype, + domCaps->cpu.hostModel); + } + return virDomainCapsFormat(domCaps); } diff --git a/tools/virsh-host.c b/tools/virsh-host.c index 2fe64e415f..f4e7324f42 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -114,6 +114,10 @@ static const vshCmdOptDef opts_domcapabilities[] = { .type = VSH_OT_BOOL, .help = N_("wrap xpath results in an common root element"), }, + {.name = "disable-deprecated-features", + .type = VSH_OT_BOOL, + .help = N_("report host CPU model with deprecated features disabled"), + }, {.name = NULL} }; @@ -126,10 +130,13 @@ cmdDomCapabilities(vshControl *ctl, const vshCmd *cmd) const char *arch = NULL; const char *machine = NULL; const char *xpath = NULL; - const unsigned int flags = 0; /* No flags so far */ + unsigned int flags = 0; bool wrap = vshCommandOptBool(cmd, "wrap"); virshControl *priv = ctl->privData; + if (vshCommandOptBool(cmd, "disable-deprecated-features")) + flags |= VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES; + if (vshCommandOptString(ctl, cmd, "virttype", &virttype) < 0 || vshCommandOptString(ctl, cmd, "emulatorbin", &emulatorbin) < 0 || vshCommandOptString(ctl, cmd, "arch", &arch) < 0 || -- 2.45.1

On Mon, Nov 25, 2024 at 14:46:38 -0500, Collin Walling wrote:
Add a new flag, --disable-deprecated-features, to the domcapabilities command. This will modify the output to show the 'host-model' CPU with features flagged as deprecated paired with the 'disable' policy.
virsh domcapabilities --disable-deprecated-features
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- docs/manpages/virsh.rst | 6 ++++++ include/libvirt/libvirt-domain.h | 12 ++++++++++++ src/libvirt-domain.c | 2 +- src/qemu/qemu_capabilities.c | 20 ++++++++++++++++++++ src/qemu/qemu_capabilities.h | 3 +++ src/qemu/qemu_driver.c | 8 +++++++- tools/virsh-host.c | 9 ++++++++- 7 files changed, 57 insertions(+), 3 deletions(-)
I would split this patch to at least separate virsh changes from the rest, but even splitting it into three patches (public API, qemu, virsh) would work as well.
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 2e525d3fac..d3b8ff4e1c 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -568,6 +568,7 @@ domcapabilities
domcapabilities [virttype] [emulatorbin] [arch] [machine] [--xpath EXPRESSION] [--wrap] + [--disabled-deprecated-features]
s/disabled/disable/
Print an XML document describing the domain capabilities for the @@ -609,6 +610,11 @@ a standalone document, however, for ease of additional processing, the **--wrap** argument will cause the matching node to be wrapped in a common root node.
+The **--disabled-deprecated-features** argument will modify the contents
s/disabled/disable/
+of host-model CPU XML, updating the features list with any features +flagged as deprecated for the CPU model by the hypervisor. These +features will be paired with the "disable" policy. +
pool-capabilities ----------------- diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index d4f1573954..0d7e54a3dc 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -1491,6 +1491,18 @@ int virDomainMigrateGetMaxSpeed(virDomainPtr domain, int virDomainMigrateStartPostCopy(virDomainPtr domain, unsigned int flags);
+/** + * virConnectGetDomainCapabilitiesFlags: + * + * Domain capabilities flags. + * + * Since: 10.10.0
Obviously 11.0.0 here and a few lines below
+ */ +typedef enum { + /* Report host model with deprecated features disabled. (Since: 10.10.0) */ + VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES = (1 << 0), +} virConnectGetDomainCapabilitiesFlags; + char * virConnectGetDomainCapabilities(virConnectPtr conn, const char *emulatorbin, const char *arch,
Jirka

Add a new a attribute, deprecated_features='on|off' to the <cpu> element. This is used to toggle features flagged as deprecated on the CPU model on or off. When this attribute is paired with 'on', deprecated features will not be filtered. When paired with 'off', any CPU features that are flagged as deprecated will be listed under the CPU model with the 'disable' policy. Example: <cpu mode='host-model' check='partial' deprecated_features='off'/> The absence of this attribute is equivalent to the 'on' option. The deprecated features that will populate the domain XML are the same features that result in the virsh domcapabilities command with the --disable-deprecated-features argument present. It is recommended to define a domain XML with this attribute set to 'off' to ensure migration to machines that may outright drop these features in the future. Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/conf/cpu_conf.c | 10 ++++++++++ src/conf/cpu_conf.h | 1 + src/conf/schemas/cputypes.rng | 12 ++++++++++++ src/qemu/qemu_process.c | 4 ++++ 4 files changed, 27 insertions(+) diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index dcc164d165..a9910e2195 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -238,6 +238,7 @@ virCPUDefCopyWithoutModel(const virCPUDef *cpu) copy->mode = cpu->mode; copy->match = cpu->match; copy->check = cpu->check; + copy->deprecated_feats = cpu->deprecated_feats; copy->fallback = cpu->fallback; copy->sockets = cpu->sockets; copy->dies = cpu->dies; @@ -450,6 +451,11 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, if (virXMLPropEnum(ctxt->node, "check", virCPUCheckTypeFromString, VIR_XML_PROP_NONE, &def->check) < 0) return -1; + + if (virXMLPropTristateSwitch(ctxt->node, "deprecated_features", + VIR_XML_PROP_NONE, + &def->deprecated_feats) < 0) + return -1; } if (def->type == VIR_CPU_TYPE_HOST) { @@ -748,6 +754,10 @@ virCPUDefFormatBufFull(virBuffer *buf, virBufferAsprintf(&attributeBuf, " migratable='%s'", virTristateSwitchTypeToString(def->migratable)); } + + if (def->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) { + virBufferAddLit(&attributeBuf, " deprecated_features='off'"); + } } /* Format children */ diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index f71d942ce6..28e26303ef 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -161,6 +161,7 @@ struct _virCPUDef { virCPUMaxPhysAddrDef *addr; virHostCPUTscInfo *tsc; virTristateSwitch migratable; /* for host-passthrough mode */ + virTristateSwitch deprecated_feats; }; virCPUDef *virCPUDefNew(void); diff --git a/src/conf/schemas/cputypes.rng b/src/conf/schemas/cputypes.rng index 3a8910e09f..b94b08eb5a 100644 --- a/src/conf/schemas/cputypes.rng +++ b/src/conf/schemas/cputypes.rng @@ -34,6 +34,15 @@ </attribute> </define> + <define name="cpuDeprecatedFeatures"> + <attribute name="deprecated_features"> + <choice> + <value>on</value> + <value>off</value> + </choice> + </attribute> + </define> + <define name="cpuModel"> <element name="model"> <optional> @@ -439,6 +448,9 @@ <optional> <ref name="cpuCheck"/> </optional> + <optional> + <ref name="cpuDeprecatedFeatures"/> + </optional> <optional> <attribute name="migratable"> <ref name="virOnOff"/> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index bee7a39e4e..c06ca1a833 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6399,6 +6399,10 @@ qemuProcessUpdateGuestCPU(virDomainDef *def, &def->os.arch) < 0) return -1; + if (def->cpu->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) { + virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, def->virtType, def->cpu); + } + return 0; } -- 2.45.1

On 11/25/24 20:46, Collin Walling wrote:
Add a new a attribute, deprecated_features='on|off' to the <cpu> element. This is used to toggle features flagged as deprecated on the CPU model on or off. When this attribute is paired with 'on', deprecated features will not be filtered. When paired with 'off', any CPU features that are flagged as deprecated will be listed under the CPU model with the 'disable' policy.
Example:
<cpu mode='host-model' check='partial' deprecated_features='off'/>
The absence of this attribute is equivalent to the 'on' option.
The deprecated features that will populate the domain XML are the same features that result in the virsh domcapabilities command with the --disable-deprecated-features argument present.
It is recommended to define a domain XML with this attribute set to 'off' to ensure migration to machines that may outright drop these features in the future.
I think there is a validation missing that QEMU provides the capability QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS when setting the attribute to 'off'. Please also add tests running with and without a QEMU supporting this capability.
Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/conf/cpu_conf.c | 10 ++++++++++ src/conf/cpu_conf.h | 1 + src/conf/schemas/cputypes.rng | 12 ++++++++++++ src/qemu/qemu_process.c | 4 ++++ 4 files changed, 27 insertions(+)
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index dcc164d165..a9910e2195 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -238,6 +238,7 @@ virCPUDefCopyWithoutModel(const virCPUDef *cpu) copy->mode = cpu->mode; copy->match = cpu->match; copy->check = cpu->check; + copy->deprecated_feats = cpu->deprecated_feats; copy->fallback = cpu->fallback; copy->sockets = cpu->sockets; copy->dies = cpu->dies; @@ -450,6 +451,11 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, if (virXMLPropEnum(ctxt->node, "check", virCPUCheckTypeFromString, VIR_XML_PROP_NONE, &def->check) < 0) return -1; + + if (virXMLPropTristateSwitch(ctxt->node, "deprecated_features", + VIR_XML_PROP_NONE, + &def->deprecated_feats) < 0) + return -1; }
if (def->type == VIR_CPU_TYPE_HOST) { @@ -748,6 +754,10 @@ virCPUDefFormatBufFull(virBuffer *buf, virBufferAsprintf(&attributeBuf, " migratable='%s'", virTristateSwitchTypeToString(def->migratable)); } + + if (def->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) { + virBufferAddLit(&attributeBuf, " deprecated_features='off'"); + } }
/* Format children */ diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index f71d942ce6..28e26303ef 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -161,6 +161,7 @@ struct _virCPUDef { virCPUMaxPhysAddrDef *addr; virHostCPUTscInfo *tsc; virTristateSwitch migratable; /* for host-passthrough mode */ + virTristateSwitch deprecated_feats; };
virCPUDef *virCPUDefNew(void); diff --git a/src/conf/schemas/cputypes.rng b/src/conf/schemas/cputypes.rng index 3a8910e09f..b94b08eb5a 100644 --- a/src/conf/schemas/cputypes.rng +++ b/src/conf/schemas/cputypes.rng @@ -34,6 +34,15 @@ </attribute> </define>
+ <define name="cpuDeprecatedFeatures"> + <attribute name="deprecated_features"> + <choice> + <value>on</value> + <value>off</value> + </choice> + </attribute> + </define> + <define name="cpuModel"> <element name="model"> <optional> @@ -439,6 +448,9 @@ <optional> <ref name="cpuCheck"/> </optional> + <optional> + <ref name="cpuDeprecatedFeatures"/> + </optional>
<optional> <attribute name="deprecated_features"> <ref name="virOnOff"/> </attribute> </optional> This to me looks simpler and the above hunk adding cpuDeprecatedFeatures can be deleted.
<optional> <attribute name="migratable"> <ref name="virOnOff"/> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index bee7a39e4e..c06ca1a833 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6399,6 +6399,10 @@ qemuProcessUpdateGuestCPU(virDomainDef *def, &def->os.arch) < 0) return -1;
+ if (def->cpu->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) { + virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, def->virtType, def->cpu); + } + return 0; }
-- Mit freundlichen Grüßen/Kind regards Boris Fiuczynski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Wolfgang Wendt Geschäftsführung: David Faller Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294

On Mon, Nov 25, 2024 at 14:46:39 -0500, Collin Walling wrote:
Add a new a attribute, deprecated_features='on|off' to the <cpu> element. This is used to toggle features flagged as deprecated on the CPU model on or off. When this attribute is paired with 'on', deprecated features will not be filtered. When paired with 'off', any CPU features that are flagged as deprecated will be listed under the CPU model with the 'disable' policy.
Example:
<cpu mode='host-model' check='partial' deprecated_features='off'/>
The absence of this attribute is equivalent to the 'on' option.
The deprecated features that will populate the domain XML are the same features that result in the virsh domcapabilities command with the --disable-deprecated-features argument present.
It is recommended to define a domain XML with this attribute set to 'off' to ensure migration to machines that may outright drop these features in the future.
In addition to the comments from Boris...
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index dcc164d165..a9910e2195 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -238,6 +238,7 @@ virCPUDefCopyWithoutModel(const virCPUDef *cpu) copy->mode = cpu->mode; copy->match = cpu->match; copy->check = cpu->check; + copy->deprecated_feats = cpu->deprecated_feats; copy->fallback = cpu->fallback; copy->sockets = cpu->sockets; copy->dies = cpu->dies; @@ -450,6 +451,11 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, if (virXMLPropEnum(ctxt->node, "check", virCPUCheckTypeFromString, VIR_XML_PROP_NONE, &def->check) < 0) return -1; + + if (virXMLPropTristateSwitch(ctxt->node, "deprecated_features", + VIR_XML_PROP_NONE, + &def->deprecated_feats) < 0) + return -1; }
if (def->type == VIR_CPU_TYPE_HOST) { @@ -748,6 +754,10 @@ virCPUDefFormatBufFull(virBuffer *buf, virBufferAsprintf(&attributeBuf, " migratable='%s'", virTristateSwitchTypeToString(def->migratable)); } + + if (def->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) {
the attribute should be formatted even if it is on and ignored only when it's absent.
+ virBufferAddLit(&attributeBuf, " deprecated_features='off'"); + } }
/* Format children */
Jirka

On Mon, Nov 25, 2024 at 14:46:34 -0500, Collin Walling wrote:
# Changelog
v2 - rebased on latest master changes
I started reviewing the v1 yesterday with a plan to push this in time for the release, but I found a few issues and got sidetracked by investigating why the issues were not caught by our unit tests. They are actually visible when running qemucapabilitiestest in valgrind, normally everything passes just fine :-/ I'm copying my notes for v1 here. Jirka

On 11/26/24 11:59 AM, Jiri Denemark wrote:
On Mon, Nov 25, 2024 at 14:46:34 -0500, Collin Walling wrote:
# Changelog
v2 - rebased on latest master changes
I started reviewing the v1 yesterday with a plan to push this in time for the release, but I found a few issues and got sidetracked by investigating why the issues were not caught by our unit tests. They are actually visible when running qemucapabilitiestest in valgrind, normally everything passes just fine :-/ I'm copying my notes for v1 here.
Jirka
Whoops, thought I had replied! Apologies. Thanks for taking the due-diligence to check on this. I'll have the next iteration that addresses this and other review soon. -- Regards, Collin
participants (3)
-
Boris Fiuczynski
-
Collin Walling
-
Jiri Denemark