[libvirt] [PATCH 1/2] conf: Remove pre-calculation of initial memory size
John Ferlan
jferlan at redhat.com
Thu Jun 16 17:39:39 UTC 2016
On 06/15/2016 09:56 AM, Peter Krempa wrote:
> While we need to know the difference between the total memory stored in
> <memory> and the actual size not included in the possible memory modules
> we can't pre-calculate it reliably. This is due to the fact that
> libvirt's XML is copied via formatting and parsing the XML and the
> initial memory size can be reliably calculated only when certain
> conditions are met due to backwards compatibility.
>
> This patch removes the storage of 'initial_memory' and fixes the helpers
> to recalculate the initial memory size all the time from the total
> memory size. This conversion is possible when we also make sure that
> memory hotplug accounts properly for the update of the total memory size
> and thus the helpers for inserting and removing memory devices need to
> be tweaked too.
>
> This fixes a bug where a cold-plug and cold-remove of a memory device
> would increase the size reported in <memory> in the XML by the size of
> the memory device. This would happen as the persistent definition is
> copied before attaching the device and this would lead to the loss of
> data in 'initial_memory'.
>
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1344892
> ---
> src/conf/domain_conf.c | 85 +++++++++++++++++++++++++-----------------------
> src/conf/domain_conf.h | 3 --
> src/libvirt_private.syms | 1 -
> src/qemu/qemu_domain.c | 6 ++--
> 4 files changed, 49 insertions(+), 46 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 9504e5f..10e9e8b 100644
[...]
>
> +/**
> + * virDomainMemoryInsert:
> + *
> + * Inserts a memory device definition into the domain definition. This helper
> + * should be used only in hotplug cases as it's blindly modifying the total
> + * memory size.
> + */
A nit:
I note that it's also called during the attach device config path...
While yes hotplug modifies both live & config, a casual reader may
mistake it for hotplug/live only. Maybe it's just me.
> int
> virDomainMemoryInsert(virDomainDefPtr def,
> virDomainMemoryDefPtr mem)
> {
> + unsigned long long memory = virDomainDefGetMemoryActual(def);
> int id = def->nmems;
>
> if (mem->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
> @@ -14565,24 +14556,38 @@ virDomainMemoryInsert(virDomainDefPtr def,
> return -1;
> }
>
> - if (VIR_APPEND_ELEMENT(def->mems, def->nmems, mem) < 0)
> + if (VIR_APPEND_ELEMENT_COPY(def->mems, def->nmems, mem) < 0)
> return -1;
>
> + virDomainDefSetMemoryTotal(def, memory + mem->size);
> +
> return id;
> }
>
>
> +/**
> + * virDomainMemoryInsert:
s/Insert/Remove
> + *
> + * Removes a memory device definition into the domain definition. This helper
s/into/from/
> + * should be used only in hotplug cases as it's blindly modifying the total
> + * memory size.
> + */
> virDomainMemoryDefPtr
> virDomainMemoryRemove(virDomainDefPtr def,
> int idx)
> {
> + unsigned long long memory = virDomainDefGetMemoryActual(def);
> virDomainMemoryDefPtr ret = def->mems[idx];
> +
> VIR_DELETE_ELEMENT(def->mems, idx, def->nmems);
>
> /* fix up balloon size */
> if (def->mem.cur_balloon > virDomainDefGetMemoryActual(def))
> def->mem.cur_balloon = virDomainDefGetMemoryActual(def);
Interesting that on the AttachDevice side there is a corollary, but the
Detach device side this code does it. Whether that's a different
inconsistency or problem is your call...
ACK w/ the function comments changed. Your call on this balloon
modification - it's just something I noted...
John
>
> + /* fix total memory size of the domain */
> + virDomainDefSetMemoryTotal(def, memory - ret->size);
> +
> return ret;
> }
>
[...]
More information about the libvir-list
mailing list