]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuBuildMemoryBackendStr: Honour passed @pagesize
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 25 Jun 2015 15:27:29 +0000 (17:27 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 26 Jun 2015 07:23:06 +0000 (09:23 +0200)
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@redhat.com>
src/qemu/qemu_command.c
tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml
tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args
tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml
tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.xml
tests/qemuxml2argvtest.c

index f1b7411fc0e509a13ba429e25e98f46f2d952a52..3c2c718d9a70b41d0027c1e64fc82b1a81fbbee2 100644 (file)
@@ -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;
@@ -4762,34 +4762,35 @@ qemuBuildMemoryBackendStr(unsigned long long size,
 
         if (hugepage)
             pagesize = hugepage->size;
+    }
 
-        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 (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 (hugepage) {
+    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"));
             goto cleanup;
         }
 
-        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;
             }
 
@@ -4856,7 +4857,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
             goto cleanup;
     }
 
-    if (!hugepage) {
+    if (!hugepage && !pagesize) {
         bool nodeSpecified = virDomainNumatuneNodeSpecified(def->numa, guestNode);
 
         if ((userNodeset || nodeSpecified || force) &&
index c47e09757fd0d4bf0066f6840db07a5b6c16f3a6..b69794235f1fff6aff9d54a375db49ce3e106a51 100644 (file)
@@ -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 \
index 70a8835d3c28f2eb576a40b8bf18dce818c23f76..8c1f19ce3ac99421ee3eca3a56d885dc7a9f7a31 100644 (file)
@@ -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>
     <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>
index 7c594540a890daa70ea7cd42820eb9a3803e82a2..e99667542db9a01e97083b19df9b7ee4a991f5b7 100644 (file)
@@ -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 \
index 2e302c45791a12768900904010485c702d147077..49f2f107f18d3186894efed2dc3590302c628697 100644 (file)
@@ -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>
index 7fbde3387b795d9c6466f8c7d91a9fcf50feea87..17325d79bfd9c01454638462fc9d37bdcd345cfa 100644 (file)
@@ -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 \
index fa6013abc27d2a1c727a1808aaf41a72fd3817f4..3f468ecb7cef2b7dbed662726094fc1d9f3ed701 100644 (file)
@@ -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>
index ce7c6135812cde2ed80abe4ec147f6d75c185230..a212d30e3295ad5a6a462d85241887937a81db66 100644 (file)
@@ -690,6 +690,7 @@ 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_DEVICE_PC_DIMM,
             QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE);
     DO_TEST_LINUX("hugepages-pages", QEMU_CAPS_MEM_PATH,
                   QEMU_CAPS_OBJECT_MEMORY_RAM,
@@ -1605,9 +1606,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,