[libvirt] [PATCH 2/2] qemuBuildMemoryBackendStr: Honour passed @pagesize

Michal Privoznik mprivozn at redhat.com
Thu Jun 25 16:13:03 UTC 2015


So far the argument has not much meaning and was practically ignored.
This is not good since when doing memory hotplug, the size of desired
hugepage backing is passed in that argument. Taking closer look at the
tests I'm fixing reveals the bug. For instance, while the following is
in the test:

    <memory model='dimm'>
      <source>
        <nodemask>1-3</nodemask>
        <pagesize unit='KiB'>4096</pagesize>
      </source>
      <target>
        <size unit='KiB'>524287</size>
        <node>0</node>
      </target>
      <address type='dimm' slot='0' base='0x100000000'/>
    </memory>

the generated commandline corresponding to this XML was:

    -object memory-backend-ram,id=memdimm0,size=536870912,\
    host-nodes=1-3,policy=bind

Have you noticed? Yes, memory-backend-ram! Nothing can be further away
from the right answer. The hugepage backing is requested in the XML
and we happily ignore it. This is just not right. It's
memory-backend-file which should have been used:

    -object memory-backend-file,id=memdimm0,prealloc=yes,\
    mem-path=/dev/hugepages4M/libvirt/qemu,size=536870912,\
    host-nodes=1-3,policy=bind

The problem is, that @pagesize passed to qemuBuildMemoryBackendStr
(where this part of commandline is built) was ignored. The hugepage to
back memory was searched only and only by NUMA nodes pinning. This
works only for regular guest NUMA nodes.

Then, I'm changing the hugepages size in the test XMLs too. This is
simply because in the test suite we create dummy mount points just for
2M and 1G hugepages. And in the test 4M was requested. I'm sticking to
2M, but 1G should just work too.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/qemu/qemu_command.c                            | 28 ++++++++++++----------
 .../qemuxml2argv-hugepages-numa.args               |  5 +++-
 .../qemuxml2argv-hugepages-numa.xml                | 11 +++++++++
 .../qemuxml2argv-memory-hotplug-dimm-addr.args     |  4 ++--
 .../qemuxml2argv-memory-hotplug-dimm-addr.xml      |  2 +-
 .../qemuxml2argv-memory-hotplug-dimm.args          |  4 ++--
 .../qemuxml2argv-memory-hotplug-dimm.xml           |  2 +-
 tests/qemuxml2argvtest.c                           |  8 ++++---
 8 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index cb31fac..e0214d8 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4727,7 +4727,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
         virDomainNumatuneGetMode(def->numa, -1, &mode) < 0)
         mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
 
