[PATCH v2 2/5] qemu: parse deprecated-props from query-cpu-model-expansion response

Collin Walling posted 5 patches 1 month ago
There is a newer version of this series
[PATCH v2 2/5] qemu: parse deprecated-props from query-cpu-model-expansion response
Posted by Collin Walling 1 month ago
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
Re: [PATCH v2 2/5] qemu: parse deprecated-props from query-cpu-model-expansion response
Posted by Boris Fiuczynski 4 weeks, 1 day ago
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
Re: [PATCH v2 2/5] qemu: parse deprecated-props from query-cpu-model-expansion response
Posted by Jiri Denemark 4 weeks, 1 day ago
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