On 08.07.2014 13:50, Martin Kletzander wrote: > In XML format, by definition, order of fields should not matter, so > order of parsing the elements doesn't affect the end result. When > specifying guest NUMA cells, we depend only on the order of the 'cell' > elements. With this patch all older domain XMLs are parsed as before, > but with the 'id' attribute they are parsed and formatted according to > that field. This will be useful when we have tuning settings for > particular guest NUMA node. > > Signed-off-by: Martin Kletzander <mkletzan@xxxxxxxxxx> > --- > docs/formatdomain.html.in | 11 +++--- > docs/schemas/domaincommon.rng | 5 +++ > src/conf/cpu_conf.c | 39 +++++++++++++++++++--- > src/conf/cpu_conf.h | 3 +- > src/qemu/qemu_command.c | 2 +- > tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.xml | 6 ++-- > tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.xml | 6 ++-- > tests/qemuxml2argvdata/qemuxml2argv-cpu-numa3.xml | 25 ++++++++++++++ > tests/qemuxml2argvtest.c | 1 + > .../qemuxml2xmlout-cpu-numa1.xml | 28 ++++++++++++++++ > .../qemuxml2xmlout-cpu-numa2.xml | 28 ++++++++++++++++ > tests/qemuxml2xmltest.c | 3 ++ > 12 files changed, 139 insertions(+), 18 deletions(-) > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-numa3.xml > create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa1.xml > create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa2.xml > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index b69da4c..ad87b7c 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -1030,8 +1030,8 @@ > <cpu> > ... > <numa> > - <cell cpus='0-3' memory='512000'/> > - <cell cpus='4-7' memory='512000'/> > + <cell id='0' cpus='0-3' memory='512000'/> > + <cell id='1' cpus='4-7' memory='512000'/> > </numa> > ... > </cpu> > @@ -1041,8 +1041,11 @@ > Each <code>cell</code> element specifies a NUMA cell or a NUMA node. > <code>cpus</code> specifies the CPU or range of CPUs that are part of > the node. <code>memory</code> specifies the node memory in kibibytes > - (i.e. blocks of 1024 bytes). Each cell or node is assigned cellid > - or nodeid in the increasing order starting from 0. > + (i.e. blocks of 1024 bytes). All cells should have <code>id</code> > + attribute in case referring to some cell is necessary in the code, > + otherwise the cells are assigned ids in the increasing order starting > + from 0. Mixing cells with and without the <code>id</code> attribute > + is not recommended as it may result in unwanted behaviour. I'd note here, that the @id attribute is since 1.2.7 > </p> > > <p> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index 7be028d..155a33e 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -3902,6 +3902,11 @@ > > <define name="numaCell"> > <element name="cell"> > + <optional> > + <attribute name="id"> > + <ref name="unsignedInt"/> > + </attribute> > + </optional> > <attribute name="cpus"> > <ref name="cpuset"/> > </attribute> > diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c > index 811893d..9e0af08 100644 > --- a/src/conf/cpu_conf.c > +++ b/src/conf/cpu_conf.c > @@ -152,7 +152,6 @@ virCPUDefCopy(const virCPUDef *cpu) > copy->ncells_max = copy->ncells = cpu->ncells; > > for (i = 0; i < cpu->ncells; i++) { > - copy->cells[i].cellid = cpu->cells[i].cellid; > copy->cells[i].mem = cpu->cells[i].mem; > > copy->cells[i].cpumask = virBitmapNewCopy(cpu->cells[i].cpumask); > @@ -438,17 +437,46 @@ virCPUDefParseXML(xmlNodePtr node, > for (i = 0; i < n; i++) { > char *cpus, *memory; > int ret, ncpus = 0; > + unsigned int cur_cell; > + char *tmp = NULL; > + > + tmp = virXMLPropString(nodes[i], "id"); > + if (!tmp) { > + cur_cell = i; > + } else { > + ret = virStrToLong_ui(tmp, NULL, 10, &cur_cell); > + VIR_FREE(tmp); > + if (ret == -1) { > + virReportError(VIR_ERR_XML_ERROR, "%s", > + _("Invalid 'id' attribute in NUMA cell")); > + goto error; > + } > + } If there's a typo in the @id, I think this can make users lives easier: diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index 9e0af08..5003cf1 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -445,12 +445,14 @@ virCPUDefParseXML(xmlNodePtr node, cur_cell = i; } else { ret = virStrToLong_ui(tmp, NULL, 10, &cur_cell); - VIR_FREE(tmp); if (ret == -1) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("Invalid 'id' attribute in NUMA cell")); + virReportError(VIR_ERR_XML_ERROR, + _("Invalid 'id' attribute in NUMA cell: %s"), + tmp); + VIR_FREE(tmp); goto error; } + VIR_FREE(tmp); } if (cur_cell >= n) { > + > + if (cur_cell >= n) { > + virReportError(VIR_ERR_XML_ERROR, "%s", > + _("Exactly one 'cell' element per guest " > + "NUMA cell allowed, non-contiguous ranges or " > + "ranges not starting from 0 are not allowed")); > + goto error; > + } > + > + if (def->cells[cur_cell].cpustr) { > + virReportError(VIR_ERR_XML_ERROR, > + _("Duplicate NUMA cell info for cell id '%u'"), > + cur_cell); > + goto error; > + } Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list