From 70d75ffc79c585ad6170c913da2a10ae4b51ce6c Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 25 Jun 2015 17:27:29 +0200 Subject: [PATCH] qemuBuildMemoryBackendStr: Honour passed @pagesize 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: 1-3 4096 524287 0
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 --- src/qemu/qemu_command.c | 27 ++++++++++--------- .../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 | 5 ++-- 8 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f1b7411fc0..3c2c718d9a 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; @@ -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 (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")); 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) && diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args index c47e09757f..b69794235f 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 70a8835d3c..8c1f19ce3a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.xml @@ -1,6 +1,7 @@ fedora 63840878-0deb-4095-97e6-fc444d9bc9fa + 1099511627776 1572863 1048576 @@ -103,5 +104,15 @@
+ + + 1-3 + 1048576 + + + 1048576 + 0 + + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args index 7c594540a8..e99667542d 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 2e302c4579..49f2f107f1 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml @@ -33,7 +33,7 @@ 1-3 - 4096 + 2048 524287 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args index 7fbde3387b..17325d79bf 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 fa6013abc2..3f468ecb7c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.xml @@ -43,7 +43,7 @@ 1-3 - 4096 + 2048 524287 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index ce7c613581..a212d30e32 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -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,