separate virDomainDefParseCputuneInfo from virDomainDefParseXML --- src/conf/domain_conf.c | 227 +++++++++++++++++++++++++++---------------------- 1 file changed, 124 insertions(+), 103 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1d74631..e50e56f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18996,88 +18996,24 @@ virDomainDefParseIoThreadInfo(virDomainParseTotalParamPtr param) } -static virDomainDefPtr -virDomainDefParseXML(xmlDocPtr xml, - xmlNodePtr root, - xmlXPathContextPtr ctxt, - virCapsPtr caps, - virDomainXMLOptionPtr xmlopt, - void *parseOpaque, - unsigned int flags) +static int +virDomainDefParseCputuneInfo(virDomainParseTotalParamPtr param) { - typedef int (*virDomainPreaseInfoFunc)(virDomainParseTotalParamPtr params); - - xmlNodePtr *nodes = NULL, node = NULL; - char *tmp = NULL; - size_t i, j; - int n, gic_version; - size_t fun_index = 0; - virDomainDefPtr def; - bool uuid_generated = false; - virHashTablePtr bootHash = NULL; - bool usb_none = false; - bool usb_other = false; - bool usb_master = false; - char *netprefix = NULL; - virDomainParseTotalParam param = { - NULL, - xml, - root, - ctxt, - caps, - xmlopt, - parseOpaque, - flags, - false, - false, - false, - false - - }; - - virDomainPreaseInfoFunc parse_funs[] = { - virDomainDefParseIdInfo, - virDomainDefParseVirtTypeInfo, - virDomainDefParseOsNodeInfo, - virDomainDefParseDomainInfo, - virDomainDefParseSecurityLabelInfo, - virDomainDefParseMemoryInfo, - virDomainDefParseBikiotuneInfo, - virDomainDefParseVcpuInfo, - virDomainDefParseIoThreadInfo, - NULL - }; - - if (flags & VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA) { - char *schema = virFileFindResource("domain.rng", - abs_topsrcdir "/docs/schemas", - PKGDATADIR "/schemas"); - if (!schema) - return NULL; - if (virXMLValidateAgainstSchema(schema, xml) < 0) { - VIR_FREE(schema); - return NULL; - } - VIR_FREE(schema); - } - - if (!(def = virDomainDefNew())) - return NULL; - - param.def = def; + virDomainDefPtr def = param->def; + xmlXPathContextPtr ctxt = param->ctxt; + unsigned int flags = param->flags; - while (parse_funs[fun_index]) { - if (parse_funs[fun_index](¶m) < 0) - goto error; - fun_index++; - } + int ret = -1; + int n; + size_t i; + xmlNodePtr *nodes = NULL; /* Extract cpu tunables. */ if ((n = virXPathULongLong("string(./cputune/shares[1])", ctxt, &def->cputune.shares)) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune shares value")); - goto error; + goto cleanup; } else if (n == 0) { def->cputune.sharesSpecified = true; } @@ -19086,7 +19022,7 @@ virDomainDefParseXML(xmlDocPtr xml, &def->cputune.period) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune period value")); - goto error; + goto cleanup; } if (def->cputune.period > 0 && @@ -19094,14 +19030,14 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune period must be in range " "[1000, 1000000]")); - goto error; + goto cleanup; } if (virXPathLongLong("string(./cputune/quota[1])", ctxt, &def->cputune.quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune quota value")); - goto error; + goto cleanup; } if (def->cputune.quota > 0 && @@ -19110,14 +19046,14 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune quota must be in range " "[1000, 18446744073709551]")); - goto error; + goto cleanup; } if (virXPathULongLong("string(./cputune/global_period[1])", ctxt, &def->cputune.global_period) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune global period value")); - goto error; + goto cleanup; } if (def->cputune.global_period > 0 && @@ -19125,14 +19061,14 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune global period must be in range " "[1000, 1000000]")); - goto error; + goto cleanup; } if (virXPathLongLong("string(./cputune/global_quota[1])", ctxt, &def->cputune.global_quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune global quota value")); - goto error; + goto cleanup; } if (def->cputune.global_quota > 0 && @@ -19141,14 +19077,14 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune global quota must be in range " "[1000, 18446744073709551]")); - goto error; + goto cleanup; } if (virXPathULongLong("string(./cputune/emulator_period[1])", ctxt, &def->cputune.emulator_period) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune emulator period value")); - goto error; + goto cleanup; } if (def->cputune.emulator_period > 0 && @@ -19157,14 +19093,14 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune emulator_period must be in range " "[1000, 1000000]")); - goto error; + goto cleanup; } if (virXPathLongLong("string(./cputune/emulator_quota[1])", ctxt, &def->cputune.emulator_quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune emulator quota value")); - goto error; + goto cleanup; } if (def->cputune.emulator_quota > 0 && @@ -19173,14 +19109,14 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune emulator_quota must be in range " "[1000, 18446744073709551]")); - goto error; + goto cleanup; } if (virXPathULongLong("string(./cputune/iothread_period[1])", ctxt, &def->cputune.iothread_period) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune iothread period value")); - goto error; + goto cleanup; } if (def->cputune.iothread_period > 0 && @@ -19189,14 +19125,14 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune iothread_period must be in range " "[1000, 1000000]")); - goto error; + goto cleanup; } if (virXPathLongLong("string(./cputune/iothread_quota[1])", ctxt, &def->cputune.iothread_quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", _("can't parse cputune iothread quota value")); - goto error; + goto cleanup; } if (def->cputune.iothread_quota > 0 && @@ -19205,22 +19141,22 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Value of cputune iothread_quota must be in range " "[1000, 18446744073709551]")); - goto error; + goto cleanup; } if ((n = virXPathNodeSet("./cputune/vcpupin", ctxt, &nodes)) < 0) - goto error; + goto cleanup; for (i = 0; i < n; i++) { if (virDomainVcpuPinDefParseXML(def, nodes[i])) - goto error; + goto cleanup; } VIR_FREE(nodes); if ((n = virXPathNodeSet("./cputune/emulatorpin", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot extract emulatorpin nodes")); - goto error; + goto cleanup; } if (n) { @@ -19228,11 +19164,11 @@ virDomainDefParseXML(xmlDocPtr xml, virReportError(VIR_ERR_XML_ERROR, "%s", _("only one emulatorpin is supported")); VIR_FREE(nodes); - goto error; + goto cleanup; } if (!(def->cputune.emulatorpin = virDomainEmulatorPinDefParseXML(nodes[0]))) - goto error; + goto cleanup; } VIR_FREE(nodes); @@ -19240,51 +19176,136 @@ virDomainDefParseXML(xmlDocPtr xml, if ((n = virXPathNodeSet("./cputune/iothreadpin", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot extract iothreadpin nodes")); - goto error; + goto cleanup; } for (i = 0; i < n; i++) { if (virDomainIOThreadPinDefParseXML(nodes[i], def) < 0) - goto error; + goto cleanup; } VIR_FREE(nodes); if ((n = virXPathNodeSet("./cputune/vcpusched", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot extract vcpusched nodes")); - goto error; + goto cleanup; } for (i = 0; i < n; i++) { if (virDomainVcpuThreadSchedParse(nodes[i], def) < 0) - goto error; + goto cleanup; } VIR_FREE(nodes); if ((n = virXPathNodeSet("./cputune/iothreadsched", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot extract iothreadsched nodes")); - goto error; + goto cleanup; } for (i = 0; i < n; i++) { if (virDomainIOThreadSchedParse(nodes[i], def) < 0) - goto error; + goto cleanup; } VIR_FREE(nodes); if ((n = virXPathNodeSet("./cputune/cachetune", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot extract cachetune nodes")); - goto error; + goto cleanup; } for (i = 0; i < n; i++) { if (virDomainCachetuneDefParse(def, ctxt, nodes[i], flags) < 0) - goto error; + goto cleanup; } VIR_FREE(nodes); + ret = 0; + + cleanup: + VIR_FREE(nodes); + return ret; +} + + +static virDomainDefPtr +virDomainDefParseXML(xmlDocPtr xml, + xmlNodePtr root, + xmlXPathContextPtr ctxt, + virCapsPtr caps, + virDomainXMLOptionPtr xmlopt, + void *parseOpaque, + unsigned int flags) +{ + typedef int (*virDomainPreaseInfoFunc)(virDomainParseTotalParamPtr params); + + xmlNodePtr *nodes = NULL, node = NULL; + char *tmp = NULL; + size_t i, j; + int n, gic_version; + size_t fun_index = 0; + virDomainDefPtr def; + bool uuid_generated = false; + virHashTablePtr bootHash = NULL; + bool usb_none = false; + bool usb_other = false; + bool usb_master = false; + char *netprefix = NULL; + virDomainParseTotalParam param = { + NULL, + xml, + root, + ctxt, + caps, + xmlopt, + parseOpaque, + flags, + false, + false, + false, + false + + }; + + virDomainPreaseInfoFunc parse_funs[] = { + virDomainDefParseIdInfo, + virDomainDefParseVirtTypeInfo, + virDomainDefParseOsNodeInfo, + virDomainDefParseDomainInfo, + virDomainDefParseSecurityLabelInfo, + virDomainDefParseMemoryInfo, + virDomainDefParseBikiotuneInfo, + virDomainDefParseVcpuInfo, + virDomainDefParseIoThreadInfo, + virDomainDefParseCputuneInfo, + NULL + }; + + if (flags & VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA) { + char *schema = virFileFindResource("domain.rng", + abs_topsrcdir "/docs/schemas", + PKGDATADIR "/schemas"); + if (!schema) + return NULL; + if (virXMLValidateAgainstSchema(schema, xml) < 0) { + VIR_FREE(schema); + return NULL; + } + VIR_FREE(schema); + } + + if (!(def = virDomainDefNew())) + return NULL; + + param.def = def; + + while (parse_funs[fun_index]) { + if (parse_funs[fun_index](¶m) < 0) + goto error; + fun_index++; + } + if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &def->cpu) < 0) goto error; -- 2.8.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list