mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
conf: Introduce virDomainDefPostParseMemtune
Previously we were ignoring "nodeset" attribute for hugepage pages if there was no guest NUMA topology configured in the domain XML. Commit <fa6bdf6afa878b8d7c5ed71664ee72be8967cdc5> partially fixed that issue but it introduced a somehow valid regression. In case that there is no guest NUMA topology configured and the "nodeset" attribute is set to "0" it was accepted and was working properly even though it was not completely valid XML. This patch introduces a workaround that it will ignore the nodeset="0" only in case that there is no guest NUMA topology in order not to hit the validation error. After this commit the following XML configuration is valid: <memoryBacking> <hugepages> <page size='2048' unit='KiB' nodeset='0'/> </hugepages> </memoryBacking> but this configuration remains invalid: <memoryBacking> <hugepages> <page size='2048' unit='KiB' nodeset='0'/> <page size='1048576' unit='KiB'/> </hugepages> </memoryBacking> The issue with the second configuration is that it was originally working, however changing the order of the <page> elements resolved into using different page size for the guest. The code is written in a way that it expect only one page configured and always uses only the first page in case that there is no guest NUMA topology configured. See qemuBuildMemPathStr() function for details. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1591235 Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
8232703839
commit
0a476f1521
@ -4088,6 +4088,31 @@ virDomainDefPostParseMemory(virDomainDefPtr def,
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
virDomainDefPostParseMemtune(virDomainDefPtr def)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (virDomainNumaGetNodeCount(def->numa) == 0) {
|
||||
/* If guest NUMA is not configured and any hugepage page has nodemask
|
||||
* set to "0" free and clear that nodemas, otherwise we would rise
|
||||
* an error that there is no guest NUMA node configured. */
|
||||
for (i = 0; i < def->mem.nhugepages; i++) {
|
||||
ssize_t nextBit;
|
||||
|
||||
if (!def->mem.hugepages[i].nodemask)
|
||||
continue;
|
||||
|
||||
nextBit = virBitmapNextSetBit(def->mem.hugepages[i].nodemask, 0);
|
||||
if (nextBit < 0) {
|
||||
virBitmapFree(def->mem.hugepages[i].nodemask);
|
||||
def->mem.hugepages[i].nodemask = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virDomainDefAddConsoleCompat(virDomainDefPtr def)
|
||||
{
|
||||
@ -5145,6 +5170,8 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
|
||||
if (virDomainDefPostParseMemory(def, data->parseFlags) < 0)
|
||||
return -1;
|
||||
|
||||
virDomainDefPostParseMemtune(def);
|
||||
|
||||
if (virDomainDefRejectDuplicateControllers(def) < 0)
|
||||
return -1;
|
||||
|
||||
|
25
tests/qemuxml2argvdata/hugepages-nodeset.args
Normal file
25
tests/qemuxml2argvdata/hugepages-nodeset.args
Normal file
@ -0,0 +1,25 @@
|
||||
LC_ALL=C \
|
||||
PATH=/bin \
|
||||
HOME=/home/test \
|
||||
USER=test \
|
||||
LOGNAME=test \
|
||||
QEMU_AUDIO_DRV=none \
|
||||
/usr/bin/qemu-system-i686 \
|
||||
-name SomeDummyHugepagesGuest \
|
||||
-S \
|
||||
-machine pc,accel=tcg,usb=off,dump-guest-core=off \
|
||||
-m 1024 \
|
||||
-mem-prealloc \
|
||||
-mem-path /dev/hugepages2M/libvirt/qemu/-1-SomeDummyHugepagesGu \
|
||||
-smp 2,sockets=2,cores=1,threads=1 \
|
||||
-uuid ef1bdff4-27f3-4e85-a807-5fb4d58463cc \
|
||||
-display none \
|
||||
-no-user-config \
|
||||
-nodefaults \
|
||||
-chardev socket,id=charmonitor,\
|
||||
path=/tmp/lib/domain--1-SomeDummyHugepagesGu/monitor.sock,server,nowait \
|
||||
-mon chardev=charmonitor,id=monitor,mode=control \
|
||||
-rtc base=utc \
|
||||
-no-shutdown \
|
||||
-no-acpi \
|
||||
-usb
|
@ -959,7 +959,7 @@ mymain(void)
|
||||
DO_TEST("hugepages-default-2M", NONE);
|
||||
DO_TEST("hugepages-default-system-size", NONE);
|
||||
DO_TEST_PARSE_ERROR("hugepages-default-1G-nodeset-2M", NONE);
|
||||
DO_TEST_PARSE_ERROR("hugepages-nodeset", NONE);
|
||||
DO_TEST("hugepages-nodeset", NONE);
|
||||
DO_TEST_PARSE_ERROR("hugepages-nodeset-nonexist",
|
||||
QEMU_CAPS_DEVICE_PC_DIMM,
|
||||
QEMU_CAPS_OBJECT_MEMORY_FILE,
|
||||
|
30
tests/qemuxml2xmloutdata/hugepages-nodeset.xml
Normal file
30
tests/qemuxml2xmloutdata/hugepages-nodeset.xml
Normal file
@ -0,0 +1,30 @@
|
||||
<domain type='qemu'>
|
||||
<name>SomeDummyHugepagesGuest</name>
|
||||
<uuid>ef1bdff4-27f3-4e85-a807-5fb4d58463cc</uuid>
|
||||
<memory unit='KiB'>1048576</memory>
|
||||
<currentMemory unit='KiB'>1048576</currentMemory>
|
||||
<memoryBacking>
|
||||
<hugepages>
|
||||
<page size='2048' unit='KiB'/>
|
||||
</hugepages>
|
||||
</memoryBacking>
|
||||
<vcpu placement='static'>2</vcpu>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu-system-i686</emulator>
|
||||
<controller type='usb' index='0'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
||||
</controller>
|
||||
<controller type='pci' index='0' model='pci-root'/>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<memballoon model='none'/>
|
||||
</devices>
|
||||
</domain>
|
@ -331,6 +331,7 @@ mymain(void)
|
||||
DO_TEST("hugepages-default", NONE);
|
||||
DO_TEST("hugepages-default-2M", NONE);
|
||||
DO_TEST("hugepages-default-system-size", NONE);
|
||||
DO_TEST("hugepages-nodeset", NONE);
|
||||
DO_TEST("hugepages-numa-default-2M", NONE);
|
||||
DO_TEST("hugepages-numa-default-dimm", NONE);
|
||||
DO_TEST("hugepages-numa-nodeset", NONE);
|
||||
|
Loading…
x
Reference in New Issue
Block a user