]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Make memory alignment helper more universal
authorPeter Krempa <pkrempa@redhat.com>
Fri, 31 Jul 2015 14:00:20 +0000 (16:00 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 22 Sep 2015 14:09:27 +0000 (16:09 +0200)
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
src/qemu/qemu_domain.h
src/qemu/qemu_hotplug.c

index d7b66ab5136beb2687b77dd2a61a0965e88a0d6b..405a9008469251c1d6c7f1f8d430c3bd5ef2f8ab 100644 (file)
@@ -3361,30 +3361,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;
 }
@@ -3399,9 +3408,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));
 }
 
 
index 8cf535fbf1ab5351bd140626a2716ad0baa9f7f5..64cd7e1a124ec6f47df1e5c7b3a48560c93b3759 100644 (file)
@@ -469,7 +469,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);
 
index 47978360b0b8f23bb890df12bf1eac8c04bd7d92..afc54080b858a503a860c7c593b2acb5f7246d46 100644 (file)
@@ -1802,7 +1802,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,
@@ -4273,7 +4273,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",