virDomainNumaDefParseXML: Use g_autofree

Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
This commit is contained in:
Tim Wiederhake 2021-05-13 17:32:01 +02:00 committed by Laine Stump
parent 9563732306
commit df28ba289c

View File

@ -932,20 +932,20 @@ int
virDomainNumaDefParseXML(virDomainNuma *def, virDomainNumaDefParseXML(virDomainNuma *def,
xmlXPathContextPtr ctxt) xmlXPathContextPtr ctxt)
{ {
xmlNodePtr *nodes = NULL; g_autofree xmlNodePtr *cell = NULL;
char *tmp = NULL; g_autofree xmlNodePtr *interconnect = NULL;
int n; int n;
size_t i, j; size_t i, j;
int ret = -1;
/* check if NUMA definition is present */ /* check if NUMA definition is present */
if (!virXPathNode("./cpu/numa[1]", ctxt)) if (!virXPathNode("./cpu/numa[1]", ctxt))
return 0; return 0;
if ((n = virXPathNodeSet("./cpu/numa[1]/cell", ctxt, &nodes)) <= 0) { if ((n = virXPathNodeSet("./cpu/numa[1]/cell", ctxt, &cell)) <= 0) {
virReportError(VIR_ERR_XML_ERROR, "%s", virReportError(VIR_ERR_XML_ERROR, "%s",
_("NUMA topology defined without NUMA cells")); _("NUMA topology defined without NUMA cells"));
goto cleanup; return -1;
} }
def->mem_nodes = g_new0(struct _virDomainNumaNode, n); def->mem_nodes = g_new0(struct _virDomainNumaNode, n);
@ -953,12 +953,13 @@ virDomainNumaDefParseXML(virDomainNuma *def,
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
VIR_XPATH_NODE_AUTORESTORE(ctxt) VIR_XPATH_NODE_AUTORESTORE(ctxt)
g_autofree char *tmp = NULL;
int rc; int rc;
unsigned int cur_cell; unsigned int cur_cell;
if ((rc = virXMLPropUInt(nodes[i], "id", 10, VIR_XML_PROP_NONE, if ((rc = virXMLPropUInt(cell[i], "id", 10, VIR_XML_PROP_NONE,
&cur_cell)) < 0) &cur_cell)) < 0)
goto cleanup; return -1;
if (rc == 0) if (rc == 0)
cur_cell = i; cur_cell = i;
@ -969,25 +970,24 @@ virDomainNumaDefParseXML(virDomainNuma *def,
_("Exactly one 'cell' element per guest " _("Exactly one 'cell' element per guest "
"NUMA cell allowed, non-contiguous ranges or " "NUMA cell allowed, non-contiguous ranges or "
"ranges not starting from 0 are not allowed")); "ranges not starting from 0 are not allowed"));
goto cleanup; return -1;
} }
if (def->mem_nodes[cur_cell].mem) { if (def->mem_nodes[cur_cell].mem) {
virReportError(VIR_ERR_XML_ERROR, virReportError(VIR_ERR_XML_ERROR,
_("Duplicate NUMA cell info for cell id '%u'"), _("Duplicate NUMA cell info for cell id '%u'"),
cur_cell); cur_cell);
goto cleanup; return -1;
} }
if ((tmp = virXMLPropString(nodes[i], "cpus"))) { if ((tmp = virXMLPropString(cell[i], "cpus"))) {
g_autoptr(virBitmap) cpumask = NULL; g_autoptr(virBitmap) cpumask = NULL;
if (virBitmapParse(tmp, &cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) if (virBitmapParse(tmp, &cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0)
goto cleanup; return -1;
if (!virBitmapIsAllClear(cpumask)) if (!virBitmapIsAllClear(cpumask))
def->mem_nodes[cur_cell].cpumask = g_steal_pointer(&cpumask); def->mem_nodes[cur_cell].cpumask = g_steal_pointer(&cpumask);
VIR_FREE(tmp);
} }
for (j = 0; j < n; j++) { for (j = 0; j < n; j++) {
@ -1001,38 +1001,38 @@ virDomainNumaDefParseXML(virDomainNuma *def,
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("NUMA cells %u and %zu have overlapping vCPU ids"), _("NUMA cells %u and %zu have overlapping vCPU ids"),
cur_cell, j); cur_cell, j);
goto cleanup; return -1;
} }
} }
ctxt->node = nodes[i]; ctxt->node = cell[i];
if (virDomainParseMemory("./@memory", "./@unit", ctxt, if (virDomainParseMemory("./@memory", "./@unit", ctxt,
&def->mem_nodes[cur_cell].mem, true, false) < 0) &def->mem_nodes[cur_cell].mem, true, false) < 0)
goto cleanup; return -1;
if (virXMLPropEnum(nodes[i], "memAccess", if (virXMLPropEnum(cell[i], "memAccess",
virDomainMemoryAccessTypeFromString, virDomainMemoryAccessTypeFromString,
VIR_XML_PROP_NONZERO, VIR_XML_PROP_NONZERO,
&def->mem_nodes[cur_cell].memAccess) < 0) &def->mem_nodes[cur_cell].memAccess) < 0)
goto cleanup; return -1;
if (virXMLPropTristateBool(nodes[i], "discard", VIR_XML_PROP_NONE, if (virXMLPropTristateBool(cell[i], "discard", VIR_XML_PROP_NONE,
&def->mem_nodes[cur_cell].discard) < 0) &def->mem_nodes[cur_cell].discard) < 0)
goto cleanup; return -1;
/* Parse NUMA distances info */ /* Parse NUMA distances info */
if (virDomainNumaDefNodeDistanceParseXML(def, ctxt, cur_cell) < 0) if (virDomainNumaDefNodeDistanceParseXML(def, ctxt, cur_cell) < 0)
goto cleanup; return -1;
/* Parse cache info */ /* Parse cache info */
if (virDomainNumaDefNodeCacheParseXML(def, ctxt, cur_cell) < 0) if (virDomainNumaDefNodeCacheParseXML(def, ctxt, cur_cell) < 0)
goto cleanup; return -1;
} }
VIR_FREE(nodes);
if ((n = virXPathNodeSet("./cpu/numa[1]/interconnects[1]/latency|" if ((n = virXPathNodeSet("./cpu/numa[1]/interconnects[1]/latency|"
"./cpu/numa[1]/interconnects[1]/bandwidth", ctxt, &nodes)) < 0) "./cpu/numa[1]/interconnects[1]/bandwidth", ctxt,
goto cleanup; &interconnect)) < 0)
return -1;
def->interconnects = g_new0(virDomainNumaInterconnect, n); def->interconnects = g_new0(virDomainNumaInterconnect, n);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
@ -1043,53 +1043,49 @@ virDomainNumaDefParseXML(virDomainNuma *def,
virDomainMemoryLatency accessType; virDomainMemoryLatency accessType;
unsigned long long value; unsigned long long value;
if (virXMLNodeNameEqual(nodes[i], "latency")) { if (virXMLNodeNameEqual(interconnect[i], "latency")) {
type = VIR_DOMAIN_NUMA_INTERCONNECT_TYPE_LATENCY; type = VIR_DOMAIN_NUMA_INTERCONNECT_TYPE_LATENCY;
if (virXMLPropULongLong(nodes[i], "value", 10, if (virXMLPropULongLong(interconnect[i], "value", 10,
VIR_XML_PROP_REQUIRED, &value) < 0) VIR_XML_PROP_REQUIRED, &value) < 0)
goto cleanup; return -1;
} else if (virXMLNodeNameEqual(nodes[i], "bandwidth")) { } else if (virXMLNodeNameEqual(interconnect[i], "bandwidth")) {
VIR_XPATH_NODE_AUTORESTORE(ctxt) VIR_XPATH_NODE_AUTORESTORE(ctxt)
type = VIR_DOMAIN_NUMA_INTERCONNECT_TYPE_BANDWIDTH; type = VIR_DOMAIN_NUMA_INTERCONNECT_TYPE_BANDWIDTH;
ctxt->node = nodes[i]; ctxt->node = interconnect[i];
if (virDomainParseMemory("./@value", "./@unit", ctxt, &value, true, false) < 0) if (virDomainParseMemory("./@value", "./@unit", ctxt, &value, true, false) < 0)
goto cleanup; return -1;
} else { } else {
/* Ignore yet unknown child elements. */ /* Ignore yet unknown child elements. */
continue; continue;
} }
if (virXMLPropUInt(nodes[i], "initiator", 10, VIR_XML_PROP_REQUIRED, if (virXMLPropUInt(interconnect[i], "initiator", 10, VIR_XML_PROP_REQUIRED,
&initiator) < 0) &initiator) < 0)
goto cleanup; return -1;
if (virXMLPropUInt(nodes[i], "target", 10, VIR_XML_PROP_REQUIRED, if (virXMLPropUInt(interconnect[i], "target", 10, VIR_XML_PROP_REQUIRED,
&target) < 0) &target) < 0)
goto cleanup; return -1;
if (virXMLPropUInt(nodes[i], "cache", 10, VIR_XML_PROP_NONE, if (virXMLPropUInt(interconnect[i], "cache", 10, VIR_XML_PROP_NONE,
&cache) < 0) &cache) < 0)
goto cleanup; return -1;
if (virXMLPropEnum(nodes[i], "type", virDomainMemoryLatencyTypeFromString, if (virXMLPropEnum(interconnect[i], "type",
virDomainMemoryLatencyTypeFromString,
VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO, VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
&accessType) < 0) &accessType) < 0)
goto cleanup; return -1;
def->interconnects[i] = (virDomainNumaInterconnect) {type, initiator, target, def->interconnects[i] = (virDomainNumaInterconnect) {type, initiator, target,
cache, accessType, value}; cache, accessType, value};
def->ninterconnects++; def->ninterconnects++;
} }
ret = 0; return 0;
cleanup:
VIR_FREE(nodes);
VIR_FREE(tmp);
return ret;
} }