-    if (pagesize == 0 || pagesize != system_page_size) {
+    if (pagesize == 0) {
         /* Find the huge page size we want to use */
         for (i = 0; i < def->mem.nhugepages; i++) {
             bool thisHugepage = false;
@@ -4760,15 +4760,19 @@ qemuBuildMemoryBackendStr(unsigned long long size,
             hugepage = master_hugepage;
         }
 
-        if (hugepage && hugepage->size == system_page_size) {
-            /* However, if user specified to use "huge" page
-             * of regular system page size, it's as if they
-             * hasn't specified any huge pages at all. */
-            hugepage = NULL;
-        }
+        if (hugepage)
+            pagesize = hugepage->size;
     }
 
-    if (hugepage) {
+    if (pagesize == system_page_size) {
+        /* However, if user specified to use "huge" page
+         * of regular system page size, it's as if they
+         * hasn't specified any huge pages at all. */
+        pagesize = 0;
+        hugepage = NULL;
+    }
+
+    if (pagesize || hugepage) {
         if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                            _("this qemu doesn't support hugepage memory backing"));
@@ -4776,18 +4780,18 @@ qemuBuildMemoryBackendStr(unsigned long long size,
         }
 
         VIR_FREE(mem_path);
-        if (hugepage->size) {
+        if (pagesize) {
             /* Now lets see, if the huge page we want to use is even mounted
              * and ready to use */
             for (i = 0; i < cfg->nhugetlbfs; i++) {
-                if (cfg->hugetlbfs[i].size == hugepage->size)
+                if (cfg->hugetlbfs[i].size == pagesize)
                     break;
             }
 
             if (i == cfg->nhugetlbfs) {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("Unable to find any usable hugetlbfs mount for %llu KiB"),
-                               hugepage->size);
+                               pagesize);
                 goto cleanup;
             }
 
@@ -4854,7 +4858,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
             goto cleanup;
     }
 
-    if (!hugepage) {
+    if (!hugepage && !pagesize) {
         bool nodeSpecified = virDomainNumatuneNodeSpecified(def->numa, guestNode);
 
         if ((userNodeset || nodeSpecified || force) &&
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
index c47e097..b697942 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
@@ -3,11 +3,14 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice \
 -S \
 -M pc-i440fx-2.3 \
 -cpu Haswell \
--m 1024 \
+-m size=1048576k,slots=16,maxmem=1099511627776k \
 -smp 2 \
 -object memory-backend-file,id=ram-node0,prealloc=yes,\
 mem-path=/dev/hugepages2M/libvirt/qemu,size=1073741824 \
 -numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
+-object memory-backend-file,id=memdimm0,prealloc=yes,\
+mem-path=/dev/hugepages1G/libvirt/qemu,size=1073741824,host-nodes=1-3,policy=bind \
+-device pc-dimm,node=0,memdev=memdimm0,id=dimm0 \
 -nodefaults \
 -monitor unix:/tmp/test-monitor,server,nowait \
 -rtc base=utc,driftfix=slew \
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml
index 70a8835..8c1f19c 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml
@@ -1,6 +1,7 @@
 <domain type='qemu'>
   <name>fedora</name>
   <uuid>63840878-0deb-4095-97e6-fc444d9bc9fa</uuid>
+  <maxMemory slots='16' unit='KiB'>1099511627776</maxMemory>
   <memory unit='KiB'>1572863</memory>
   <currentMemory unit='KiB'>1048576</currentMemory>
   <memoryBacking>
@@ -103,5 +104,15 @@
     <memballoon model='virtio'>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
     </memballoon>
+    <memory model='dimm'>
+      <source>
+        <nodemask>1-3</nodemask>
+        <pagesize unit='KiB'>1048576</pagesize>
+      </source>
+      <target>
+        <size unit='KiB'>1048576</size>
+        <node>0</node>
+      </target>
+    </memory>
   </devices>
 </domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
index 7c59454..e996675 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
@@ -1,8 +1,8 @@
 LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
 /usr/bin/qemu -S -M pc -m size=219136k,slots=16,maxmem=1099511627776k -smp 2 \
 -numa node,nodeid=0,cpus=0-1,mem=214 \
--object memory-backend-ram,id=memdimm0,size=536870912,host-nodes=1-3,\
-policy=bind \
+-object memory-backend-file,id=memdimm0,prealloc=yes,\
+mem-path=/dev/hugepages2M/libvirt/qemu,size=536870912,host-nodes=1-3,policy=bind \
 -device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \
 -nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \
 -no-acpi -boot c -usb -hda /dev/HostVG/QEMUGuest1 \
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml
index 2e302c4..49f2f10 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml
@@ -33,7 +33,7 @@
     <memory model='dimm'>
       <source>
         <nodemask>1-3</nodemask>
-        <pagesize unit='KiB'>4096</pagesize>
+        <pagesize unit='KiB'>2048</pagesize>
       </source>
       <target>
         <size unit='KiB'>524287</size>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
index 7fbde33..17325d7 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
@@ -3,8 +3,8 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
 -numa node,nodeid=0,cpus=0-1,mem=214 \
 -object memory-backend-ram,id=memdimm0,size=536870912 \
 -device pc-dimm,node=0,memdev=memdimm0,id=dimm0 \
--object memory-backend-ram,id=memdimm1,size=536870912,host-nodes=1-3,\
-policy=bind \
+-object memory-backend-file,id=memdimm1,prealloc=yes,\
+mem-path=/dev/hugepages2M/libvirt/qemu,size=536870912,host-nodes=1-3,policy=bind \
 -device pc-dimm,node=0,memdev=memdimm1,id=dimm1 \
 -nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait \
 -no-acpi -boot c -usb -hda /dev/HostVG/QEMUGuest1 \
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.xml b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.xml
index fa6013a..3f468ec 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.xml
@@ -43,7 +43,7 @@
     <memory model='dimm'>
       <source>
         <nodemask>1-3</nodemask>
-        <pagesize unit='KiB'>4096</pagesize>
+        <pagesize unit='KiB'>2048</pagesize>
       </source>
       <target>
         <size unit='KiB'>524287</size>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index ce7c613..d3435d4 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -690,7 +690,9 @@ mymain(void)
             QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC,
             QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
             QEMU_CAPS_HDA_DUPLEX, QEMU_CAPS_USB_REDIR,
-            QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE);
+            QEMU_CAPS_DEVICE_PC_DIMM,
+            QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE,
+            QEMU_CAPS_OBJECT_MEMORY_FILE);
     DO_TEST_LINUX("hugepages-pages", QEMU_CAPS_MEM_PATH,
                   QEMU_CAPS_OBJECT_MEMORY_RAM,
                   QEMU_CAPS_OBJECT_MEMORY_FILE);
@@ -1605,9 +1607,9 @@ mymain(void)
     DO_TEST_FAILURE("memory-hotplug", NONE);
     DO_TEST("memory-hotplug", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA);
     DO_TEST("memory-hotplug-dimm", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA,
-            QEMU_CAPS_DEVICE, QEMU_CAPS_OBJECT_MEMORY_RAM);
+            QEMU_CAPS_DEVICE, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE);
     DO_TEST("memory-hotplug-dimm-addr", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA,
-            QEMU_CAPS_DEVICE, QEMU_CAPS_OBJECT_MEMORY_RAM);
+            QEMU_CAPS_DEVICE, QEMU_CAPS_OBJECT_MEMORY_FILE);
 
     DO_TEST("machine-aeskeywrap-on-caps",
             QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_AES_KEY_WRAP,
-- 
2.3.6




More information about the libvir-list mailing list