https://bugzilla.redhat.com/show_bug.cgi?id=1455819
Currently, the per-domain path for huge pages mmap() for qemu is
created iff domain has memoryBacking and hugepages in it
configured. However, this alone is not enough because there can
be a DIMM module with hugepages configured too.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_process.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 32ba8e373..a219a8080 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3289,11 +3289,33 @@ qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
bool build)
{
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ const long system_pagesize = virGetSystemPageSizeKB();
char *hugepagePath = NULL;
size_t i;
+ bool shouldBuild = false;
int ret = -1;
- if (vm->def->mem.nhugepages) {
+ if (vm->def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE)
+ shouldBuild = true;
+
+ for (i = 0; !shouldBuild && i < vm->def->mem.nhugepages; i++) {
+ if (vm->def->mem.hugepages[i].size != system_pagesize) {
+ shouldBuild = true;
+ break;
+ }
+ }
+
+ for (i = 0; !shouldBuild && vm->def->nmems; i++) {
+ if (vm->def->mems[i]->model == VIR_DOMAIN_MEMORY_MODEL_DIMM &&
+ vm->def->mems[i]->pagesize &&
+ vm->def->mems[i]->pagesize != system_pagesize) {
+ shouldBuild = true;
+ break;
+ }
+ }
+
+ if (!build ||
+ (build && shouldBuild)) {
for (i = 0; i < cfg->nhugetlbfs; i++) {
VIR_FREE(hugepagePath);
hugepagePath = qemuGetDomainHugepagePath(vm->def,
&cfg->hugetlbfs[i]);
--
2.13.0