From 82eb7690a009b35a8709eb6068355f3c00b38f74 Mon Sep 17 00:00:00 2001 From: Collin Walling Date: Thu, 20 Nov 2025 17:34:41 -0500 Subject: [PATCH] qemu: refactor load/format of deprecated features Signed-off-by: Collin Walling Reviewed-by: Jiri Denemark --- src/qemu/qemu_capabilities.c | 81 ++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index bcc7c5b602..3243ba8ad3 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4106,13 +4106,40 @@ virQEMUCapsSetCPUModelInfo(virQEMUCaps *qemuCaps, } +static int +virQEMUCapsParseHostCPUModelInfoDepFeats(xmlXPathContextPtr ctxt, + GStrv *dep_props, + const char *xpath) +{ + xmlNodePtr node; + size_t i; + + if ((node = virXPathNode(xpath, ctxt))) { + g_autoptr(GPtrArray) props = virXMLNodeGetSubelementList(node, NULL); + + *dep_props = g_new0(char *, props->len + 1); + + for (i = 0; i < props->len; i++) { + xmlNodePtr prop = g_ptr_array_index(props, i); + + if (!((*dep_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; + } + } + } + + return 0; +} + + static int virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsAccel *caps, xmlXPathContextPtr ctxt, const char *typeStr) { xmlNodePtr hostCPUNode; - xmlNodePtr deprecated_props; g_autofree xmlNodePtr *nodes = NULL; VIR_XPATH_NODE_AUTORESTORE(ctxt) g_autoptr(qemuMonitorCPUModelInfo) hostCPU = NULL; @@ -4206,21 +4233,9 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsAccel *caps, } ctxt->node = hostCPUNode; - - if ((deprecated_props = virXPathNode("./deprecatedFeatures", ctxt))) { - g_autoptr(GPtrArray) props = virXMLNodeGetSubelementList(deprecated_props, NULL); - - hostCPU->full_dep_props = g_new0(char *, props->len + 1); - - for (i = 0; i < props->len; i++) { - xmlNodePtr prop = g_ptr_array_index(props, i); - - if (!(hostCPU->full_dep_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; - } - } + if (virQEMUCapsParseHostCPUModelInfoDepFeats(ctxt, &hostCPU->full_dep_props, + "./deprecatedFeatures") < 0) { + return -1; } caps->hostCPU.info = g_steal_pointer(&hostCPU); @@ -4930,6 +4945,27 @@ virQEMUCapsLoadCache(virArch hostArch, } +static void +virQEMUCapsFormatHostCPUModelInfoDepFeats(virBuffer *buf, + GStrv props, + const char *xmlStr) +{ + size_t i; + + if (!props) + return; + + virBufferAsprintf(buf, "<%s>\n", xmlStr); + virBufferAdjustIndent(buf, 2); + + for (i = 0; i < g_strv_length(props); i++) + virBufferAsprintf(buf, "\n", props[i]); + + virBufferAdjustIndent(buf, -2); + virBufferAsprintf(buf, "\n", xmlStr); +} + + static void virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsAccel *caps, virBuffer *buf, @@ -4979,17 +5015,8 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsAccel *caps, virBufferAddLit(buf, "/>\n"); } - if (model->full_dep_props) { - virBufferAddLit(buf, "\n"); - virBufferAdjustIndent(buf, 2); - - for (i = 0; i < g_strv_length(model->full_dep_props); i++) - virBufferAsprintf(buf, "\n", - model->full_dep_props[i]); - - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "\n"); - } + virQEMUCapsFormatHostCPUModelInfoDepFeats(buf, model->full_dep_props, + "deprecatedFeatures"); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); -- 2.47.3