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