mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
qemu: Allow system pages to <memoryBacking/>
https://bugzilla.redhat.com/show_bug.cgi?id=1173507 It occurred to me that OpenStack uses the following XML when not using regular huge pages: <memoryBacking> <hugepages> <page size='4' unit='KiB'/> </hugepages> </memoryBacking> However, since we are expecting to see huge pages only, we fail to startup the domain with following error: libvirtError: internal error: Unable to find any usable hugetlbfs mount for 4 KiB While regular system pages are not huge pages technically, our code is prepared for that and if it helps OpenStack (or other management applications) we should cope with that. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
5fc1c51743
commit
311b4a677f
@ -6616,6 +6616,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
|
|||||||
char *nodemask = NULL;
|
char *nodemask = NULL;
|
||||||
char *mem_path = NULL;
|
char *mem_path = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
const long system_page_size = sysconf(_SC_PAGESIZE);
|
||||||
|
|
||||||
if (virDomainNumatuneHasPerNodeBinding(def->numatune) &&
|
if (virDomainNumatuneHasPerNodeBinding(def->numatune) &&
|
||||||
!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
|
!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
|
||||||
@ -6626,7 +6627,8 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (def->mem.nhugepages && def->mem.hugepages[0].size &&
|
if (def->mem.nhugepages &&
|
||||||
|
def->mem.hugepages[0].size != system_page_size &&
|
||||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) {
|
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("huge pages per NUMA node are not "
|
_("huge pages per NUMA node are not "
|
||||||
@ -6720,6 +6722,13 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
|
|||||||
hugepage = master_hugepage;
|
hugepage = master_hugepage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hugepage && hugepage->size == system_page_size) {
|
||||||
|
/* However, if user specified to use "huge" page
|
||||||
|
* of regular system page size, it's as if they
|
||||||
|
* hasn't specified any huge pages at all. */
|
||||||
|
hugepage = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (hugepage) {
|
if (hugepage) {
|
||||||
/* Now lets see, if the huge page we want to use is even mounted
|
/* Now lets see, if the huge page we want to use is even mounted
|
||||||
* and ready to use */
|
* and ready to use */
|
||||||
@ -7882,44 +7891,51 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|||||||
def->mem.max_balloon = VIR_DIV_UP(def->mem.max_balloon, 1024) * 1024;
|
def->mem.max_balloon = VIR_DIV_UP(def->mem.max_balloon, 1024) * 1024;
|
||||||
virCommandAddArgFormat(cmd, "%llu", def->mem.max_balloon / 1024);
|
virCommandAddArgFormat(cmd, "%llu", def->mem.max_balloon / 1024);
|
||||||
if (def->mem.nhugepages && (!def->cpu || !def->cpu->ncells)) {
|
if (def->mem.nhugepages && (!def->cpu || !def->cpu->ncells)) {
|
||||||
char *mem_path;
|
const long system_page_size = sysconf(_SC_PAGESIZE) / 1024;
|
||||||
|
char *mem_path = NULL;
|
||||||
|
|
||||||
if (!cfg->nhugetlbfs) {
|
if (def->mem.hugepages[0].size == system_page_size) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
/* There is one special case: if user specified "huge"
|
||||||
"%s", _("hugetlbfs filesystem is not mounted "
|
* pages of regular system pages size. */
|
||||||
"or disabled by administrator config"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_PATH)) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("hugepage backing not supported by '%s'"),
|
|
||||||
def->emulator);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (def->mem.hugepages[0].size) {
|
|
||||||
for (j = 0; j < cfg->nhugetlbfs; j++) {
|
|
||||||
if (cfg->hugetlbfs[j].size == def->mem.hugepages[0].size)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j == cfg->nhugetlbfs) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Unable to find any usable hugetlbfs mount for %llu KiB"),
|
|
||||||
def->mem.hugepages[0].size);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[j])))
|
|
||||||
goto error;
|
|
||||||
} else {
|
} else {
|
||||||
if (!(mem_path = qemuGetDefaultHugepath(cfg->hugetlbfs,
|
if (!cfg->nhugetlbfs) {
|
||||||
cfg->nhugetlbfs)))
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
"%s", _("hugetlbfs filesystem is not mounted "
|
||||||
|
"or disabled by administrator config"));
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_PATH)) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("hugepage backing not supported by '%s'"),
|
||||||
|
def->emulator);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (def->mem.hugepages[0].size) {
|
||||||
|
for (j = 0; j < cfg->nhugetlbfs; j++) {
|
||||||
|
if (cfg->hugetlbfs[j].size == def->mem.hugepages[0].size)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == cfg->nhugetlbfs) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Unable to find any usable hugetlbfs mount for %llu KiB"),
|
||||||
|
def->mem.hugepages[0].size);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[j])))
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
if (!(mem_path = qemuGetDefaultHugepath(cfg->hugetlbfs,
|
||||||
|
cfg->nhugetlbfs)))
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path",
|
virCommandAddArg(cmd, "-mem-prealloc");
|
||||||
mem_path, NULL);
|
if (mem_path)
|
||||||
|
virCommandAddArgList(cmd, "-mem-path", mem_path, NULL);
|
||||||
VIR_FREE(mem_path);
|
VIR_FREE(mem_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
|
||||||
|
/usr/bin/qemu -S -M pc -m 1024 -mem-prealloc -smp 2 -nographic \
|
||||||
|
-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \
|
||||||
|
-hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none
|
32
tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages6.xml
Normal file
32
tests/qemuxml2argvdata/qemuxml2argv-hugepages-pages6.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<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='4' 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</emulator>
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<source dev='/dev/HostVG/QEMUGuest1'/>
|
||||||
|
<target dev='hda' bus='ide'/>
|
||||||
|
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
||||||
|
</disk>
|
||||||
|
<controller type='usb' index='0'/>
|
||||||
|
<controller type='ide' index='0'/>
|
||||||
|
<controller type='pci' index='0' model='pci-root'/>
|
||||||
|
<memballoon model='virtio'/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -713,6 +713,7 @@ mymain(void)
|
|||||||
DO_TEST_FAILURE("hugepages-pages4", QEMU_CAPS_MEM_PATH,
|
DO_TEST_FAILURE("hugepages-pages4", QEMU_CAPS_MEM_PATH,
|
||||||
QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE);
|
QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE);
|
||||||
DO_TEST("hugepages-pages5", QEMU_CAPS_MEM_PATH);
|
DO_TEST("hugepages-pages5", QEMU_CAPS_MEM_PATH);
|
||||||
|
DO_TEST("hugepages-pages6", NONE);
|
||||||
DO_TEST("nosharepages", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MEM_MERGE);
|
DO_TEST("nosharepages", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MEM_MERGE);
|
||||||
DO_TEST("disk-cdrom", NONE);
|
DO_TEST("disk-cdrom", NONE);
|
||||||
DO_TEST("disk-cdrom-network-http", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE,
|
DO_TEST("disk-cdrom-network-http", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE,
|
||||||
|
Loading…
Reference in New Issue
Block a user