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