From e5c7864cfcc510db8414f8dcf771d2f1693210e1 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 10 Feb 2015 17:11:40 +0100 Subject: [PATCH] conf: Hoist validation of memory size into the post parse callback Later patches will need to access the full definition to do check the memory size and thus the checking needs to be done after the whole definition including devices is known. --- src/conf/domain_conf.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c9fe928124..b155a5a34c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3172,6 +3172,26 @@ virDomainDefPostParseInternal(virDomainDefPtr def, return -1; } + if (def->mem.cur_balloon > def->mem.max_balloon) { + /* Older libvirt could get into this situation due to + * rounding; if the discrepancy is less than 4MiB, we silently + * round down, otherwise we flag the issue. */ + if (VIR_DIV_UP(def->mem.cur_balloon, 4096) > + VIR_DIV_UP(def->mem.max_balloon, 4096)) { + virReportError(VIR_ERR_XML_ERROR, + _("current memory '%lluk' exceeds " + "maximum '%lluk'"), + def->mem.cur_balloon, def->mem.max_balloon); + return -1; + } 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; + } + } else if (def->mem.cur_balloon == 0) { + def->mem.cur_balloon = def->mem.max_balloon; + } + /* * Some really crazy backcompat stuff for consoles * @@ -13036,27 +13056,6 @@ virDomainDefParseXML(xmlDocPtr xml, } VIR_FREE(tmp); - if (def->mem.cur_balloon > def->mem.max_balloon) { - /* Older libvirt could get into this situation due to - * rounding; if the discrepancy is less than 4MiB, we silently - * round down, otherwise we flag the issue. */ - if (VIR_DIV_UP(def->mem.cur_balloon, 4096) > - VIR_DIV_UP(def->mem.max_balloon, 4096)) { - virReportError(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; - } - } else if (def->mem.cur_balloon == 0) { - def->mem.cur_balloon = def->mem.max_balloon; - } - - if ((n = virXPathNodeSet("./memoryBacking/hugepages/page", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot extract hugepages nodes")); -- 2.39.5