[libvirt] [PATCH v2 07/16] numatune: Encapsulate numatune configuration in order to unify results

Michal Privoznik mprivozn at redhat.com
Fri Jul 11 15:11:00 UTC 2014


On 08.07.2014 13:50, Martin Kletzander wrote:
> There were numerous places where numatune configuration (and thus
> domain config as well) was changed in different ways.  On some
> places this even resulted in persistent domain definition not to be
> stable (it would change with daemon's restart).
>
> In order to uniformly change how numatune config is dealt with, all
> the internals are now accessible directly only in numatune_conf.c and
> outside this file accessors must be used.
>
> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> ---
>   po/POTFILES.in                                     |   1 +
>   src/conf/domain_conf.c                             | 159 ++---------
>   src/conf/domain_conf.h                             |   8 +-
>   src/conf/numatune_conf.c                           | 316 +++++++++++++++++++++
>   src/conf/numatune_conf.h                           |  72 ++++-
>   src/libvirt_private.syms                           |  11 +
>   src/lxc/lxc_cgroup.c                               |  19 +-
>   src/lxc/lxc_controller.c                           |   5 +-
>   src/lxc/lxc_native.c                               |  15 +-
>   src/parallels/parallels_driver.c                   |   7 +-
>   src/qemu/qemu_cgroup.c                             |  23 +-
>   src/qemu/qemu_driver.c                             |  84 +++---
>   src/qemu/qemu_process.c                            |   8 +-
>   src/util/virnuma.c                                 |  48 ++--
>   src/util/virnuma.h                                 |   2 +-
>   .../qemuxml2argv-numatune-auto-prefer.xml          |  29 ++
>   .../qemuxml2xmlout-numatune-auto-prefer.xml        |  29 ++
>   tests/qemuxml2xmltest.c                            |   2 +
>   18 files changed, 553 insertions(+), 285 deletions(-)
>   create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numatune-auto-prefer.xml
>   create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-auto-prefer.xml

Nice.

> diff --git a/src/conf/numatune_conf.c b/src/conf/numatune_conf.c
> index 14300f0..8b66558 100644
> --- a/src/conf/numatune_conf.c
> +++ b/src/conf/numatune_conf.c

> +int
> +virDomainNumatuneParseXML(virDomainDefPtr def,
> +                          xmlXPathContextPtr ctxt)
> +{
> +    char *tmp = NULL;
> +    int mode = -1;
> +    int n = 0;
> +    int placement = -1;
> +    int ret = -1;
> +    virBitmapPtr nodeset = NULL;
> +    xmlNodePtr node = NULL;
> +
> +    if (virXPathInt("count(./numatune)", ctxt, &n) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("cannot extract numatune nodes"));
> +        goto cleanup;
> +    } else if (n > 1) {
> +        virReportError(VIR_ERR_XML_ERROR, "%s",
> +                       _("only one numatune is supported"));
> +        goto cleanup;
> +    }
> +
> +    node = virXPathNode("./numatune/memory[1]", ctxt);
> +
> +    if (def->numatune) {
> +        virDomainNumatuneFree(def->numatune);
> +        def->numatune = NULL;
> +    }
> +
> +    if (!node && def->placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
> +        return 0;
> +
> +    if (!node) {
> +        /* We know that def->placement_mode is "auto" if we're here */
> +        if (virDomainNumatuneSet(def, VIR_DOMAIN_NUMATUNE_PLACEMENT_AUTO,
> +                                 -1, NULL) < 0)
> +            goto cleanup;
> +        return 0;
> +    }
> +
> +    tmp = virXMLPropString(node, "mode");
> +    if (tmp) {
> +        mode = virDomainNumatuneMemModeTypeFromString(tmp);
> +        if (mode < 0) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("Unsupported NUMA memory tuning mode '%s'"),
> +                           tmp);
> +            goto cleanup;
> +        }
> +    }
> +    VIR_FREE(tmp);
> +
> +    tmp = virXMLPropString(node, "placement");
> +    if (tmp) {
> +        placement = virDomainNumatunePlacementTypeFromString(tmp);
> +        if (placement < 0) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("Unsupported NUMA memory placement mode '%s'"),
> +                           tmp);
> +            goto cleanup;
> +        }
> +    }
> +    VIR_FREE(tmp);
> +
> +    tmp = virXMLPropString(node, "nodeset");
> +    if (tmp && virBitmapParse(tmp, 0, &nodeset, VIR_DOMAIN_CPUMASK_LEN) < 0)
> +        goto cleanup;
> +    VIR_FREE(tmp);
> +
> +    if (virDomainNumatuneSet(def, placement, mode, nodeset) < 0)

The virDomainNumatuneSet() takes a copy of @nodeset, so you need to call 
virBitmaskFree(nodeset); at the cleanup label.

> +        goto cleanup;
> +
> +    if (!n) {
> +        ret = 0;
> +        goto cleanup;
> +    }
> +
> +    ret = 0;
> + cleanup:
> +    VIR_FREE(tmp);
> +    return ret;
> +}
> +
> +int
> +virDomainNumatuneFormatXML(virBufferPtr buf,
> +                           virDomainNumatunePtr numatune)
> +{
> +    const char *tmp = NULL;

s /const// ..

> +
> +    if (!numatune)
> +        return 0;
> +
> +    virBufferAddLit(buf, "<numatune>\n");
> +    virBufferAdjustIndent(buf, 2);
> +
> +    tmp = virDomainNumatuneMemModeTypeToString(numatune->memory.mode);
> +    virBufferAsprintf(buf, "<memory mode='%s' ", tmp);
> +
> +    if (numatune->memory.placement == VIR_DOMAIN_NUMATUNE_PLACEMENT_STATIC) {
> +        if (!(tmp = virBitmapFormat(numatune->memory.nodeset)))
> +            return -1;
> +        virBufferAsprintf(buf, "nodeset='%s'/>\n", tmp);
> +        VIR_FREE(tmp);

.. because free()-ing a const char * is not nice. If you, however, do 
this I bet you'll get error in TypeToString(). So just leave tmp as 
const char * and introduce char *nodeset;

> +    } else if (numatune->memory.placement) {
> +        tmp = virDomainNumatunePlacementTypeToString(numatune->memory.placement);
> +        virBufferAsprintf(buf, "placement='%s'/>\n", tmp);
> +    }
> +
> +    virBufferAdjustIndent(buf, -2);
> +    virBufferAddLit(buf, "</numatune>\n");
> +    return 0;
> +}
> +

Michal




More information about the libvir-list mailing list