[libvirt] [PATCH 1/5] numad: Set memory policy according to the advisory nodeset from numad

Eric Blake eblake at redhat.com
Tue May 8 21:58:31 UTC 2012


On 05/08/2012 10:04 AM, Osier Yang wrote:
> Though numad will manage the memory allocation of task dynamically,
> but it wants management application (libvirt) to pre-set the memory
> policy according to the advisory nodeset returned from querying numad,
> (just like pre-bind CPU nodeset for domain process), and thus the
> performance could benifit much more from it.

s/benifit/benefit/

> 
> This patch introduces new XML tag 'placement', value 'auto' indicates
> whether to set the memory policy with the advisory nodeset from numad,
> and its value defaults to the value of <vcpu> placement, or 'static'
> if 'nodeset' is specified. Example of the new XML tag's usage:
> 
>   <numatune>
>     <memory placement='auto' mode='interleave'/>
>   </numatune>
> 
> Just like what current "numatune" does, the 'auto' numa memory policy
> setting uses libnuma's API too.
> 
> If <vcpu> "placement" is "auto", and <numatune> is not specified
> explicitly, a default <numatume> will be added with "placement"
> set as "auto", and "mode" set as "strict".
> 
> The following XML can now fully drive numad:
> 
> 1) <vcpu> placement is 'auto', no <numatune> is specified.
> 
>    <vcpu placement='auto'>10</vcpu>
> 
> 2) <vcpu> placement is 'auto', no 'placement' is specified for
>    <numatune>.
> 
>    <vcpu placement='auto'>10</vcpu>
>    <numatune>
>      <memory mode='interleave'/>
>    </numatune>
> 
> And it's aslo able to control the CPU placement and memory policy

s/aslo/also/

> independantly. e.g.

s/independantly/independently/

> 
> 1) <vcpu> placement is 'auto', and <numatune> placement is 'static'
> 
>    <vcpu placement='auto'>10</vcpu>
>    <numatune>
>      <memory mode='strict' nodeset='0-10,^7'/>
>    </numatune>
> 
> 2) <vcpu> placement is 'static', and <numatune> placement is 'auto'
> 
>    <vcpu placement='static' cpuset='0-24,^12'>10</vcpu>
>    <numatune>
>      <memory mode='interleave' placement='auto'/>
>    </numatume>
> 
> A follow up patch will change the XML formating codes to always output

s/formating/formatting/

> 'placement' for <vcpu>, even it's 'static'.
> 
> v1 ~ v2:
>   * Changes on <numatune> parsing so that the <numatune> "placement"
>     could default to <vcpu> "placement".
>   * Add member 'default' for enum virDomainNumatuneMemPlacementMode.
>   * Output "placement" for <numatune> even it's static.
>   * Update docs/formatdomain.html.in
>   * Correct the changes on docs/schemas/domaincommon.rng
>   * New tests for the combinations of <vcpu> and <numatune>.
>   * Change on spec file is splitted off.

Patch versioning details can go after the ---, so that it isn't recorded
into the actual git commit log (it is useful for review, but not worth
storing permanently).

> ---
>  docs/formatdomain.html.in                          |   23 +++-
>  docs/schemas/domaincommon.rng                      |   36 ++++--
>  src/conf/domain_conf.c                             |  128 +++++++++++++++-----
>  src/conf/domain_conf.h                             |   10 ++
>  src/libvirt_private.syms                           |    2 +
>  src/qemu/qemu_process.c                            |   85 ++++++++------
>  .../qemuxml2argv-numad-auto-vcpu-no-numatune.xml   |   29 +++++
>  ...muxml2argv-numad-auto-vcpu-static-numatune.args |    4 +
>  ...emuxml2argv-numad-auto-vcpu-static-numatune.xml |   31 +++++
>  .../qemuxml2argv-numad-static-vcpu-no-numatune.xml |   29 +++++
>  tests/qemuxml2argvdata/qemuxml2argv-numad.args     |    4 +
>  tests/qemuxml2argvdata/qemuxml2argv-numad.xml      |   31 +++++
>  tests/qemuxml2argvtest.c                           |    2 +
>  .../qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml |   32 +++++
>  ...emuxml2xmlout-numad-static-vcpu-no-numatune.xml |   29 +++++
>  tests/qemuxml2xmltest.c                            |    2 +
>  16 files changed, 394 insertions(+), 83 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numad-auto-vcpu-no-numatune.xml
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numad-auto-vcpu-static-numatune.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numad-auto-vcpu-static-numatune.xml
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numad-static-vcpu-no-numatune.xml
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numad.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numad.xml
>  create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-auto-vcpu-no-numatune.xml
>  create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-numad-static-vcpu-no-numatune.xml

Git (and for that matter, patch) did not like your patch; you had a hunk
that was misnumbered [*].  I had a bear of a time figuring out how to
get this to apply.

> +++ b/src/conf/domain_conf.c
...

> @@ -12491,25 +12545,33 @@ virDomainDefFormatInternal(virDomainDefPtr def,

[*] here's where the patch was corrupt - it claims 33 lines post-patch,
but you only provide 32 lines...

>          def->cputune.period || def->cputune.quota)
>          virBufferAddLit(buf, "  </cputune>\n");
>  
> -    if (def->numatune.memory.nodemask) {
> +    if (def->numatune.memory.nodemask ||
> +        def->numatune.memory.placement_mode) {
>          virBufferAddLit(buf, "  <numatune>\n");
>          const char *mode;
>          char *nodemask = NULL;
> -
> -        nodemask = virDomainCpuSetFormat(def->numatune.memory.nodemask,
> -                                         VIR_DOMAIN_CPUMASK_LEN);
> -        if (nodemask == NULL) {
> -            virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                                 _("failed to format nodeset for "
> -                                   "NUMA memory tuning"));
> -            goto cleanup;
> -        }
> +        const char *placement;
>  
>          mode = virDomainNumatuneMemModeTypeToString(def->numatune.memory.mode);
> -        virBufferAsprintf(buf, "    <memory mode='%s' nodeset='%s'/>\n",
> -                              mode, nodemask);
> -        VIR_FREE(nodemask);
> +        virBufferAsprintf(buf, "    <memory mode='%s' ", mode);
>  
> +        if (def->numatune.memory.placement_mode ==
> +            VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_STATIC) {
> +            nodemask = virDomainCpuSetFormat(def->numatune.memory.nodemask,
> +                                         VIR_DOMAIN_CPUMASK_LEN);
> +            if (nodemask == NULL) {
> +                virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                                     _("failed to format nodeset for "
> +                                       "NUMA memory tuning"));
> +                goto cleanup;
> +            }
> +            virBufferAsprintf(buf, "nodeset='%s'/>\n", nodemask);
> +            VIR_FREE(nodemask);
> +        } else if (def->numatune.memory.placement_mode) {
> +            placement = virDomainNumatuneMemPlacementModeTypeToString(def->numatune.memory.placement_mode);
> +            virBufferAsprintf(buf, "placement='%s'/>\n", placement);
> +        }
>          virBufferAddLit(buf, "  </numatune>\n");
>      }
>  
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h

which mean that the patch tools tried to treat this line as part of the
previous hunk instead of the start of a new file to patch.

But everything else looked okay.  ACK; I'll finish reviewing the rest of
the series, and then probably push.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120508/e7a1e23b/attachment-0001.sig>


More information about the libvir-list mailing list