On Mon, Nov 13, 2017 at 09:50:32AM +0100, Martin Kletzander wrote: > Signed-off-by: Martin Kletzander <mkletzan@xxxxxxxxxx> > --- > docs/formatdomain.html.in | 24 ++ > docs/schemas/domaincommon.rng | 32 +++ > src/conf/domain_conf.c | 249 +++++++++++++++++++++ > src/conf/domain_conf.h | 21 ++ > src/util/virresctrl.c | 2 +- > .../genericxml2xmlindata/generic-cachetune-cdp.xml | 36 +++ > .../generic-cachetune-colliding-allocs.xml | 30 +++ > .../generic-cachetune-colliding-tunes.xml | 32 +++ > .../generic-cachetune-colliding-types.xml | 30 +++ > .../generic-cachetune-small.xml | 29 +++ > tests/genericxml2xmlindata/generic-cachetune.xml | 33 +++ > tests/genericxml2xmltest.c | 10 + > 12 files changed, 527 insertions(+), 1 deletion(-) > create mode 100644 tests/genericxml2xmlindata/generic-cachetune-cdp.xml > create mode 100644 tests/genericxml2xmlindata/generic-cachetune-colliding-allocs.xml > create mode 100644 tests/genericxml2xmlindata/generic-cachetune-colliding-tunes.xml > create mode 100644 tests/genericxml2xmlindata/generic-cachetune-colliding-types.xml > create mode 100644 tests/genericxml2xmlindata/generic-cachetune-small.xml > create mode 100644 tests/genericxml2xmlindata/generic-cachetune.xml [...] > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 400e900325f2..bf9e61efc8d2 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c [...] > +static int > +virDomainCachetuneDefParse(virDomainDefPtr def, > + xmlXPathContextPtr ctxt, > + xmlNodePtr node) > +{ > + xmlNodePtr oldnode = ctxt->node; > + xmlNodePtr *nodes = NULL; > + virBitmapPtr vcpus = NULL; > + virResctrlAllocPtr alloc = NULL; > + virDomainCachetuneDefPtr tmp_cachetune = NULL; > + char *tmp = NULL; > + char *vcpus_str = NULL; > + ssize_t i = 0; > + int n; > + int ret = -1; > + > + ctxt->node = node; > + > + if (VIR_ALLOC(tmp_cachetune) < 0) > + goto cleanup; > + > + vcpus_str = virXMLPropString(node, "vcpus"); > + if (!vcpus_str) { > + virReportError(VIR_ERR_XML_ERROR, "%s", > + _("Missing attribute vcpus for cachetune")); > + goto cleanup; > + } > + if (virBitmapParse(vcpus_str, &vcpus, VIR_DOMAIN_CPUMASK_LEN) < 0) { > + virReportError(VIR_ERR_XML_ERROR, > + _("Invalid attribute vcpus '%s' for cachetune"), > + vcpus_str); > + goto cleanup; > + } > + > + if ((n = virXPathNodeSet("./cache", ctxt, &nodes)) < 0) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("cannot extract cachetune/cache nodes")); > + goto cleanup; > + } > + > + for (i = 0; i < n; i++) { > + if (virDomainCachetuneDefParseCache(ctxt, nodes[i], &alloc) < 0) > + goto cleanup; > + } > + > + if (!alloc) { > + ret = 0; > + goto cleanup; > + } > + > + virBitmapShrink(vcpus, def->maxvcpus); > + > + for (i = 0; i < def->ncachetunes; i++) { > + if (virBitmapOverlaps(def->cachetunes[i]->vcpus, vcpus)) { > + virReportError(VIR_ERR_XML_ERROR, "%s", > + _("Overlapping vcpus in cachetunes")); > + goto cleanup; > + } > + } > + > + if (virResctrlAllocSetID(alloc, vcpus_str) < 0) > + goto cleanup; > + > + tmp_cachetune->vcpus = vcpus; > + tmp_cachetune->alloc = alloc; > + vcpus = NULL; > + alloc = NULL; VIR_STEAL_PTR() > + > + if (VIR_APPEND_ELEMENT(def->cachetunes, def->ncachetunes, tmp_cachetune) < 0) > + goto cleanup; > + > + ret = 0; > + cleanup: > + ctxt->node = oldnode; > + virDomainCachetuneDefFree(tmp_cachetune); > + virObjectUnref(alloc); > + virBitmapFree(vcpus); > + VIR_FREE(vcpus_str); > + VIR_FREE(nodes); > + VIR_FREE(tmp); > + return ret; > +} > + > + > static virDomainDefPtr > virDomainDefParseXML(xmlDocPtr xml, > xmlNodePtr root, > @@ -18632,6 +18804,18 @@ virDomainDefParseXML(xmlDocPtr xml, > } > VIR_FREE(nodes); > > + if ((n = virXPathNodeSet("./cputune/cachetune", ctxt, &nodes)) < 0) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("cannot extract cachetune nodes")); > + goto error; > + } > + > + for (i = 0; i < n; i++) { > + if (virDomainCachetuneDefParse(def, ctxt, nodes[i]) < 0) > + goto error; > + } > + VIR_FREE(nodes); > + > if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &def->cpu) < 0) > goto error; > > @@ -25444,6 +25628,68 @@ virDomainSchedulerFormat(virBufferPtr buf, > } > > > +struct virCachetuneHelperData { > + virBufferPtr buf; > + size_t vcpu_id; > +}; > + > +static int > +virDomainCachetuneDefFormatHelper(unsigned int level, > + virCacheType type, > + unsigned int cache, > + unsigned long long size, > + void *opaque) Wrong indentation. > +{ > + const char *unit; > + virBufferPtr buf = opaque; > + unsigned long long short_size = virPrettySize(size, &unit); > + > + virBufferAsprintf(buf, > + "<cache id='%u' level='%u' type='%s' " > + "size='%llu' unit='%s'/>\n", > + cache, level, virCacheTypeToString(type), > + short_size, unit); > + > + return 0; > +} Pavel
Attachment:
signature.asc
Description: PGP signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list