[libvirt] [PATCH 2/3] docs, conf, schema: add support for shared memory mapping

Martin Kletzander mkletzan at redhat.com
Mon Sep 8 11:40:39 UTC 2014


Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 docs/formatdomain.html.in                          |  7 +++-
 docs/schemas/domaincommon.rng                      |  5 +++
 src/conf/cpu_conf.c                                | 25 +++++++++++-
 src/conf/cpu_conf.h                                |  7 ++--
 .../qemuxml2argv-cpu-numa-memshared.xml            | 28 ++++++++++++++
 .../qemuxml2argv-hugepages-shared.xml              | 45 ++++++++++++++++++++++
 tests/qemuxml2xmltest.c                            |  2 +
 7 files changed, 113 insertions(+), 6 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 94236dd..b284d6e 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1105,7 +1105,7 @@
     ...
     <numa>
       <cell id='0' cpus='0-3' memory='512000'/>
-      <cell id='1' cpus='4-7' memory='512000'/>
+      <cell id='1' cpus='4-7' memory='512000' memShared='on'/>
     </numa>
     ...
   </cpu>
@@ -1122,6 +1122,11 @@
       assigned <code>id</code>s 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.
+
+      <span class='since'>Since 1.2.9</span> the optional attribute
+      <code>memShared</code> can control whether the memory is to be
+      mapped as shared or not (values "on"/"off").  This is valid only
+      for hugepages-backed memory.
     </p>

     <p>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 25ff386..89eb953 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3980,6 +3980,11 @@
       <attribute name="memory">
         <ref name="memoryKB"/>
       </attribute>
+      <optional>
+        <attribute name="memShared">
+          <ref name="virSwitch"/>
+        </attribute>
+      </optional>
     </element>
   </define>

diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index 5003cf1..ab31f8d 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -435,7 +435,7 @@ virCPUDefParseXML(xmlNodePtr node,
         def->ncells = n;

         for (i = 0; i < n; i++) {
-            char *cpus, *memory;
+            char *cpus, *memory, *memSharedStr;
             int ret, ncpus = 0;
             unsigned int cur_cell;
             char *tmp = NULL;
@@ -491,7 +491,7 @@ virCPUDefParseXML(xmlNodePtr node,
                 goto error;
             }

-            ret  = virStrToLong_ui(memory, NULL, 10, &def->cells[cur_cell].mem);
+            ret = virStrToLong_ui(memory, NULL, 10, &def->cells[cur_cell].mem);
             if (ret == -1) {
                 virReportError(VIR_ERR_XML_ERROR, "%s",
                                _("Invalid 'memory' attribute in NUMA cell"));
@@ -499,6 +499,22 @@ virCPUDefParseXML(xmlNodePtr node,
                 goto error;
             }
             VIR_FREE(memory);
+
+            memSharedStr = virXMLPropString(nodes[i], "memShared");
+            if (memSharedStr) {
+                def->cells[cur_cell].memShared =
+                    virTristateSwitchTypeFromString(memSharedStr);
+
+                if (def->cells[cur_cell].memShared <= 0) {
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                   _("Invalid 'memShared' attribute "
+                                     "value '%s'"),
+                                   memSharedStr);
+                    VIR_FREE(memSharedStr);
+                    goto cleanup;
+                }
+                VIR_FREE(memSharedStr);
+            }
         }
     }

@@ -674,10 +690,15 @@ virCPUDefFormatBuf(virBufferPtr buf,
         virBufferAddLit(buf, "<numa>\n");
         virBufferAdjustIndent(buf, 2);
         for (i = 0; i < def->ncells; i++) {
+            virTristateSwitch memShared = def->cells[i].memShared;
+
             virBufferAddLit(buf, "<cell");
             virBufferAsprintf(buf, " id='%zu'", i);
             virBufferAsprintf(buf, " cpus='%s'", def->cells[i].cpustr);
             virBufferAsprintf(buf, " memory='%d'", def->cells[i].mem);
+            if (memShared)
+                virBufferAsprintf(buf, " memShared='%s'",
+                                  virTristateSwitchTypeToString(memShared));
             virBufferAddLit(buf, "/>\n");
         }
         virBufferAdjustIndent(buf, -2);
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
index 2d538db..3083f45 100644
--- a/src/conf/cpu_conf.h
+++ b/src/conf/cpu_conf.h
@@ -93,9 +93,10 @@ struct _virCPUFeatureDef {
 typedef struct _virCellDef virCellDef;
 typedef virCellDef *virCellDefPtr;
 struct _virCellDef {
-   virBitmapPtr cpumask;	/* CPUs that are part of this node */
-   char *cpustr;	/* CPUs stored in string form for dumpxml */
-   unsigned int mem;	/* Node memory in kB */
+    virBitmapPtr cpumask;	/* CPUs that are part of this node */
+    char *cpustr;	/* CPUs stored in string form for dumpxml */
+    unsigned int mem;	/* Node memory in kB */
+    virTristateSwitch memShared;
 };

 typedef struct _virCPUDef virCPUDef;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml
new file mode 100644
index 0000000..63d94fa
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.xml
@@ -0,0 +1,28 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>16</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='network'/>
+  </os>
+  <cpu>
+    <topology sockets='2' cores='4' threads='2'/>
+    <numa>
+      <cell id='0' cpus='0-7' memory='109550' memShared='on'/>
+      <cell id='1' cpus='8-15' memory='109550' memShared='off'/>
+    </numa>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu</emulator>
+    <controller type='usb' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml
new file mode 100644
index 0000000..f5226f7
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-shared.xml
@@ -0,0 +1,45 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>4194304</memory>
+  <currentMemory unit='KiB'>4194304</currentMemory>
+  <memoryBacking>
+    <hugepages>
+      <page size='2048' unit='KiB' nodeset='1'/>
+      <page size='1048576' unit='KiB' nodeset='0,2-3'/>
+    </hugepages>
+  </memoryBacking>
+  <vcpu placement='static'>4</vcpu>
+  <numatune>
+    <memory mode='strict' nodeset='0-3'/>
+    <memnode cellid='3' mode='strict' nodeset='3'/>
+  </numatune>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu>
+    <numa>
+      <cell id='0' cpus='0' memory='1048576'/>
+      <cell id='1' cpus='1' memory='1048576' memShared='on'/>
+      <cell id='2' cpus='2' memory='1048576' memShared='off'/>
+      <cell id='3' cpus='3' memory='1048576'/>
+    </numa>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='usb' index='0'/>
+    <controller type='ide' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 03c05da..ea0015a 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -205,6 +205,7 @@ mymain(void)
     DO_TEST("hugepages-pages");
     DO_TEST("hugepages-pages2");
     DO_TEST("hugepages-pages3");
+    DO_TEST("hugepages-shared");
     DO_TEST("nosharepages");
     DO_TEST("disk-aio");
     DO_TEST("disk-cdrom");
@@ -391,6 +392,7 @@ mymain(void)
     DO_TEST_DIFFERENT("cpu-numa1");
     DO_TEST_DIFFERENT("cpu-numa2");
     DO_TEST("cpu-numa-disjoint");
+    DO_TEST("cpu-numa-memshared");

     DO_TEST_DIFFERENT("numatune-auto-prefer");
     DO_TEST_DIFFERENT("numatune-memnode");
-- 
2.1.0




More information about the libvir-list mailing list