On Mon, Nov 13, 2017 at 09:50:32AM +0100, Martin Kletzander wrote:
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
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