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