[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