char *nodemask = NULL;
char *mem_path = NULL;
int ret = -1;
+ const long system_page_size = sysconf(_SC_PAGESIZE);
if (virDomainNumatuneHasPerNodeBinding(def->numatune) &&
!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
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)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("huge pages per NUMA node are not "
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) {
/* Now lets see, if the huge page we want to use is even mounted
* and ready to use */
def->mem.max_balloon = VIR_DIV_UP(def->mem.max_balloon, 1024) * 1024;
virCommandAddArgFormat(cmd, "%llu", def->mem.max_balloon / 1024);
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) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("hugetlbfs filesystem is not mounted "
- "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 (def->mem.hugepages[0].size == system_page_size) {
+ /* There is one special case: if user specified "huge"
+ * pages of regular system pages size. */
+ } else {
+ if (!cfg->nhugetlbfs) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("hugetlbfs filesystem is not mounted "
+ "or disabled by administrator config"));
+ goto error;
}
-
- if (j == cfg->nhugetlbfs) {
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_PATH)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Unable to find any usable hugetlbfs mount for %llu KiB"),
- def->mem.hugepages[0].size);
+ _("hugepage backing not supported by '%s'"),
+ def->emulator);
goto error;
}
- if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[j])))
- goto error;
- } else {
- if (!(mem_path = qemuGetDefaultHugepath(cfg->hugetlbfs,
- cfg->nhugetlbfs)))
- 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",
- mem_path, NULL);
+ virCommandAddArg(cmd, "-mem-prealloc");
+ if (mem_path)
+ virCommandAddArgList(cmd, "-mem-path", mem_path, NULL);
VIR_FREE(mem_path);
}
--- /dev/null
+<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>