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