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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list