]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuDomainAttachMemory: Crate hugepage dir if needed
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 7 Jun 2017 12:47:37 +0000 (14:47 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 13 Jun 2017 14:39:39 +0000 (16:39 +0200)
https://bugzilla.redhat.com/show_bug.cgi?id=1455819

It may happen that a domain is started without any huge pages.
However, user might try to attach a DIMM module later. DIMM
backed by huge pages (why would somebody want to mix regular and
huge pages is beyond me). Therefore we have to create the dir if
we haven't done so far.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_hotplug.c
src/qemu/qemu_process.c
src/qemu/qemu_process.h

index 96f3f4579d4b6249f733fbe98dba46836b06f219..0b8d3d80f17396906a8abad708b005c1fcfb1ed0 100644 (file)
@@ -2258,6 +2258,9 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
                                   priv->qemuCaps, vm->def, mem, NULL, true) < 0)
         goto cleanup;
 
+    if (qemuProcessBuildDestroyHugepagesPath(driver, vm, mem, true) < 0)
+        goto cleanup;
+
     if (qemuDomainNamespaceSetupMemory(driver, vm, mem) < 0)
         goto cleanup;
     teardowndevice = true;
index 59cca2736d941ca3209e6263d525e23ecd1bf03d..85b800da3d842b8c5bf803cf6f9a16c03e7a239d 100644 (file)
@@ -3284,7 +3284,8 @@ qemuProcessReconnectCheckMemAliasOrderMismatch(virDomainObjPtr vm)
 
 
 static bool
-qemuProcessNeedHugepagesPath(virDomainDefPtr def)
+qemuProcessNeedHugepagesPath(virDomainDefPtr def,
+                             virDomainMemoryDefPtr mem)
 {
     const long system_pagesize = virGetSystemPageSizeKB();
     size_t i;
@@ -3304,13 +3305,20 @@ qemuProcessNeedHugepagesPath(virDomainDefPtr def)
             return true;
     }
 
+    if (mem &&
+        mem->model == VIR_DOMAIN_MEMORY_MODEL_DIMM &&
+        mem->pagesize &&
+        mem->pagesize != system_pagesize)
+        return true;
+
     return false;
 }
 
 
-static int
+int
 qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
                                      virDomainObjPtr vm,
+                                     virDomainMemoryDefPtr mem,
                                      bool build)
 {
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
@@ -3320,7 +3328,7 @@ qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
     int ret = -1;
 
     if (build)
-        shouldBuild = qemuProcessNeedHugepagesPath(vm->def);
+        shouldBuild = qemuProcessNeedHugepagesPath(vm->def, mem);
 
     if (!build || shouldBuild) {
         for (i = 0; i < cfg->nhugetlbfs; i++) {
@@ -3331,6 +3339,11 @@ qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
                 goto cleanup;
 
             if (build) {
+                if (virFileExists(hugepagePath)) {
+                    ret = 0;
+                    goto cleanup;
+                }
+
                 if (virFileMakePathWithMode(hugepagePath, 0700) < 0) {
                     virReportSystemError(errno,
                                          _("Unable to create %s"),
@@ -3504,7 +3517,7 @@ qemuProcessReconnect(void *opaque)
         goto cleanup;
     }
 
-    if (qemuProcessBuildDestroyHugepagesPath(driver, obj, true) < 0)
+    if (qemuProcessBuildDestroyHugepagesPath(driver, obj, NULL, true) < 0)
         goto error;
 
     if ((qemuDomainAssignAddresses(obj->def, priv->qemuCaps,
@@ -5572,7 +5585,7 @@ qemuProcessPrepareHost(virQEMUDriverPtr driver,
                                NULL) < 0)
         goto cleanup;
 
-    if (qemuProcessBuildDestroyHugepagesPath(driver, vm, true) < 0)
+    if (qemuProcessBuildDestroyHugepagesPath(driver, vm, NULL, true) < 0)
         goto cleanup;
 
     /* Ensure no historical cgroup for this VM is lying around bogus
@@ -6259,7 +6272,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
         goto endjob;
     }
 
-    qemuProcessBuildDestroyHugepagesPath(driver, vm, false);
+    qemuProcessBuildDestroyHugepagesPath(driver, vm, NULL, false);
 
     vm->def->id = -1;
 
index c38310b47a8539129fda07ebb1ef560173162b9a..667d5c53d5c383e2a0ba2f32fee97330dd27c70b 100644 (file)
@@ -38,6 +38,11 @@ int qemuProcessStopCPUs(virQEMUDriverPtr driver,
                         virDomainPausedReason reason,
                         qemuDomainAsyncJob asyncJob);
 
+int qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
+                                         virDomainObjPtr vm,
+                                         virDomainMemoryDefPtr mem,
+                                         bool build);
+
 void qemuProcessAutostartAll(virQEMUDriverPtr driver);
 void qemuProcessReconnectAll(virConnectPtr conn, virQEMUDriverPtr driver);