[libvirt] [PATCH 1/2] qemu: Make memory alignment helper more universal

Peter Krempa pkrempa at redhat.com
Fri Jul 31 14:49:04 UTC 2015


Extract the size determination into a separate function and reuse it
across the memory device alignment functions. Since later we will need
to decide the alignment size according to architecture let's pass def to
the functions.
---
 src/qemu/qemu_domain.c  | 26 ++++++++++++++++++--------
 src/qemu/qemu_domain.h  |  3 ++-
 src/qemu/qemu_hotplug.c |  4 ++--
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 8b050a0..c1b3326 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -3110,30 +3110,39 @@ qemuDomainAgentAvailable(virDomainObjPtr vm,
 }


+static unsigned long long
+qemuDomainGetMemorySizeAlignment(virDomainDefPtr def ATTRIBUTE_UNUSED)
+{
+    /* Align memory size. QEMU requires rounding to next 4KiB block.
+     * We'll take the "traditional" path and round it to 1MiB*/
+
+    return 1024;
+}
+
+
 int
 qemuDomainAlignMemorySizes(virDomainDefPtr def)
 {
     unsigned long long mem;
+    unsigned long long align = qemuDomainGetMemorySizeAlignment(def);
     size_t ncells = virDomainNumaGetNodeCount(def->numa);
     size_t i;

     /* align NUMA cell sizes if relevant */
     for (i = 0; i < ncells; i++) {
         mem = virDomainNumaGetNodeMemorySize(def->numa, i);
-        virDomainNumaSetNodeMemorySize(def->numa, i, VIR_ROUND_UP(mem, 1024));
+        virDomainNumaSetNodeMemorySize(def->numa, i, VIR_ROUND_UP(mem, align));
     }

     /* align initial memory size */
     mem = virDomainDefGetMemoryInitial(def);
-    virDomainDefSetMemoryInitial(def, VIR_ROUND_UP(mem, 1024));
+    virDomainDefSetMemoryInitial(def, VIR_ROUND_UP(mem, align));

-    /* Align maximum memory size. QEMU requires rounding to next 4KiB block.
-     * We'll take the "traditional" path and round it to 1MiB*/
-    def->mem.max_memory = VIR_ROUND_UP(def->mem.max_memory, 1024);
+    def->mem.max_memory = VIR_ROUND_UP(def->mem.max_memory, align);

     /* Align memory module sizes */
     for (i = 0; i < def->nmems; i++)
-        qemuDomainMemoryDeviceAlignSize(def->mems[i]);
+        def->mems[i]->size = VIR_ROUND_UP(def->mems[i]->size, align);

     return 0;
 }
@@ -3148,9 +3157,10 @@ qemuDomainAlignMemorySizes(virDomainDefPtr def)
  * size so this should be safe).
  */
 void
-qemuDomainMemoryDeviceAlignSize(virDomainMemoryDefPtr mem)
+qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
+                                virDomainMemoryDefPtr mem)
 {
-    mem->size = VIR_ROUND_UP(mem->size, 1024);
+    mem->size = VIR_ROUND_UP(mem->size, qemuDomainGetMemorySizeAlignment(def));
 }


diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 2af7c59..db483fc 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -462,7 +462,8 @@ bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
     ATTRIBUTE_NONNULL(1);

 int qemuDomainAlignMemorySizes(virDomainDefPtr def);
-void qemuDomainMemoryDeviceAlignSize(virDomainMemoryDefPtr mem);
+void qemuDomainMemoryDeviceAlignSize(virDomainDefPtr def,
+                                     virDomainMemoryDefPtr mem);

 virDomainChrSourceDefPtr qemuFindAgentConfig(virDomainDefPtr def);

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 1ea397f..c34475e 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1772,7 +1772,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
     if (!(devstr = qemuBuildMemoryDeviceStr(mem, vm->def, priv->qemuCaps)))
         goto cleanup;

-    qemuDomainMemoryDeviceAlignSize(mem);
+    qemuDomainMemoryDeviceAlignSize(vm->def, mem);

     if (qemuBuildMemoryBackendStr(mem->size, mem->pagesize,
                                   mem->targetNode, mem->sourceNodes, NULL,
@@ -4253,7 +4253,7 @@ qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver,
         return -1;
     }

-    qemuDomainMemoryDeviceAlignSize(memdef);
+    qemuDomainMemoryDeviceAlignSize(vm->def, memdef);

     if ((idx = virDomainMemoryFindByDef(vm->def, memdef)) < 0) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
-- 
2.4.5




More information about the libvir-list mailing list