[libvirt] [PATCH 17/21] conf: cachetune
Pavel Hrdina
phrdina at redhat.com
Thu Nov 16 09:13:49 UTC 2017
On Mon, Nov 13, 2017 at 09:50:32AM +0100, Martin Kletzander wrote:
> Signed-off-by: Martin Kletzander <mkletzan at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20171116/d6d329cb/attachment-0001.sig>
More information about the libvir-list
mailing list