[libvirt] [PATCHv2 2/2] conf: allow fuzz in XML with cur balloon > max
Osier Yang
jyang at redhat.com
Sat Mar 31 07:19:11 UTC 2012
On 03/30/2012 11:56 PM, Eric Blake wrote:
> Commit 1b1402b introduced a regression. Since older libvirt versions
> would silently round memory up (until the previous patch), but populated
> current memory based on querying the guest, it was possible to have
> current> maximum by the amount of the rounding. Accept this fuzz
> factor, and silently clamp current down to maximum in that case,
> rather than failing to reparse XML for an existing VM.
>
> * src/conf/domain_conf.c (virDomainDefParseXML): Don't reject
> existing XML.
> Based on a report by Zhou Peng.
> ---
> src/conf/domain_conf.c | 19 +++++++++++++++----
> src/qemu/qemu_monitor_json.c | 2 +-
> 2 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 4caef6f..7c95920 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -7776,10 +7776,21 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
> goto error;
>
> if (def->mem.cur_balloon> def->mem.max_balloon) {
> - virDomainReportError(VIR_ERR_XML_ERROR,
> - _("current memory '%lluk' exceeds maximum '%lluk'"),
> - def->mem.cur_balloon, def->mem.max_balloon);
> - goto error;
> + /* Older libvirt could get into this situation due to
> + * rounding; if the discrepancy is less than 1MiB, we silently
> + * round down, otherwise we flag the issue. */
> + if (VIR_DIV_UP(def->mem.cur_balloon, 1024)>
> + VIR_DIV_UP(def->mem.max_balloon, 1024)) {
> + virDomainReportError(VIR_ERR_XML_ERROR,
> + _("current memory '%lluk' exceeds "
> + "maximum '%lluk'"),
> + def->mem.cur_balloon, def->mem.max_balloon);
> + goto error;
> + } else {
> + VIR_DEBUG("Truncating current %lluk to maximum %lluk",
> + def->mem.cur_balloon, def->mem.max_balloon);
> + def->mem.cur_balloon = def->mem.max_balloon;
> + }
But this needs the documentation IMHO, it actually changes
the behaviours.
> } else if (def->mem.cur_balloon == 0) {
> def->mem.cur_balloon = def->mem.max_balloon;
> }
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 7093e1d..6d66587 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -2022,7 +2022,7 @@ int qemuMonitorJSONSetBalloon(qemuMonitorPtr mon,
> {
> int ret;
> virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("balloon",
> - "U:value", ((unsigned long long)newmem)*1024,
> + "U:value", newmem*1024ULL,
> NULL);
> virJSONValuePtr reply = NULL;
> if (!cmd)
More information about the libvir-list
mailing list