[PATCH v3 0/7] Allow Guest CPU Model with Deprecated Features Disabled

# Changelog v3 - added reviewed-by's on appropriate patches - split patch #4 into three: - domain API (libvirt-domain: introduce VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) - qemu (qemu_capabilities: filter deprecated features if requested) - virsh (virsh: add --disable-deprecated-features flag to domcapabilities) - Note: no functional change, patches were split based on changes to certain files - @Jiri, let me know if this is what you had in mind, I found it difficult to find a good reference - fixed deprecated_props array missing +1 in qemuJSONMonitor* functions - condensed cputypes schema for deprecated_features - added validation in qemu_process to check if QEMU cap is present - added qemuxmlconf tests - updated version tags to 11.0.0 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 (7): qemuMonitorJSONGetCPUModelExpansion: refactor parsing functions qemu: parse deprecated-props from query-cpu-model-expansion response qemu_capabilities: query deprecated features for host-model libvirt-domain: introduce VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES qemu_capabilities: filter deprecated features if requested 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 | 11 + src/conf/cpu_conf.h | 1 + src/conf/schemas/cputypes.rng | 5 + 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 | 7 + src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 64 +++- src/qemu/qemu_process.c | 11 + .../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 + ...el-deprecated-features-off.s390x-8.2.0.err | 1 + ...el-deprecated-features-off.s390x-8.2.0.xml | 25 ++ ...-deprecated-features-off.s390x-latest.args | 32 ++ ...l-deprecated-features-off.s390x-latest.xml | 25 ++ .../cpu-model-deprecated-features-off.xml | 15 + tests/qemuxmlconftest.c | 3 + tools/virsh-host.c | 9 +- 24 files changed, 1039 insertions(+), 14 deletions(-) create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.args create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.xml create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.xml -- 2.47.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> Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com> Reviewed-by: Jiri Denemark <jdenemar@redhat.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.47.1

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> Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 31 +++++++++++++++++++ src/qemu/qemu_monitor.c | 7 +++++ 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, 69 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index dec3199fce..e7dacb5570 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4019,6 +4019,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; @@ -4111,6 +4112,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 + 1); + + 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; } @@ -4843,6 +4862,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..8590a1a0a5 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,12 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) } } + if (orig->deprecated_props) { + copy->deprecated_props = g_new0(char *, + g_strv_length(orig->deprecated_props)); + copy->deprecated_props = g_strdupv(orig->deprecated_props); + } + 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.47.1

On Mon, Dec 16, 2024 at 18:03:53 -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> Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 31 +++++++++++++++++++ src/qemu/qemu_monitor.c | 7 +++++ 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, 69 insertions(+) ... diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 73f37d26eb..8590a1a0a5 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,12 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) } }
+ if (orig->deprecated_props) { + copy->deprecated_props = g_new0(char *, + g_strv_length(orig->deprecated_props));
The memory allocated here is leaked as the pointer is overwritten by the following line.
+ copy->deprecated_props = g_strdupv(orig->deprecated_props);
This is enough to create the copy and you can safely call g_strdupv on NULL so there's no need for the if statement.
+ } + return copy; }
Jirka

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> Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com> Reviewed-by: Jiri Denemark <jdenemar@redhat.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 e7dacb5570..04017ceda7 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; @@ -3150,6 +3152,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, @@ -3231,6 +3265,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.47.1

Introduce domain flag used to filter deprecated features from the domain's CPU model. Signed-off-by: Collin Walling <walling@linux.ibm.com> --- include/libvirt/libvirt-domain.h | 12 ++++++++++++ src/libvirt-domain.c | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index d4f1573954..2a4b81f4df 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: 11.0.0 + */ +typedef enum { + /* Report host model with deprecated features disabled. (Since: 11.0.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 -- 2.47.1

