Reference :
=======
v1:
http://www.spinics.net/linux/fedora/libvir/msg105516.html
Changes since v1:
===========
1) As suggested by Michal, a new function "virCPUNumaCellMemoryParseXML" has
been introduced for neat computation of NUMA memory.
2) Patches 2 & 3 of v1 have been merged together into this cumulative patch.
3) Corresponding documentation added.
From 2199d97b88cf9eab29788fb0e440c4b0a0bb23ec Mon Sep 17 00:00:00 2001
From: Prerna Saxena <prerna(a)linux.vnet.ibm.com>
Date: Mon, 3 Nov 2014 07:53:59 +0530
CPU numa topology implicitly allows memory specification in 'KiB'.
Enabling this to accept the 'unit' in which memory needs to be specified.
This now allows users to specify memory in units of choice, and
lists the same in 'KiB' -- just like other 'memory' elements in XML.
<numa>
<cell cpus='0-3' memory='1024' unit='MiB' />
<cell cpus='4-7' memory='1024' unit='MiB' />
</numa>
Also augment test cases to correctly model NUMA memory specification.
This adds the tag 'unit="KiB"' for memory attribute in NUMA cells.
Signed-off-by: Prerna Saxena <prerna(a)linux.vnet.ibm.com>
---
docs/formatdomain.html.in | 6 ++-
docs/schemas/domaincommon.rng | 5 ++
src/conf/cpu_conf.c | 62 ++++++++++++++++------
.../qemuxml2argv-cpu-numa-disjoint.xml | 4 +-
.../qemuxml2argv-cpu-numa-memshared.xml | 4 +-
tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.xml | 4 +-
tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.xml | 4 +-
tests/qemuxml2argvdata/qemuxml2argv-cpu-numa3.xml | 4 +-
.../qemuxml2argv-hugepages-pages.xml | 8 +--
.../qemuxml2argv-hugepages-pages2.xml | 4 +-
.../qemuxml2argv-hugepages-pages3.xml | 4 +-
.../qemuxml2argv-hugepages-pages4.xml | 8 +--
.../qemuxml2argv-hugepages-shared.xml | 8 +--
.../qemuxml2argv-numatune-auto-prefer.xml | 2 +-
.../qemuxml2argv-numatune-memnode-no-memory.xml | 4 +-
.../qemuxml2argv-numatune-memnode.xml | 6 +--
.../qemuxml2argv-numatune-memnodes-problematic.xml | 4 +-
.../qemuxml2xmlout-cpu-numa1.xml | 4 +-
.../qemuxml2xmlout-cpu-numa2.xml | 4 +-
.../qemuxml2xmlout-numatune-auto-prefer.xml | 2 +-
.../qemuxml2xmlout-numatune-memnode.xml | 6 +--
21 files changed, 97 insertions(+), 60 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 0099ce7..24afc87 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1140,8 +1140,8 @@
<cpu>
...
<numa>
- <cell id='0' cpus='0-3' memory='512000'/>
- <cell id='1' cpus='4-7' memory='512000'
memAccess='shared'/>
+ <cell id='0' cpus='0-3' memory='512000'
unit='KiB'/>
+ <cell id='1' cpus='4-7' memory='512000'
unit='KiB' memAccess='shared'/>
</numa>
...
</cpu>
@@ -1152,6 +1152,8 @@
<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).
+ <span class="since">Since 1.2.11</span> one can specify an
additional
+ <code>unit</code> attribute to describe the node memory unit.
<span class="since">Since 1.2.7</span> all cells should
have <code>id</code> attribute in case referring to some cell is
necessary in the code, otherwise the cells are
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 20d81ae..44cabad 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4144,6 +4144,11 @@
<ref name="memoryKB"/>
</attribute>
<optional>
+ <attribute name="unit">
+ <ref name="unit"/>
+ </attribute>
+ </optional>
+ <optional>
<attribute name="memAccess">
<choice>
<value>shared</value>
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index 5475c07..a0a60c8 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -177,6 +177,48 @@ virCPUDefCopy(const virCPUDef *cpu)
return NULL;
}
+static int
+virCPUNumaCellMemoryParseXML(xmlNodePtr node,
+ xmlXPathContextPtr ctxt,
+ unsigned long long* cellMemory)
+{
+ int ret = -1;
+ xmlNodePtr oldnode = ctxt->node;
+ unsigned long long bytes, max;
+ char *unit = NULL;
+
+ ctxt->node = node;
+
+ /* 32 vs 64 bit will differ in value of upper memory bound.
+ * On 32-bit machines, our bound is 0xffffffff * KiB. On 64-bit
+ * machines, our bound is off_t (2^63).
+ */
+ if (sizeof(unsigned long) < sizeof(long long))
+ max = 1024ull * ULONG_MAX;
+ else
+ max = LLONG_MAX;
+
+ if (virXPathULongLong("string(./@memory)", ctxt, &bytes) < 0) {
+ virReportError(VIR_ERR_XML_DETAIL, "%s",
+ _("unable to parse memory size attribute"));
+ goto cleanup;
+ }
+
+ unit = virXPathString("string(./@unit)", ctxt);
+
+ if (virScaleInteger(&bytes, unit, 1024, max) < 0)
+ goto cleanup;
+
+ *cellMemory = VIR_DIV_UP(bytes, 1024);
+
+ ret = 0;
+ cleanup:
+ VIR_FREE(unit);
+ ctxt->node = oldnode;
+ return ret;
+
+}
+
virCPUDefPtr
virCPUDefParseXML(xmlNodePtr node,
xmlXPathContextPtr ctxt,
@@ -440,7 +482,7 @@ virCPUDefParseXML(xmlNodePtr node,
def->ncells = n;
for (i = 0; i < n; i++) {
- char *cpus, *memory, *memAccessStr;
+ char *cpus, *memAccessStr;
int ret, ncpus = 0;
unsigned int cur_cell;
char *tmp = NULL;
@@ -489,21 +531,8 @@ virCPUDefParseXML(xmlNodePtr node,
goto error;
def->cells_cpus += ncpus;
- memory = virXMLPropString(nodes[i], "memory");
- if (!memory) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Missing 'memory' attribute in NUMA
cell"));
- goto error;
- }
-
- ret = virStrToLong_ull(memory, NULL, 10, &def->cells[cur_cell].mem);
- if (ret == -1) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Invalid 'memory' attribute in NUMA
cell"));
- VIR_FREE(memory);
- goto error;
- }
- VIR_FREE(memory);
+ virCPUNumaCellMemoryParseXML(nodes[i],
+ ctxt, &def->cells[cur_cell].mem);
memAccessStr = virXMLPropString(nodes[i], "memAccess");
if (memAccessStr) {
@@ -703,6 +732,7 @@ virCPUDefFormatBuf(virBufferPtr buf,
virBufferAsprintf(buf, " id='%zu'", i);
virBufferAsprintf(buf, " cpus='%s'",
def->cells[i].cpustr);
virBufferAsprintf(buf, " memory='%llu'",
def->cells[i].mem);
+ virBufferAddLit(buf, " unit='KiB'");
if (memAccess)
virBufferAsprintf(buf, " memAccess='%s'",
virMemAccessTypeToString(memAccess));
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-disjoint.xml
b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-disjoint.xml
index 474a238..bdffcd1 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-disjoint.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-disjoint.xml
@@ -11,8 +11,8 @@
<cpu>
<topology sockets='2' cores='4' threads='2'/>
<numa>
- <cell id='0' cpus='0-3,8-11' memory='109550'/>
- <cell id='1' cpus='4-7,12-15' memory='109550'/>
+ <cell id='0' cpus='0-3,8-11' memory='109550'
unit='KiB'/>
+ <cell id='1' cpus='4-7,12-15' memory='109550'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml
b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml
index cf7c040..c638ffa 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml
@@ -11,8 +11,8 @@
<cpu>
<topology sockets='2' cores='4' threads='2'/>
<numa>
- <cell id='0' cpus='0-7' memory='109550'
memAccess='shared'/>
- <cell id='1' cpus='8-15' memory='109550'
memAccess='private'/>
+ <cell id='0' cpus='0-7' memory='109550'
unit='KiB' memAccess='shared'/>
+ <cell id='1' cpus='8-15' memory='109550'
unit='KiB' memAccess='private'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.xml
b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.xml
index 0543f7f..20120e9 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa1.xml
@@ -11,8 +11,8 @@
<cpu>
<topology sockets='2' cores='4' threads='2'/>
<numa>
- <cell cpus='0-7' memory='109550'/>
- <cell cpus='8-15' memory='109550'/>
+ <cell cpus='0-7' memory='109550' unit='KiB'/>
+ <cell cpus='8-15' memory='109550' unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.xml
b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.xml
index 0a5f9fc..a90e7a2 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa2.xml
@@ -11,8 +11,8 @@
<cpu>
<topology sockets='2' cores='4' threads='2'/>
<numa>
- <cell id='1' cpus='8-15' memory='109550'/>
- <cell id='0' cpus='0-7' memory='109550'/>
+ <cell id='1' cpus='8-15' memory='109550'
unit='KiB'/>
+ <cell id='0' cpus='0-7' memory='109550'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa3.xml
b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa3.xml
index fa3070d..ea2dc81 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa3.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa3.xml
@@ -11,8 +11,8 @@
<cpu>
<topology sockets='2' cores='4' threads='2'/>
<numa>
- <cell id='1' cpus='0-7' memory='109550'/>
- <cell id='2' cpus='8-15' memory='109550'/>
+ <cell id='1' cpus='0-7' memory='109550'
unit='KiB'/>
+ <cell id='2' cpus='8-15' memory='109550'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages.xml
b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages.xml
index 5ad0695..b67df2f 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages.xml
@@ -20,10 +20,10 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='1048576'/>
- <cell id='1' cpus='1' memory='1048576'/>
- <cell id='2' cpus='2' memory='1048576'/>
- <cell id='3' cpus='3' memory='1048576'/>
+ <cell id='0' cpus='0' memory='1048576'
unit='KiB'/>
+ <cell id='1' cpus='1' memory='1048576'
unit='KiB'/>
+ <cell id='2' cpus='2' memory='1048576'
unit='KiB'/>
+ <cell id='3' cpus='3' memory='1048576'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages2.xml
b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages2.xml
index 3df870b..6afa6ef 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages2.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages2.xml
@@ -15,8 +15,8 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='262144'/>
- <cell id='1' cpus='1' memory='786432'/>
+ <cell id='0' cpus='0' memory='262144'
unit='KiB'/>
+ <cell id='1' cpus='1' memory='786432'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages3.xml
b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages3.xml
index 35aa2cf..21f4985 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages3.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages3.xml
@@ -15,8 +15,8 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='262144'/>
- <cell id='1' cpus='1' memory='786432'/>
+ <cell id='0' cpus='0' memory='262144'
unit='KiB'/>
+ <cell id='1' cpus='1' memory='786432'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages4.xml
b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages4.xml
index a3ed29b..eb18f24 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages4.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages4.xml
@@ -20,10 +20,10 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='1048576'/>
- <cell id='1' cpus='1' memory='1048576'/>
- <cell id='2' cpus='2' memory='1048576'/>
- <cell id='3' cpus='3' memory='1048576'/>
+ <cell id='0' cpus='0' memory='1048576'
unit='KiB'/>
+ <cell id='1' cpus='1' memory='1048576'
unit='KiB'/>
+ <cell id='2' cpus='2' memory='1048576'
unit='KiB'/>
+ <cell id='3' cpus='3' memory='1048576'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml
b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml
index e7db69c..52ca2f9 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml
@@ -20,10 +20,10 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='1048576'/>
- <cell id='1' cpus='1' memory='1048576'
memAccess='shared'/>
- <cell id='2' cpus='2' memory='1048576'
memAccess='private'/>
- <cell id='3' cpus='3' memory='1048576'/>
+ <cell id='0' cpus='0' memory='1048576'
unit='KiB'/>
+ <cell id='1' cpus='1' memory='1048576'
unit='KiB' memAccess='shared'/>
+ <cell id='2' cpus='2' memory='1048576'
unit='KiB' memAccess='private'/>
+ <cell id='3' cpus='3' memory='1048576'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numatune-auto-prefer.xml
b/tests/qemuxml2argvdata/qemuxml2argv-numatune-auto-prefer.xml
index 63f0d1f..8f80962 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-numatune-auto-prefer.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-numatune-auto-prefer.xml
@@ -13,7 +13,7 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='65536'/>
+ <cell id='0' cpus='0' memory='65536'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode-no-memory.xml
b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode-no-memory.xml
index 4b2efa2..886a07a 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode-no-memory.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode-no-memory.xml
@@ -13,8 +13,8 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='32768'/>
- <cell id='1' cpus='1' memory='32768'/>
+ <cell id='0' cpus='0' memory='32768'
unit='KiB'/>
+ <cell id='1' cpus='1' memory='32768'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
index 440413b..8912017 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
@@ -15,9 +15,9 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='20002'/>
- <cell id='1' cpus='1-27,29' memory='660066'/>
- <cell id='2' cpus='28-31,^29' memory='24002400'/>
+ <cell id='0' cpus='0' memory='20002'
unit='KiB'/>
+ <cell id='1' cpus='1-27,29' memory='660066'
unit='KiB'/>
+ <cell id='2' cpus='28-31,^29' memory='24002400'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnodes-problematic.xml
b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnodes-problematic.xml
index bb4e4af..e1d115c 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnodes-problematic.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnodes-problematic.xml
@@ -14,8 +14,8 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='32768'/>
- <cell id='1' cpus='1' memory='32768'/>
+ <cell id='0' cpus='0' memory='32768'
unit='KiB'/>
+ <cell id='1' cpus='1' memory='32768'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa1.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa1.xml
index 227bf1c..58f40b9 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa1.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa1.xml
@@ -11,8 +11,8 @@
<cpu>
<topology sockets='2' cores='4' threads='2'/>
<numa>
- <cell id='0' cpus='0-7' memory='109550'/>
- <cell id='1' cpus='8-15' memory='109550'/>
+ <cell id='0' cpus='0-7' memory='109550'
unit='KiB'/>
+ <cell id='1' cpus='8-15' memory='109550'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa2.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa2.xml
index 227bf1c..58f40b9 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa2.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-numa2.xml
@@ -11,8 +11,8 @@
<cpu>
<topology sockets='2' cores='4' threads='2'/>
<numa>
- <cell id='0' cpus='0-7' memory='109550'/>
- <cell id='1' cpus='8-15' memory='109550'/>
+ <cell id='0' cpus='0-7' memory='109550'
unit='KiB'/>
+ <cell id='1' cpus='8-15' memory='109550'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-auto-prefer.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-auto-prefer.xml
index 19761b4..1000e9f 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-auto-prefer.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-auto-prefer.xml
@@ -13,7 +13,7 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='65536'/>
+ <cell id='0' cpus='0' memory='65536'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
index 82b5f61..ffc57cf 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
@@ -15,9 +15,9 @@
</os>
<cpu>
<numa>
- <cell id='0' cpus='0' memory='20002'/>
- <cell id='1' cpus='1-27,29' memory='660066'/>
- <cell id='2' cpus='28-31,^29' memory='24002400'/>
+ <cell id='0' cpus='0' memory='20002'
unit='KiB'/>
+ <cell id='1' cpus='1-27,29' memory='660066'
unit='KiB'/>
+ <cell id='2' cpus='28-31,^29' memory='24002400'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
--
1.9.3
--
Prerna Saxena
Linux Technology Centre,
IBM Systems and Technology Lab,
Bangalore, India