[libvirt] [PATCH v3 2/2] Numa : Allow specification of 'units' for numa nodes.

Michal Privoznik mprivozn at redhat.com
Mon Nov 10 14:06:13 UTC 2014


On 10.11.2014 12:52, Prerna Saxena wrote:
> 
>  From 1ead736712eec3bd098daf222a872c67b67e94ce Mon Sep 17 00:00:00 2001
> From: Prerna Saxena <prerna at 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 at linux.vnet.ibm.com>
> ---
>   docs/formatdomain.html.in                          |  8 +++-
>   docs/schemas/domaincommon.rng                      |  5 +++
>   src/conf/cpu_conf.c                                | 44 ++++++++++++++--------
>   .../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, 81 insertions(+), 60 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 7196e75..f103a13 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -1153,8 +1153,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>
> @@ -1165,6 +1165,10 @@
>         <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.
> +      The detailed syntax for allocation of memory units follows:
> +      <a href="#elementsMemoryAllocation"><code>unit</code></a>
>         <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 1c74c66..d0323b0 100644
> --- a/src/conf/cpu_conf.c
> +++ b/src/conf/cpu_conf.c
> @@ -177,6 +177,30 @@ virCPUDefCopy(const virCPUDef *cpu)
>       return NULL;
>   }
>   
> +static int
> +virCPUNumaCellMemoryParseXML(xmlNodePtr node,
> +                  xmlXPathContextPtr ctxt,
> +                  unsigned long long* cellMemory)
> +{
> +    int ret = -1;
> +    xmlNodePtr oldnode = ctxt->node;
> +
> +    ctxt->node = node;
> +
> +    if (virDomainParseMemory("./@memory", "./@unit", ctxt,
> +                             cellMemory, true, false) < 0) {
> +        virReportError(VIR_ERR_XML_DETAIL, "%s",
> +                       _("Unable to parse NUMA memory size attribute"));

There's no need for virReportError() here. The helper reported error already.

> +        goto cleanup;
> +    }
> +
> +    ret = 0;
> + cleanup:
> +    ctxt->node = oldnode;
> +    return ret;
> +
> +}
> +

Huh, I don't think it's necessary to have this as a function, but compiler will surely optimize it. So I can live with this as-is.

>   virCPUDefPtr
>   virCPUDefParseXML(xmlNodePtr node,
>                     xmlXPathContextPtr ctxt,
> @@ -440,7 +464,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 +513,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);

What I can't live with is ignoring return value here.

>   
>               memAccessStr = virXMLPropString(nodes[i], "memAccess");
>               if (memAccessStr) {
> @@ -704,6 +715,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));

So ACK with this squashed in:
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index d0323b0..0604eab 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -513,8 +513,9 @@ virCPUDefParseXML(xmlNodePtr node,
                 goto error;
             def->cells_cpus += ncpus;
 
-            virCPUNumaCellMemoryParseXML(nodes[i],
-                                          ctxt, &def->cells[cur_cell].mem);
+            if (virCPUNumaCellMemoryParseXML(nodes[i], ctxt,
+                                             &def->cells[cur_cell].mem) < 0)
+                goto error;
 
             memAccessStr = virXMLPropString(nodes[i], "memAccess");
             if (memAccessStr) {

However, since I need to modify the patch anyway, I'm gonna drop the virCPUNumaCellMemoryParseXML() function and call virDomainParseMemory() directly.

ACK once I fix the issues.

Michal




More information about the libvir-list mailing list