If flag VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES is passed to qemuConnectGetDomainCapabilities, then the domain's CPU model features will be updated to set any deprecated features to the 'disabled' policy. Signed-off-by: Collin Walling <walling@linux.ibm.com> --- src/qemu/qemu_capabilities.c | 20 ++++++++++++++++++++ src/qemu/qemu_capabilities.h | 3 +++ src/qemu/qemu_driver.c | 8 +++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 04017ceda7..eda3e6a4df 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3330,6 +3330,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 f1a633fdd3..672b42b44e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16530,7 +16530,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; @@ -16549,6 +16550,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); } -- 2.47.1

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 ++++++ tools/virsh-host.c | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 2e525d3fac..e801037c04 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -568,6 +568,7 @@ domcapabilities domcapabilities [virttype] [emulatorbin] [arch] [machine] [--xpath EXPRESSION] [--wrap] + [--disable-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 **--disable-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/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.47.1

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 | 11 +++++++ src/conf/cpu_conf.h | 1 + src/conf/schemas/cputypes.rng | 5 +++ src/qemu/qemu_process.c | 11 +++++++ ...el-deprecated-features-off.s390x-8.2.0.err | 1 + ...el-deprecated-features-off.s390x-8.2.0.xml | 25 +++++++++++++++ ...-deprecated-features-off.s390x-latest.args | 32 +++++++++++++++++++ ...l-deprecated-features-off.s390x-latest.xml | 25 +++++++++++++++ .../cpu-model-deprecated-features-off.xml | 15 +++++++++ tests/qemuxmlconftest.c | 3 ++ 10 files changed, 129 insertions(+) create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.args create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.xml create mode 100644 tests/qemuxmlconfdata/cpu-model-deprecated-features-off.xml diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index dcc164d165..31425783ba 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,11 @@ virCPUDefFormatBufFull(virBuffer *buf, virBufferAsprintf(&attributeBuf, " migratable='%s'", virTristateSwitchTypeToString(def->migratable)); } + + if (def->deprecated_feats) { + virBufferAsprintf(&attributeBuf, " deprecated_features='%s'", + virTristateSwitchTypeToString(def->deprecated_feats)); + } } /* 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..8edf1d14e3 100644 --- a/src/conf/schemas/cputypes.rng +++ b/src/conf/schemas/cputypes.rng @@ -439,6 +439,11 @@ <optional> <ref name="cpuCheck"/> </optional> + <optional> + <attribute name="deprecated_features"> + <ref name="virOnOff"/> + </attribute> + </optional> <optional> <attribute name="migratable"> <ref name="virOnOff"/> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index bee7a39e4e..5f2e278156 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6399,6 +6399,17 @@ qemuProcessUpdateGuestCPU(virDomainDef *def, &def->os.arch) < 0) return -1; + if (def->cpu->deprecated_feats && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("toggling deprecated features for CPU model is unsupported")); + return -1; + } + + if (def->cpu->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) { + virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, def->virtType, def->cpu); + } + return 0; } diff --git a/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err new file mode 100644 index 0000000000..936d1d5a46 --- /dev/null +++ b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err @@ -0,0 +1 @@ +unsupported configuration: toggling deprecated features for CPU model is unsupported diff --git a/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml new file mode 100644 index 0000000000..e1f7ba3857 --- /dev/null +++ b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml @@ -0,0 +1,25 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>22782664-6b93-46bf-9595-317220dd2d1c</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio-8.2'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='host-model' check='partial' deprecated_features='off'/> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.args b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.args new file mode 100644 index 0000000000..ba6e7c5304 --- /dev/null +++ b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.args @@ -0,0 +1,32 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \ +/usr/bin/qemu-system-s390x \ +-name guest=guest,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \ +-machine s390-ccw-virtio,usb=off,dump-guest-core=off,memory-backend=s390.ram \ +-accel kvm \ +-cpu gen16a-base,nnpa=on,aen=on,cmmnt=on,vxpdeh=on,aefsi=on,diag318=on,csske=off,mepoch=on,msa9=on,msa8=on,msa7=on,msa6=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,sthyi=on,edat=on,ri=on,deflate=on,edat2=on,etoken=on,vx=on,ipter=on,pai=on,paie=on,mepochptff=on,ap=on,vxeh=on,vxpd=on,esop=on,msa9_pckmo=on,vxeh2=on,esort=on,appv=on,apqi=on,apft=on,els=on,iep=on,appvi=on,apqci=on,cte=off,ais=on,bpb=off,ctop=on,gs=on,ppa15=on,zpci=on,rdp=on,sea_esop2=on,beareh=on,te=off,cmm=on,vxpdeh2=on \ +-m size=219136k \ +-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 22782664-6b93-46bf-9595-317220dd2d1c \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-ccw","id":"balloon0","devno":"fe.0.0000"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.xml b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.xml new file mode 100644 index 0000000000..fdd87acb1d --- /dev/null +++ b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-latest.xml @@ -0,0 +1,25 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>22782664-6b93-46bf-9595-317220dd2d1c</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='host-model' check='partial' deprecated_features='off'/> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.xml b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.xml new file mode 100644 index 0000000000..67950715ec --- /dev/null +++ b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.xml @@ -0,0 +1,15 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>22782664-6b93-46bf-9595-317220dd2d1c</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + </os> + <cpu mode='host-model' check='partial' deprecated_features='off'/> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + </devices> +</domain> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index f3c8d0ae34..23f1d9eab7 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -2295,6 +2295,9 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("cpu-s390-zEC12", "s390x"); DO_TEST_CAPS_ARCH_LATEST("cpu-s390-features", "s390x"); + DO_TEST_CAPS_ARCH_VER_FAILURE("cpu-model-deprecated-features-off", "s390x", "8.2.0"); + DO_TEST_CAPS_ARCH_LATEST("cpu-model-deprecated-features-off", "s390x"); + DO_TEST_CAPS_ARCH_LATEST_FULL("cpu-Haswell", "x86_64", ARG_CAPS_HOST_CPU_MODEL, QEMU_CPU_DEF_HASWELL); DO_TEST_CAPS_ARCH_LATEST_FULL("cpu-Haswell2", "x86_64", ARG_CAPS_HOST_CPU_MODEL, QEMU_CPU_DEF_HASWELL); DO_TEST_CAPS_ARCH_LATEST_FULL("cpu-Haswell3", "x86_64", ARG_CAPS_HOST_CPU_MODEL, QEMU_CPU_DEF_HASWELL); -- 2.47.1

On Mon, Dec 16, 2024 at 18:03:51 -0500, Collin Walling wrote:
# Changelog
v3 - added reviewed-by's on appropriate patches - split patch #4 into three: - domain API (libvirt-domain: introduce VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) - qemu (qemu_capabilities: filter deprecated features if requested) - virsh (virsh: add --disable-deprecated-features flag to domcapabilities) - Note: no functional change, patches were split based on changes to certain files - @Jiri, let me know if this is what you had in mind, I found it difficult to find a good reference - fixed deprecated_props array missing +1 in qemuJSONMonitor* functions - condensed cputypes schema for deprecated_features - added validation in qemu_process to check if QEMU cap is present - added qemuxmlconf tests - updated version tags to 11.0.0
Reviewed-by: Jiri Denemark <jdenemar@redhat.com> I fixed the small issue in 2/7 with the following diff and pushed the series, thanks. diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 8590a1a0a5..df7e0d8997 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3351,11 +3351,7 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) } } - if (orig->deprecated_props) { - copy->deprecated_props = g_new0(char *, - g_strv_length(orig->deprecated_props)); - copy->deprecated_props = g_strdupv(orig->deprecated_props); - } + copy->deprecated_props = g_strdupv(orig->deprecated_props); return copy; }

On 12/17/24 5:46 AM, Jiri Denemark wrote:
On Mon, Dec 16, 2024 at 18:03:51 -0500, Collin Walling wrote:
# Changelog
v3 - added reviewed-by's on appropriate patches - split patch #4 into three: - domain API (libvirt-domain: introduce VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) - qemu (qemu_capabilities: filter deprecated features if requested) - virsh (virsh: add --disable-deprecated-features flag to domcapabilities) - Note: no functional change, patches were split based on changes to certain files - @Jiri, let me know if this is what you had in mind, I found it difficult to find a good reference - fixed deprecated_props array missing +1 in qemuJSONMonitor* functions - condensed cputypes schema for deprecated_features - added validation in qemu_process to check if QEMU cap is present - added qemuxmlconf tests - updated version tags to 11.0.0
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
I fixed the small issue in 2/7 with the following diff and pushed the series, thanks.
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 8590a1a0a5..df7e0d8997 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3351,11 +3351,7 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) } }
- if (orig->deprecated_props) { - copy->deprecated_props = g_new0(char *, - g_strv_length(orig->deprecated_props)); - copy->deprecated_props = g_strdupv(orig->deprecated_props); - } + copy->deprecated_props = g_strdupv(orig->deprecated_props);
return copy; }
Much appreciated, thank you! -- Regards, Collin
participants (2)
-
Collin Walling
-
Jiri Denemark