|
|
51d9a2 |
From 4d7421af3a29312a38ea08ed9ac44c866f5f1371 Mon Sep 17 00:00:00 2001
|
|
|
51d9a2 |
Message-Id: <4d7421af3a29312a38ea08ed9ac44c866f5f1371@dist-git>
|
|
|
51d9a2 |
From: Pavel Hrdina <phrdina@redhat.com>
|
|
|
51d9a2 |
Date: Mon, 13 Aug 2018 18:16:22 +0200
|
|
|
51d9a2 |
Subject: [PATCH] conf: Introduce virDomainDefPostParseMemtune
|
|
|
51d9a2 |
MIME-Version: 1.0
|
|
|
51d9a2 |
Content-Type: text/plain; charset=UTF-8
|
|
|
51d9a2 |
Content-Transfer-Encoding: 8bit
|
|
|
51d9a2 |
|
|
|
51d9a2 |
Previously we were ignoring "nodeset" attribute for hugepage pages
|
|
|
51d9a2 |
if there was no guest NUMA topology configured in the domain XML.
|
|
|
51d9a2 |
Commit <fa6bdf6afa878b8d7c5ed71664ee72be8967cdc5> partially fixed
|
|
|
51d9a2 |
that issue but it introduced a somehow valid regression.
|
|
|
51d9a2 |
|
|
|
51d9a2 |
In case that there is no guest NUMA topology configured and the
|
|
|
51d9a2 |
"nodeset" attribute is set to "0" it was accepted and was working
|
|
|
51d9a2 |
properly even though it was not completely valid XML.
|
|
|
51d9a2 |
|
|
|
51d9a2 |
This patch introduces a workaround that it will ignore the nodeset="0"
|
|
|
51d9a2 |
only in case that there is no guest NUMA topology in order not to
|
|
|
51d9a2 |
hit the validation error.
|
|
|
51d9a2 |
|
|
|
51d9a2 |
After this commit the following XML configuration is valid:
|
|
|
51d9a2 |
|
|
|
51d9a2 |
<memoryBacking>
|
|
|
51d9a2 |
<hugepages>
|
|
|
51d9a2 |
<page size='2048' unit='KiB' nodeset='0'/>
|
|
|
51d9a2 |
</hugepages>
|
|
|
51d9a2 |
</memoryBacking>
|
|
|
51d9a2 |
|
|
|
51d9a2 |
but this configuration remains invalid:
|
|
|
51d9a2 |
|
|
|
51d9a2 |
<memoryBacking>
|
|
|
51d9a2 |
<hugepages>
|
|
|
51d9a2 |
<page size='2048' unit='KiB' nodeset='0'/>
|
|
|
51d9a2 |
<page size='1048576' unit='KiB'/>
|
|
|
51d9a2 |
</hugepages>
|
|
|
51d9a2 |
</memoryBacking>
|
|
|
51d9a2 |
|
|
|
51d9a2 |
The issue with the second configuration is that it was originally
|
|
|
51d9a2 |
working, however changing the order of the <page> elements resolved
|
|
|
51d9a2 |
into using different page size for the guest. The code is written
|
|
|
51d9a2 |
in a way that it expect only one page configured and always uses only
|
|
|
51d9a2 |
the first page in case that there is no guest NUMA topology configured.
|
|
|
51d9a2 |
See qemuBuildMemPathStr() function for details.
|
|
|
51d9a2 |
|
|
|
51d9a2 |
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1591235
|
|
|
51d9a2 |
|
|
|
51d9a2 |
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
|
|
51d9a2 |
(cherry picked from commit 0a476f152150f62306f9f8d124aa44e4adb9158c)
|
|
|
51d9a2 |
|
|
|
51d9a2 |
Conflicts:
|
|
|
51d9a2 |
tests/qemuxml2argvdata/hugepages-nodeset.args
|
|
|
51d9a2 |
- missing upstream commit <caccbba64a>
|
|
|
51d9a2 |
|
|
|
51d9a2 |
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
|
|
51d9a2 |
Reviewed-by: Ján Tomko <jtomko@redhat.com>
|
|
|
51d9a2 |
---
|
|
|
51d9a2 |
src/conf/domain_conf.c | 27 +++++++++++++++++
|
|
|
51d9a2 |
tests/qemuxml2argvdata/hugepages-nodeset.args | 26 ++++++++++++++++
|
|
|
51d9a2 |
tests/qemuxml2argvtest.c | 2 +-
|
|
|
51d9a2 |
.../qemuxml2xmloutdata/hugepages-nodeset.xml | 30 +++++++++++++++++++
|
|
|
51d9a2 |
tests/qemuxml2xmltest.c | 1 +
|
|
|
51d9a2 |
5 files changed, 85 insertions(+), 1 deletion(-)
|
|
|
51d9a2 |
create mode 100644 tests/qemuxml2argvdata/hugepages-nodeset.args
|
|
|
51d9a2 |
create mode 100644 tests/qemuxml2xmloutdata/hugepages-nodeset.xml
|
|
|
51d9a2 |
|
|
|
51d9a2 |
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
|
|
51d9a2 |
index 98e833c5bb..8a43e607e9 100644
|
|
|
51d9a2 |
--- a/src/conf/domain_conf.c
|
|
|
51d9a2 |
+++ b/src/conf/domain_conf.c
|
|
|
51d9a2 |
@@ -4088,6 +4088,31 @@ virDomainDefPostParseMemory(virDomainDefPtr def,
|
|
|
51d9a2 |
}
|
|
|
51d9a2 |
|
|
|
51d9a2 |
|
|
|
51d9a2 |
+static void
|
|
|
51d9a2 |
+virDomainDefPostParseMemtune(virDomainDefPtr def)
|
|
|
51d9a2 |
+{
|
|
|
51d9a2 |
+ size_t i;
|
|
|
51d9a2 |
+
|
|
|
51d9a2 |
+ if (virDomainNumaGetNodeCount(def->numa) == 0) {
|
|
|
51d9a2 |
+ /* If guest NUMA is not configured and any hugepage page has nodemask
|
|
|
51d9a2 |
+ * set to "0" free and clear that nodemas, otherwise we would rise
|
|
|
51d9a2 |
+ * an error that there is no guest NUMA node configured. */
|
|
|
51d9a2 |
+ for (i = 0; i < def->mem.nhugepages; i++) {
|
|
|
51d9a2 |
+ ssize_t nextBit;
|
|
|
51d9a2 |
+
|
|
|
51d9a2 |
+ if (!def->mem.hugepages[i].nodemask)
|
|
|
51d9a2 |
+ continue;
|
|
|
51d9a2 |
+
|
|
|
51d9a2 |
+ nextBit = virBitmapNextSetBit(def->mem.hugepages[i].nodemask, 0);
|
|
|
51d9a2 |
+ if (nextBit < 0) {
|
|
|
51d9a2 |
+ virBitmapFree(def->mem.hugepages[i].nodemask);
|
|
|
51d9a2 |
+ def->mem.hugepages[i].nodemask = NULL;
|
|
|
51d9a2 |
+ }
|
|
|
51d9a2 |
+ }
|
|
|
51d9a2 |
+ }
|
|
|
51d9a2 |
+}
|
|
|
51d9a2 |
+
|
|
|
51d9a2 |
+
|
|
|
51d9a2 |
static int
|
|
|
51d9a2 |
virDomainDefAddConsoleCompat(virDomainDefPtr def)
|
|
|
51d9a2 |
{
|
|
|
51d9a2 |
@@ -5155,6 +5180,8 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
|
|
|
51d9a2 |
if (virDomainDefPostParseMemory(def, data->parseFlags) < 0)
|
|
|
51d9a2 |
return -1;
|
|
|
51d9a2 |
|
|
|
51d9a2 |
+ virDomainDefPostParseMemtune(def);
|
|
|
51d9a2 |
+
|
|
|
51d9a2 |
if (virDomainDefRejectDuplicateControllers(def) < 0)
|
|
|
51d9a2 |
return -1;
|
|
|
51d9a2 |
|
|
|
51d9a2 |
diff --git a/tests/qemuxml2argvdata/hugepages-nodeset.args b/tests/qemuxml2argvdata/hugepages-nodeset.args
|
|
|
51d9a2 |
new file mode 100644
|
|
|
51d9a2 |
index 0000000000..d094be1252
|
|
|
51d9a2 |
--- /dev/null
|
|
|
51d9a2 |
+++ b/tests/qemuxml2argvdata/hugepages-nodeset.args
|
|
|
51d9a2 |
@@ -0,0 +1,26 @@
|
|
|
51d9a2 |
+LC_ALL=C \
|
|
|
51d9a2 |
+PATH=/bin \
|
|
|
51d9a2 |
+HOME=/home/test \
|
|
|
51d9a2 |
+USER=test \
|
|
|
51d9a2 |
+LOGNAME=test \
|
|
|
51d9a2 |
+QEMU_AUDIO_DRV=none \
|
|
|
51d9a2 |
+/usr/bin/qemu-system-i686 \
|
|
|
51d9a2 |
+-name SomeDummyHugepagesGuest \
|
|
|
51d9a2 |
+-S \
|
|
|
51d9a2 |
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
|
|
|
51d9a2 |
+-m 1024 \
|
|
|
51d9a2 |
+-mem-prealloc \
|
|
|
51d9a2 |
+-mem-path /dev/hugepages2M/libvirt/qemu/-1-SomeDummyHugepagesGu \
|
|
|
51d9a2 |
+-smp 2,sockets=2,cores=1,threads=1 \
|
|
|
51d9a2 |
+-uuid ef1bdff4-27f3-4e85-a807-5fb4d58463cc \
|
|
|
51d9a2 |
+-display none \
|
|
|
51d9a2 |
+-no-user-config \
|
|
|
51d9a2 |
+-nodefaults \
|
|
|
51d9a2 |
+-chardev socket,id=charmonitor,\
|
|
|
51d9a2 |
+path=/tmp/lib/domain--1-SomeDummyHugepagesGu/monitor.sock,server,nowait \
|
|
|
51d9a2 |
+-mon chardev=charmonitor,id=monitor,mode=control \
|
|
|
51d9a2 |
+-rtc base=utc \
|
|
|
51d9a2 |
+-no-shutdown \
|
|
|
51d9a2 |
+-no-acpi \
|
|
|
51d9a2 |
+-boot c \
|
|
|
51d9a2 |
+-usb
|
|
|
51d9a2 |
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
|
|
|
51d9a2 |
index f82bca2637..e6c0120670 100644
|
|
|
51d9a2 |
--- a/tests/qemuxml2argvtest.c
|
|
|
51d9a2 |
+++ b/tests/qemuxml2argvtest.c
|
|
|
51d9a2 |
@@ -960,7 +960,7 @@ mymain(void)
|
|
|
51d9a2 |
DO_TEST("hugepages-default-2M", NONE);
|
|
|
51d9a2 |
DO_TEST("hugepages-default-system-size", NONE);
|
|
|
51d9a2 |
DO_TEST_PARSE_ERROR("hugepages-default-1G-nodeset-2M", NONE);
|
|
|
51d9a2 |
- DO_TEST_PARSE_ERROR("hugepages-nodeset", NONE);
|
|
|
51d9a2 |
+ DO_TEST("hugepages-nodeset", NONE);
|
|
|
51d9a2 |
DO_TEST_PARSE_ERROR("hugepages-nodeset-nonexist",
|
|
|
51d9a2 |
QEMU_CAPS_DEVICE_PC_DIMM,
|
|
|
51d9a2 |
QEMU_CAPS_OBJECT_MEMORY_FILE,
|
|
|
51d9a2 |
diff --git a/tests/qemuxml2xmloutdata/hugepages-nodeset.xml b/tests/qemuxml2xmloutdata/hugepages-nodeset.xml
|
|
|
51d9a2 |
new file mode 100644
|
|
|
51d9a2 |
index 0000000000..ac219a7800
|
|
|
51d9a2 |
--- /dev/null
|
|
|
51d9a2 |
+++ b/tests/qemuxml2xmloutdata/hugepages-nodeset.xml
|
|
|
51d9a2 |
@@ -0,0 +1,30 @@
|
|
|
51d9a2 |
+<domain type='qemu'>
|
|
|
51d9a2 |
+ <name>SomeDummyHugepagesGuest</name>
|
|
|
51d9a2 |
+ <uuid>ef1bdff4-27f3-4e85-a807-5fb4d58463cc</uuid>
|
|
|
51d9a2 |
+ <memory unit='KiB'>1048576</memory>
|
|
|
51d9a2 |
+ <currentMemory unit='KiB'>1048576</currentMemory>
|
|
|
51d9a2 |
+ <memoryBacking>
|
|
|
51d9a2 |
+ <hugepages>
|
|
|
51d9a2 |
+ <page size='2048' unit='KiB'/>
|
|
|
51d9a2 |
+ </hugepages>
|
|
|
51d9a2 |
+ </memoryBacking>
|
|
|
51d9a2 |
+ <vcpu placement='static'>2</vcpu>
|
|
|
51d9a2 |
+ <os>
|
|
|
51d9a2 |
+ <type arch='i686' machine='pc'>hvm</type>
|
|
|
51d9a2 |
+ <boot dev='hd'/>
|
|
|
51d9a2 |
+ </os>
|
|
|
51d9a2 |
+ <clock offset='utc'/>
|
|
|
51d9a2 |
+ <on_poweroff>destroy</on_poweroff>
|
|
|
51d9a2 |
+ <on_reboot>restart</on_reboot>
|
|
|
51d9a2 |
+ <on_crash>destroy</on_crash>
|
|
|
51d9a2 |
+ <devices>
|
|
|
51d9a2 |
+ <emulator>/usr/bin/qemu-system-i686</emulator>
|
|
|
51d9a2 |
+ <controller type='usb' index='0'>
|
|
|
51d9a2 |
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
|
|
51d9a2 |
+ </controller>
|
|
|
51d9a2 |
+ <controller type='pci' index='0' model='pci-root'/>
|
|
|
51d9a2 |
+ <input type='mouse' bus='ps2'/>
|
|
|
51d9a2 |
+ <input type='keyboard' bus='ps2'/>
|
|
|
51d9a2 |
+ <memballoon model='none'/>
|
|
|
51d9a2 |
+ </devices>
|
|
|
51d9a2 |
+</domain>
|
|
|
51d9a2 |
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
|
|
|
51d9a2 |
index aa543e9e51..b76410b2c1 100644
|
|
|
51d9a2 |
--- a/tests/qemuxml2xmltest.c
|
|
|
51d9a2 |
+++ b/tests/qemuxml2xmltest.c
|
|
|
51d9a2 |
@@ -336,6 +336,7 @@ mymain(void)
|
|
|
51d9a2 |
DO_TEST("hugepages-default", NONE);
|
|
|
51d9a2 |
DO_TEST("hugepages-default-2M", NONE);
|
|
|
51d9a2 |
DO_TEST("hugepages-default-system-size", NONE);
|
|
|
51d9a2 |
+ DO_TEST("hugepages-nodeset", NONE);
|
|
|
51d9a2 |
DO_TEST("hugepages-numa-default-2M", NONE);
|
|
|
51d9a2 |
DO_TEST("hugepages-numa-default-dimm", NONE);
|
|
|
51d9a2 |
DO_TEST("hugepages-numa-nodeset", NONE);
|
|
|
51d9a2 |
--
|
|
|
51d9a2 |
2.18.0
|
|
|
51d9a2 |
|