[libvirt] [PATCH] conf: Format numatune XML correctly while placement is none
Daniel P. Berrange
berrange at redhat.com
Wed Jun 20 09:17:53 UTC 2012
On Wed, Jun 20, 2012 at 05:09:38PM +0800, Osier Yang wrote:
> setNumaParameters tunes the numa setting using cgroup, it's another
> entry except libnuma/numad for numa tuning. And it doesn't set the
> placement, and further more, the formating codes doesn't take this
> into consideration.
>
> How to reproduce:
>
> conn = libvirt.open(None)
> dom = conn.lookupByName('linux')
> param = {'numa_nodeset': '0', 'numa_mode': 1}
> dom.setNumaParameters(param, 2)
>
> % virsh start linux
> error: Failed to start domain rhel6.3rc
> error: (domain_definition):8: error parsing attribute name
> <memory mode='preferred' </numatune>
> -------------------------------^
>
> ---
> By the way, I see problems of setNumaParameters too.
>
> conn = libvirt.open(None)
> dom = conn.lookupByName('linux')
> param = {'numa_mode': 1}
> dom.setNumaParameters(param, 2)
>
> The numa 'mode' will be just ignored, and no 'numatune' XML is formated,
> as neither 'nodeset' nor 'placement' is specified. I'd think it's
> right to ignore it when formating, it's meaningless to only specify
> the 'mode'. However, we might have to fix setNumaParameters to prevent
> setting the numa mode without nodeset, and error out, as it's really a
> bad user experience to see the API call succeeded, but the expected
> XML doesn't show up in the end.
> ---
> src/conf/domain_conf.c | 17 ++++++++++-------
> 1 files changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 81c6308..c44d89d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -12795,23 +12795,26 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> const char *placement;
>
> mode = virDomainNumatuneMemModeTypeToString(def->numatune.memory.mode);
> - virBufferAsprintf(buf, " <memory mode='%s' ", mode);
> + virBufferAsprintf(buf, " <memory mode='%s'", mode);
>
> - if (def->numatune.memory.placement_mode ==
> - VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_STATIC) {
> + if (def->numatune.memory.nodemask) {
> nodemask = virDomainCpuSetFormat(def->numatune.memory.nodemask,
> - VIR_DOMAIN_CPUMASK_LEN);
> + 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);
> + virBufferAsprintf(buf, " nodeset='%s'/>\n", nodemask);
> VIR_FREE(nodemask);
> - } else if (def->numatune.memory.placement_mode) {
> + } else if (def->numatune.memory.placement_mode ==
> + VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO) {
> placement = virDomainNumatuneMemPlacementModeTypeToString(def->numatune.memory.placement_mode);
> - virBufferAsprintf(buf, "placement='%s'/>\n", placement);
> + virBufferAsprintf(buf, " placement='%s'/>\n", placement);
> + } else {
> + /* Should not hit here. */
> + virBufferAddLit(buf, "/>\n");
> }
> virBufferAddLit(buf, " </numatune>\n");
> }
The fact that we had such a horrific XML formatting bug shows that
there is a gap in our test coverage. Please add additional test
cases to cover this scenario
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list