[libvirt] [PATCH 03/13] qemu: Make memory alignment helper more universal
Michal Privoznik
mprivozn at redhat.com
Tue Sep 22 12:29:34 UTC 2015
On 21.09.2015 19:21, Peter Krempa wrote:
> 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 f840b0d..a5e9b75 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3367,30 +3367,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);
How about:
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a5e9b75..807112c 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -3381,7 +3381,7 @@ int
qemuDomainAlignMemorySizes(virDomainDefPtr def)
{
unsigned long long mem;
- unsigned long long align = qemuDomainGetMemorySizeAlignment(def);
+ unsigned long long const align = qemuDomainGetMemorySizeAlignment(def);
size_t ncells = virDomainNumaGetNodeCount(def->numa);
size_t i;
> 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;
> }
> @@ -3405,9 +3414,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 8cf535f..64cd7e1 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -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);
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 4797836..afc5408 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -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",
>
ACK
Michal
More information about the libvir-list
mailing list