[libvirt] [PATCH v2 04/16] conf, schema: add 'id' field for cells
Michal Privoznik
mprivozn at redhat.com
Fri Jul 11 15:11:05 UTC 2014
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 at redhat.com>
> ---
> 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
More information about the libvir-list
mailing list