[libvirt] [PATCH 4/7] conf: Replace access to def-mem.max_balloon with accessor functions
John Ferlan
jferlan at redhat.com
Fri Feb 20 15:15:00 UTC 2015
On 02/18/2015 09:16 AM, Peter Krempa wrote:
> As there are two possible approaches to define a domain's memory size -
> one used with legacy, non-NUMA VMs configured in the <memory> element
> and per-node based approach on NUMA machines - the user needs to make
> sure that both are specified correctly in the NUMA case.
>
> To avoid this burden on the user I'd like to replace the NUMA case with
> automatic totaling of the memory size. To achieve this I need to replace
> direct access to the virDomainMemtune's 'max_balloon' field with
> two separate getters depending on the desired size.
>
> The two sizes are needed as:
> 1) Startup memory size doesn't include memory modules in some
> hypervisors.
> 2) After startup these count as the usable memory size.
>
> Note that the comments for the functions are future aware and document
> state that will be present after a few later patches.
> ---
> src/conf/domain_conf.c | 66 ++++++++++++++++++++++++++++++++++------
> src/conf/domain_conf.h | 4 +++
> src/hyperv/hyperv_driver.c | 2 +-
> src/libvirt_private.syms | 3 ++
> src/libxl/libxl_conf.c | 2 +-
> src/libxl/libxl_driver.c | 8 ++---
> src/lxc/lxc_cgroup.c | 2 +-
> src/lxc/lxc_driver.c | 10 +++---
> src/lxc/lxc_fuse.c | 4 +--
> src/lxc/lxc_native.c | 4 +--
> src/openvz/openvz_driver.c | 2 +-
> src/parallels/parallels_driver.c | 2 +-
> src/parallels/parallels_sdk.c | 12 ++++----
> src/phyp/phyp_driver.c | 11 ++++---
> src/qemu/qemu_command.c | 18 +++++++----
> src/qemu/qemu_driver.c | 19 ++++++------
> src/qemu/qemu_hotplug.c | 8 +++--
> src/qemu/qemu_process.c | 2 +-
> src/test/test_driver.c | 8 ++---
> src/uml/uml_driver.c | 8 ++---
> src/vbox/vbox_common.c | 4 +--
> src/vmware/vmware_driver.c | 2 +-
> src/vmx/vmx.c | 12 ++++----
> src/xen/xm_internal.c | 14 ++++-----
> src/xenapi/xenapi_driver.c | 2 +-
> src/xenapi/xenapi_utils.c | 4 +--
> src/xenconfig/xen_common.c | 8 +++--
> src/xenconfig/xen_sxpr.c | 9 +++---
> 28 files changed, 160 insertions(+), 90 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 6ef499d..e95851a 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -3172,24 +3172,26 @@ virDomainDefPostParseInternal(virDomainDefPtr def,
> return -1;
> }
>
> - if (def->mem.cur_balloon > def->mem.max_balloon) {
> + if (def->mem.cur_balloon > virDomainDefGetMemoryCurrent(def)) {
> /* 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)) {
> + VIR_DIV_UP(virDomainDefGetMemoryCurrent(def), 4096)) {
> virReportError(VIR_ERR_XML_ERROR,
> _("current memory '%lluk' exceeds "
> "maximum '%lluk'"),
> - def->mem.cur_balloon, def->mem.max_balloon);
> + def->mem.cur_balloon,
> + virDomainDefGetMemoryCurrent(def));
> 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;
> + def->mem.cur_balloon,
> + virDomainDefGetMemoryCurrent(def));
> + def->mem.cur_balloon = virDomainDefGetMemoryCurrent(def);
> }
> } else if (def->mem.cur_balloon == 0) {
> - def->mem.cur_balloon = def->mem.max_balloon;
> + def->mem.cur_balloon = virDomainDefGetMemoryCurrent(def);
> }
>
> /*
> @@ -6882,6 +6884,51 @@ virDomainParseMemory(const char *xpath,
> }
>
>
> +/**
> + * virDomainDefGetMemoryInitial:
> + * @def: domain definition
> + *
> + * Returns the size of the initial amount of guest memory. The initial amount
> + * is the memory size is either the configured amount in the <memory> element
> + * or the sum of memory sizes of NUMA nodes in case NUMA is enabled in @def.
> + */
> +unsigned long long
> +virDomainDefGetMemoryInitial(virDomainDefPtr def)
> +{
> + return def->mem.max_balloon;
> +}
> +
> +
> +/**
> + * virDomainDefSetMemoryInitial:
> + * @def: domain definition
> + * @size: size to set
> + *
> + * Sets the initial memory size in @def.
> + */
> +void
> +virDomainDefSetMemoryInitial(virDomainDefPtr def,
> + unsigned long long size)
> +{
> + def->mem.max_balloon = size;
> +}
Odd concept - changing Initial memory, but I don't have a better name in
mind...
> +
> +
> +/**
> + * virDomainDefGetMemoryCurrent:
> + * @def: domain definition
> + *
> + * Returns the current maximum memory size usable by the domain described by
> + * @def. This size is a sum of size returned by virDomainDefGetMemoryInitial
> + * and possible additional memory devices.
> + */
> +unsigned long long
> +virDomainDefGetMemoryCurrent(virDomainDefPtr def)
> +{
> + return virDomainDefGetMemoryInitial(def);
> +}
Ok - so part of me expect this one to return mem.cur_balloon - perhaps a
name change to GetMemoryUsable would help?
and of course begs the question why not bite the bullet and return
mem.cur_balloon in a GetMemoryCurrent accessor...
> +
> +
> static int
> virDomainControllerModelTypeFromString(const virDomainControllerDef *def,
> const char *model)
> @@ -15956,10 +16003,11 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
> goto error;
> }
>
> - if (src->mem.max_balloon != dst->mem.max_balloon) {
> + if (virDomainDefGetMemoryInitial(src) != virDomainDefGetMemoryInitial(dst)) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> _("Target domain max memory %lld does not match source %lld"),
> - dst->mem.max_balloon, src->mem.max_balloon);
> + virDomainDefGetMemoryInitial(dst),
> + virDomainDefGetMemoryInitial(src));
> goto error;
> }
Since the "future" (I assume) is that MemoryCurrent will include the hot
(un)plug memory - does it make sense to also compare src/dst
MemoryCurrent values even though for now it's essentially the same
value? Although I believe that gets done in your later series and it's
hard to keep them in my memory.
Of the remaining uses of GetInitial and {Get|Set}Current the ones I was
wondering about are:
virLXCCgroupSetupMemTune
libxlMakeDomBuildInfo
phypBuildLpar
Wouldn't they be the corollary to qemuBuildCommandLine w/r/t using
Initial instead of Current in order to define the memory for the guest
as it starts up?
John
>
> @@ -19652,7 +19700,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> virBufferAsprintf(buf, " dumpCore='%s'",
> virTristateSwitchTypeToString(def->mem.dump_core));
> virBufferAsprintf(buf, " unit='KiB'>%llu</memory>\n",
> - def->mem.max_balloon);
> + virDomainDefGetMemoryCurrent(def));
>
> virBufferAsprintf(buf, "<currentMemory unit='KiB'>%llu</currentMemory>\n",
> def->mem.cur_balloon);
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 86db2ab..7f9104e 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2197,6 +2197,10 @@ struct _virDomainDef {
> xmlNodePtr metadata;
> };
>
> +unsigned long long virDomainDefGetMemoryInitial(virDomainDefPtr def);
> +void virDomainDefSetMemoryInitial(virDomainDefPtr def, unsigned long long size);
> +unsigned long long virDomainDefGetMemoryCurrent(virDomainDefPtr def);
> +
> typedef enum {
> VIR_DOMAIN_TAINT_CUSTOM_ARGV, /* Custom ARGV passthrough from XML */
> VIR_DOMAIN_TAINT_CUSTOM_MONITOR, /* Custom monitor commands issued */
> diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
> index 906c603..00169c7 100644
> --- a/src/hyperv/hyperv_driver.c
> +++ b/src/hyperv/hyperv_driver.c
> @@ -870,7 +870,7 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
> if (VIR_STRDUP(def->description, virtualSystemSettingData->data->Notes) < 0)
> goto cleanup;
>
> - def->mem.max_balloon = memorySettingData->data->Limit * 1024; /* megabyte to kilobyte */
> + virDomainDefSetMemoryInitial(def, memorySettingData->data->Limit * 1024); /* megabyte to kilobyte */
> def->mem.cur_balloon = memorySettingData->data->VirtualQuantity * 1024; /* megabyte to kilobyte */
>
> def->vcpus = processorSettingData->data->VirtualQuantity;
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index c156b40..a58b2b9 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -198,6 +198,8 @@ virDomainDefFormatConvertXMLFlags;
> virDomainDefFormatInternal;
> virDomainDefFree;
> virDomainDefGetDefaultEmulator;
> +virDomainDefGetMemoryCurrent;
> +virDomainDefGetMemoryInitial;
> virDomainDefGetSecurityLabelDef;
> virDomainDefHasDeviceAddress;
> virDomainDefMaybeAddController;
> @@ -209,6 +211,7 @@ virDomainDefParseFile;
> virDomainDefParseNode;
> virDomainDefParseString;
> virDomainDefPostParse;
> +virDomainDefSetMemoryInitial;
> virDomainDeleteConfig;
> virDomainDeviceAddressIsValid;
> virDomainDeviceAddressTypeToString;
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index e092b11..9389a8e 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -659,7 +659,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
> }
> }
> b_info->sched_params.weight = 1000;
> - b_info->max_memkb = def->mem.max_balloon;
> + b_info->max_memkb = virDomainDefGetMemoryCurrent(def);
> b_info->target_memkb = def->mem.cur_balloon;
> if (hvm) {
> char bootorder[VIR_DOMAIN_BOOT_LAST + 1];
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index ce3a99b..8c04952 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -1075,7 +1075,7 @@ libxlDomainGetMaxMemory(virDomainPtr dom)
> if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
> goto cleanup;
>
> - ret = vm->def->mem.max_balloon;
> + ret = virDomainDefGetMemoryCurrent(vm->def);
>
> cleanup:
> if (vm)
> @@ -1157,7 +1157,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> if (flags & VIR_DOMAIN_MEM_CONFIG) {
> /* Help clang 2.8 decipher the logic flow. */
> sa_assert(persistentDef);
> - persistentDef->mem.max_balloon = newmem;
> + virDomainDefSetMemoryInitial(persistentDef, newmem);
> if (persistentDef->mem.cur_balloon > newmem)
> persistentDef->mem.cur_balloon = newmem;
> ret = virDomainSaveConfig(cfg->configDir, persistentDef);
> @@ -1167,7 +1167,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> } else {
> /* resize the current memory */
>
> - if (newmem > vm->def->mem.max_balloon) {
> + if (newmem > virDomainDefGetMemoryCurrent(vm->def)) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("cannot set memory higher than max memory"));
> goto endjob;
> @@ -1241,7 +1241,7 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
> if (!virDomainObjIsActive(vm)) {
> info->cpuTime = 0;
> info->memory = vm->def->mem.cur_balloon;
> - info->maxMem = vm->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(vm->def);
> } else {
> if (libxl_domain_info(priv->ctx, &d_info, vm->def->id) != 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
> index 8e46a01..1d0ce56 100644
> --- a/src/lxc/lxc_cgroup.c
> +++ b/src/lxc/lxc_cgroup.c
> @@ -146,7 +146,7 @@ static int virLXCCgroupSetupMemTune(virDomainDefPtr def,
> {
> int ret = -1;
>
> - if (virCgroupSetMemory(cgroup, def->mem.max_balloon) < 0)
> + if (virCgroupSetMemory(cgroup, virDomainDefGetMemoryCurrent(def)) < 0)
> goto cleanup;
>
> if (def->mem.hard_limit &&
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 5af0554..bb8b78f 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -617,7 +617,7 @@ static int lxcDomainGetInfo(virDomainPtr dom,
> }
> }
>
> - info->maxMem = vm->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(vm->def);
> info->nrVirtCpu = vm->def->vcpus;
> ret = 0;
>
> @@ -686,7 +686,7 @@ lxcDomainGetMaxMemory(virDomainPtr dom)
> if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
> goto cleanup;
>
> - ret = vm->def->mem.max_balloon;
> + ret = virDomainDefGetMemoryCurrent(vm->def);
>
> cleanup:
> if (vm)
> @@ -735,7 +735,7 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> - persistentDef->mem.max_balloon = newmem;
> + virDomainDefSetMemoryInitial(persistentDef, newmem);
> if (persistentDef->mem.cur_balloon > newmem)
> persistentDef->mem.cur_balloon = newmem;
> if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0)
> @@ -743,7 +743,7 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> }
> } else {
> if (flags & VIR_DOMAIN_AFFECT_LIVE &&
> - newmem > vm->def->mem.max_balloon) {
> + newmem > virDomainDefGetMemoryCurrent(vm->def)) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("max memory of the live instance can't be less "
> "than the current memory"));
> @@ -751,7 +751,7 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG &&
> - newmem > persistentDef->mem.max_balloon) {
> + newmem > virDomainDefGetMemoryCurrent(persistentDef)) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("max memory of the persistent configuration can't "
> "be less than the current memory"));
> diff --git a/src/lxc/lxc_fuse.c b/src/lxc/lxc_fuse.c
> index 5c18cff..c702363 100644
> --- a/src/lxc/lxc_fuse.c
> +++ b/src/lxc/lxc_fuse.c
> @@ -165,11 +165,11 @@ static int lxcProcReadMeminfo(char *hostpath, virDomainDefPtr def,
> *ptr = '\0';
>
> if (STREQ(line, "MemTotal") &&
> - (def->mem.hard_limit || def->mem.max_balloon)) {
> + (def->mem.hard_limit || virDomainDefGetMemoryCurrent(def))) {
> virBufferAsprintf(new_meminfo, "MemTotal: %8llu kB\n",
> meminfo.memtotal);
> } else if (STREQ(line, "MemFree") &&
> - (def->mem.hard_limit || def->mem.max_balloon)) {
> + (def->mem.hard_limit || virDomainDefGetMemoryCurrent(def))) {
> virBufferAsprintf(new_meminfo, "MemFree: %8llu kB\n",
> (meminfo.memtotal - meminfo.memusage));
> } else if (STREQ(line, "Buffers")) {
> diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
> index abf07ce..b3b72bc 100644
> --- a/src/lxc/lxc_native.c
> +++ b/src/lxc/lxc_native.c
> @@ -772,7 +772,7 @@ lxcSetMemTune(virDomainDefPtr def, virConfPtr properties)
> if (lxcConvertSize(value->str, &size) < 0)
> return -1;
> size = size / 1024;
> - def->mem.max_balloon = size;
> + virDomainDefSetMemoryInitial(def, size);
> def->mem.hard_limit = size;
> }
>
> @@ -1012,7 +1012,7 @@ lxcParseConfigString(const char *config)
> }
>
> vmdef->id = -1;
> - vmdef->mem.max_balloon = 64 * 1024;
> + virDomainDefSetMemoryInitial(vmdef, 64 * 1024);
>
> vmdef->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART;
> vmdef->onCrash = VIR_DOMAIN_LIFECYCLE_DESTROY;
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 5a5cd8d..236d372 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -458,7 +458,7 @@ static int openvzDomainGetInfo(virDomainPtr dom,
> }
> }
>
> - info->maxMem = vm->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(vm->def);
> info->memory = vm->def->mem.cur_balloon;
> info->nrVirtCpu = vm->def->vcpus;
> ret = 0;
> diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
> index c9338b5..b73a98d 100644
> --- a/src/parallels/parallels_driver.c
> +++ b/src/parallels/parallels_driver.c
> @@ -522,7 +522,7 @@ parallelsDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
>
> info->state = virDomainObjGetState(privdom, NULL);
> info->memory = privdom->def->mem.cur_balloon;
> - info->maxMem = privdom->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(privdom->def);
> info->nrVirtCpu = privdom->def->vcpus;
> info->cpuTime = 0;
> ret = 0;
> diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c
> index d5ea00a..eed056e 100644
> --- a/src/parallels/parallels_sdk.c
> +++ b/src/parallels/parallels_sdk.c
> @@ -1213,9 +1213,9 @@ prlsdkLoadDomain(parallelsConnPtr privconn,
> /* get RAM parameters */
> pret = PrlVmCfg_GetRamSize(sdkdom, &ram);
> prlsdkCheckRetGoto(pret, error);
> - def->mem.max_balloon = ram << 10; /* RAM size obtained in Mbytes,
> - convert to Kbytes */
> - def->mem.cur_balloon = def->mem.max_balloon;
> + virDomainDefSetMemoryInitial(def, ram << 10); /* RAM size obtained in Mbytes,
> + convert to Kbytes */
> + def->mem.cur_balloon = ram << 10;
>
> if (prlsdkConvertCpuInfo(sdkdom, def, pdom) < 0)
> goto error;
> @@ -1769,14 +1769,14 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def)
> return -1;
> }
>
> - if (def->mem.max_balloon != def->mem.cur_balloon) {
> + if (virDomainDefGetMemoryCurrent(def) != def->mem.cur_balloon) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("changing balloon parameters is not supported "
> "by parallels driver"));
> return -1;
> }
>
> - if (def->mem.max_balloon % (1 << 10) != 0) {
> + if (virDomainDefGetMemoryCurrent(def) % (1 << 10) != 0) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("Memory size should be multiple of 1Mb."));
> return -1;
> @@ -2788,7 +2788,7 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom,
> prlsdkCheckRetGoto(pret, error);
> }
>
> - pret = PrlVmCfg_SetRamSize(sdkdom, def->mem.max_balloon >> 10);
> + pret = PrlVmCfg_SetRamSize(sdkdom, virDomainDefGetMemoryCurrent(def) >> 10);
> prlsdkCheckRetGoto(pret, error);
>
> pret = PrlVmCfg_SetCpuCount(sdkdom, def->vcpus);
> diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
> index d69e29c..9853bfe 100644
> --- a/src/phyp/phyp_driver.c
> +++ b/src/phyp/phyp_driver.c
> @@ -3252,6 +3252,7 @@ phypDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
> LIBSSH2_SESSION *session = phyp_driver->session;
> virDomainDef def;
> char *managed_system = phyp_driver->managed_system;
> + unsigned long long memory;
>
> /* Flags checked by virDomainDefFormat */
>
> @@ -3273,12 +3274,13 @@ phypDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
> goto err;
> }
>
> - if ((def.mem.max_balloon =
> - phypGetLparMem(dom->conn, managed_system, dom->id, 0)) == 0) {
> + if ((memory = phypGetLparMem(dom->conn, managed_system, dom->id, 0)) == 0) {
> VIR_ERROR(_("Unable to determine domain's max memory."));
> goto err;
> }
>
> + virDomainDefSetMemoryInitial(&def, memory);
> +
> if ((def.mem.cur_balloon =
> phypGetLparMem(dom->conn, managed_system, dom->id, 1)) == 0) {
> VIR_ERROR(_("Unable to determine domain's memory."));
> @@ -3491,7 +3493,7 @@ phypBuildLpar(virConnectPtr conn, virDomainDefPtr def)
> goto cleanup;
> }
>
> - if (!def->mem.max_balloon) {
> + if (!virDomainDefGetMemoryCurrent(def)) {
> virReportError(VIR_ERR_XML_ERROR, "%s",
> _("Field <currentMemory> on the domain XML file is missing or "
> "has invalid value."));
> @@ -3517,7 +3519,8 @@ phypBuildLpar(virConnectPtr conn, virDomainDefPtr def)
> virBufferAsprintf(&buf, " -r lpar -p %s -i min_mem=%lld,desired_mem=%lld,"
> "max_mem=%lld,desired_procs=%d,virtual_scsi_adapters=%s",
> def->name, def->mem.cur_balloon,
> - def->mem.cur_balloon, def->mem.max_balloon,
> + def->mem.cur_balloon,
> + virDomainDefGetMemoryCurrent(def),
> (int) def->vcpus, virDomainDiskGetSource(def->disks[0]));
> ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 7853125..bf47702 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -8319,8 +8319,9 @@ qemuBuildCommandLine(virConnectPtr conn,
> * XML to reflect our rounding.
> */
> virCommandAddArg(cmd, "-m");
> - def->mem.max_balloon = VIR_DIV_UP(def->mem.max_balloon, 1024) * 1024;
> - virCommandAddArgFormat(cmd, "%llu", def->mem.max_balloon / 1024);
> + virDomainDefSetMemoryInitial(def, VIR_ROUND_UP(virDomainDefGetMemoryInitial(def), 1024));
> + virCommandAddArgFormat(cmd, "%llu", virDomainDefGetMemoryInitial(def) / 1024);
> +
> if (def->mem.nhugepages && !virDomainNumaGetNodeCount(def->numa)) {
> const long system_page_size = virGetSystemPageSizeKB();
> char *mem_path = NULL;
> @@ -10335,8 +10336,11 @@ qemuBuildCommandLine(virConnectPtr conn,
> * space just to be safe (some finer tuning might be
> * nice, though).
> */
> - memKB = def->mem.hard_limit ?
> - def->mem.hard_limit : def->mem.max_balloon + 1024 * 1024;
> + if (def->mem.hard_limit)
> + memKB = def->mem.hard_limit;
> + else
> + memKB = virDomainDefGetMemoryCurrent(def) + 1024 * 1024;
> +
> virCommandSetMaxMemLock(cmd, memKB * 1024);
> }
>
> @@ -11888,7 +11892,8 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
> }
>
> def->id = -1;
> - def->mem.cur_balloon = def->mem.max_balloon = 64 * 1024;
> + def->mem.cur_balloon = 64 * 1024;
> + virDomainDefSetMemoryInitial(def, def->mem.cur_balloon);
> def->maxvcpus = 1;
> def->vcpus = 1;
> def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
> @@ -12096,7 +12101,8 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
> _("cannot parse memory level '%s'"), val);
> goto error;
> }
> - def->mem.cur_balloon = def->mem.max_balloon = mem * 1024;
> + virDomainDefSetMemoryInitial(def, mem * 1024);
> + def->mem.cur_balloon = mem * 1024;
> } else if (STREQ(arg, "-smp")) {
> WANT_VALUE();
> if (qemuParseCommandLineSmp(def, val) < 0)
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 4458e02..78424a4 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2255,7 +2255,7 @@ qemuDomainGetMaxMemory(virDomainPtr dom)
> if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
> goto cleanup;
>
> - ret = vm->def->mem.max_balloon;
> + ret = virDomainDefGetMemoryCurrent(vm->def);
>
> cleanup:
> qemuDomObjEndAPI(&vm);
> @@ -2317,7 +2317,8 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> goto endjob;
> }
>
> - persistentDef->mem.max_balloon = newmem;
> + virDomainDefSetMemoryInitial(persistentDef, newmem);
> +
> if (persistentDef->mem.cur_balloon > newmem)
> persistentDef->mem.cur_balloon = newmem;
> ret = virDomainSaveConfig(cfg->configDir, persistentDef);
> @@ -2327,7 +2328,7 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> } else {
> /* resize the current memory */
> if (flags & VIR_DOMAIN_AFFECT_LIVE &&
> - newmem > vm->def->mem.max_balloon) {
> + newmem > virDomainDefGetMemoryCurrent(vm->def)) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("max memory of the live instance can't be less "
> "than the current memory"));
> @@ -2335,7 +2336,7 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> }
>
> if (flags & VIR_DOMAIN_AFFECT_CONFIG &&
> - newmem > persistentDef->mem.max_balloon) {
> + newmem > virDomainDefGetMemoryCurrent(persistentDef)) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("max memory of the persistent configuration can't "
> "be less than the current memory"));
> @@ -2595,14 +2596,14 @@ static int qemuDomainGetInfo(virDomainPtr dom,
> }
> }
>
> - info->maxMem = vm->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(vm->def);
>
> if (virDomainObjIsActive(vm)) {
> qemuDomainObjPrivatePtr priv = vm->privateData;
>
> if ((vm->def->memballoon != NULL) &&
> (vm->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE)) {
> - info->memory = vm->def->mem.max_balloon;
> + info->memory = virDomainDefGetMemoryCurrent(vm->def);
> } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BALLOON_EVENT)) {
> info->memory = vm->def->mem.cur_balloon;
> } else if (qemuDomainJobAllowed(priv, QEMU_JOB_QUERY)) {
> @@ -2628,7 +2629,7 @@ static int qemuDomainGetInfo(virDomainPtr dom,
> info->memory = vm->def->mem.cur_balloon;
> } else if (err == 0) {
> /* Balloon not supported, so maxmem is always the allocation */
> - info->memory = vm->def->mem.max_balloon;
> + info->memory = virDomainDefGetMemoryCurrent(vm->def);
> } else {
> info->memory = balloon;
> }
> @@ -18428,7 +18429,7 @@ qemuDomainGetStatsBalloon(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
>
> if (dom->def->memballoon &&
> dom->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE) {
> - cur_balloon = dom->def->mem.max_balloon;
> + cur_balloon = virDomainDefGetMemoryCurrent(dom->def);
> } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BALLOON_EVENT)) {
> cur_balloon = dom->def->mem.cur_balloon;
> } else {
> @@ -18446,7 +18447,7 @@ qemuDomainGetStatsBalloon(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
> &record->nparams,
> maxparams,
> "balloon.maximum",
> - dom->def->mem.max_balloon) < 0)
> + virDomainDefGetMemoryCurrent(dom->def)) < 0)
> return -1;
>
> return 0;
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 8691c7e..8d91719 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1252,9 +1252,11 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
> * Kibibytes, but virProcessSetMaxMemLock expects the value in
> * bytes.
> */
> - memKB = vm->def->mem.hard_limit
> - ? vm->def->mem.hard_limit
> - : vm->def->mem.max_balloon + (1024 * 1024);
> + if (vm->def->mem.hard_limit)
> + memKB = vm->def->mem.hard_limit;
> + else
> + memKB = virDomainDefGetMemoryCurrent(vm->def) + (1024 * 1024);
> +
> virProcessSetMaxMemLock(vm->pid, memKB * 1024);
> break;
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 61790f4..31ec8eb 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -4624,7 +4624,7 @@ int qemuProcessStart(virConnectPtr conn,
> */
> if (virDomainDefNeedsPlacementAdvice(vm->def)) {
> nodeset = virNumaGetAutoPlacementAdvice(vm->def->vcpus,
> - vm->def->mem.max_balloon);
> + virDomainDefGetMemoryCurrent(vm->def));
> if (!nodeset)
> goto cleanup;
>
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index a386270..3aa6a5e 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -2149,7 +2149,7 @@ static int testDomainGetInfo(virDomainPtr domain,
>
> info->state = virDomainObjGetState(privdom, NULL);
> info->memory = privdom->def->mem.cur_balloon;
> - info->maxMem = privdom->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(privdom->def);
> info->nrVirtCpu = privdom->def->vcpus;
> info->cpuTime = ((tv.tv_sec * 1000ll * 1000ll * 1000ll) + (tv.tv_usec * 1000ll));
> ret = 0;
> @@ -2517,7 +2517,7 @@ testDomainGetMaxMemory(virDomainPtr domain)
> goto cleanup;
> }
>
> - ret = privdom->def->mem.max_balloon;
> + ret = virDomainDefGetMemoryCurrent(privdom->def);
>
> cleanup:
> if (privdom)
> @@ -2543,7 +2543,7 @@ static int testDomainSetMaxMemory(virDomainPtr domain,
> }
>
> /* XXX validate not over host memory wrt to other domains */
> - privdom->def->mem.max_balloon = memory;
> + virDomainDefSetMemoryInitial(privdom->def, memory);
> ret = 0;
>
> cleanup:
> @@ -2569,7 +2569,7 @@ static int testDomainSetMemory(virDomainPtr domain,
> goto cleanup;
> }
>
> - if (memory > privdom->def->mem.max_balloon) {
> + if (memory > virDomainDefGetMemoryCurrent(privdom->def)) {
> virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__);
> goto cleanup;
> }
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index 68efd18..59ff33c 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -1802,7 +1802,7 @@ umlDomainGetMaxMemory(virDomainPtr dom)
> if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
> goto cleanup;
>
> - ret = vm->def->mem.max_balloon;
> + ret = virDomainDefGetMemoryCurrent(vm->def);
>
> cleanup:
> if (vm)
> @@ -1838,7 +1838,7 @@ static int umlDomainSetMaxMemory(virDomainPtr dom, unsigned long newmax)
> goto cleanup;
> }
>
> - vm->def->mem.max_balloon = newmax;
> + virDomainDefSetMemoryInitial(vm->def, newmax);
> ret = 0;
>
> cleanup:
> @@ -1875,7 +1875,7 @@ static int umlDomainSetMemory(virDomainPtr dom, unsigned long newmem)
> goto cleanup;
> }
>
> - if (newmem > vm->def->mem.max_balloon) {
> + if (newmem > virDomainDefGetMemoryCurrent(vm->def)) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("cannot set memory higher than max memory"));
> goto cleanup;
> @@ -1922,7 +1922,7 @@ static int umlDomainGetInfo(virDomainPtr dom,
> }
> }
>
> - info->maxMem = vm->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(vm->def);
> info->memory = vm->def->mem.cur_balloon;
> info->nrVirtCpu = vm->def->vcpus;
> ret = 0;
> diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
> index 55d3624..6697ecc 100644
> --- a/src/vbox/vbox_common.c
> +++ b/src/vbox/vbox_common.c
> @@ -3894,7 +3894,7 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
> * reading and while dumping xml
> */
> /* def->mem.max_balloon = maxMemorySize * 1024; */
> - def->mem.max_balloon = memorySize * 1024;
> + virDomainDefSetMemoryInitial(def, memorySize * 1024);
>
> gVBoxAPI.UIMachine.GetCPUCount(machine, &CPUCount);
> def->maxvcpus = def->vcpus = CPUCount;
> @@ -6055,7 +6055,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
> * the notation here seems to be inconsistent while
> * reading and while dumping xml
> */
> - def->dom->mem.max_balloon = memorySize * 1024;
> + virDomainDefSetMemoryInitial(def->dom, memorySize * 1024);
> if (VIR_STRDUP(def->dom->os.type, "hvm") < 0)
> goto cleanup;
> def->dom->os.arch = virArchFromHost();
> diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
> index fb7fa5b..71589a6 100644
> --- a/src/vmware/vmware_driver.c
> +++ b/src/vmware/vmware_driver.c
> @@ -1126,7 +1126,7 @@ vmwareDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
>
> info->state = virDomainObjGetState(vm, NULL);
> info->cpuTime = 0;
> - info->maxMem = vm->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(vm->def);
> info->memory = vm->def->mem.cur_balloon;
> info->nrVirtCpu = vm->def->vcpus;
> ret = 0;
> diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
> index ac2542a..eba1a68 100644
> --- a/src/vmx/vmx.c
> +++ b/src/vmx/vmx.c
> @@ -1375,7 +1375,7 @@ virVMXParseConfig(virVMXContext *ctx,
> goto cleanup;
> }
>
> - def->mem.max_balloon = memsize * 1024; /* Scale from megabytes to kilobytes */
> + virDomainDefSetMemoryInitial(def, memsize * 1024); /* Scale from megabytes to kilobytes */
>
> /* vmx:sched.mem.max -> def:mem.cur_balloon */
> if (virVMXGetConfigLong(conf, "sched.mem.max", &sched_mem_max, memsize,
> @@ -1388,8 +1388,8 @@ virVMXParseConfig(virVMXContext *ctx,
>
> def->mem.cur_balloon = sched_mem_max * 1024; /* Scale from megabytes to kilobytes */
>
> - if (def->mem.cur_balloon > def->mem.max_balloon)
> - def->mem.cur_balloon = def->mem.max_balloon;
> + if (def->mem.cur_balloon > virDomainDefGetMemoryCurrent(def))
> + def->mem.cur_balloon = virDomainDefGetMemoryCurrent(def);
>
> /* vmx:sched.mem.minsize -> def:mem.min_guarantee */
> if (virVMXGetConfigLong(conf, "sched.mem.minsize", &sched_mem_minsize, 0,
> @@ -1402,8 +1402,8 @@ virVMXParseConfig(virVMXContext *ctx,
>
> def->mem.min_guarantee = sched_mem_minsize * 1024; /* Scale from megabytes to kilobytes */
>
> - if (def->mem.min_guarantee > def->mem.max_balloon)
> - def->mem.min_guarantee = def->mem.max_balloon;
> + if (def->mem.min_guarantee > virDomainDefGetMemoryCurrent(def))
> + def->mem.min_guarantee = virDomainDefGetMemoryCurrent(def);
>
> /* vmx:numvcpus -> def:vcpus */
> if (virVMXGetConfigLong(conf, "numvcpus", &numvcpus, 1, true) < 0)
> @@ -3083,7 +3083,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe
>
> /* def:mem.max_balloon -> vmx:memsize */
> /* max-memory must be a multiple of 4096 kilobyte */
> - max_balloon = VIR_DIV_UP(def->mem.max_balloon, 4096) * 4096;
> + max_balloon = VIR_DIV_UP(virDomainDefGetMemoryCurrent(def), 4096) * 4096;
>
> virBufferAsprintf(&buffer, "memsize = \"%llu\"\n",
> max_balloon / 1024); /* Scale from kilobytes to megabytes */
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index 354ab3f..ab9e6a6 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -479,7 +479,7 @@ xenXMDomainGetInfo(virConnectPtr conn,
> goto error;
>
> memset(info, 0, sizeof(virDomainInfo));
> - info->maxMem = entry->def->mem.max_balloon;
> + info->maxMem = virDomainDefGetMemoryCurrent(entry->def);
> info->memory = entry->def->mem.cur_balloon;
> info->nrVirtCpu = entry->def->vcpus;
> info->state = VIR_DOMAIN_SHUTOFF;
> @@ -557,8 +557,8 @@ xenXMDomainSetMemory(virConnectPtr conn,
> goto cleanup;
>
> entry->def->mem.cur_balloon = memory;
> - if (entry->def->mem.cur_balloon > entry->def->mem.max_balloon)
> - entry->def->mem.cur_balloon = entry->def->mem.max_balloon;
> + if (entry->def->mem.cur_balloon > virDomainDefGetMemoryCurrent(entry->def))
> + entry->def->mem.cur_balloon = virDomainDefGetMemoryCurrent(entry->def);
>
> /* If this fails, should we try to undo our changes to the
> * in-memory representation of the config file. I say not!
> @@ -600,10 +600,10 @@ xenXMDomainSetMaxMemory(virConnectPtr conn,
> if (!(entry = virHashLookup(priv->configCache, filename)))
> goto cleanup;
>
> - entry->def->mem.max_balloon = memory;
> - if (entry->def->mem.cur_balloon > entry->def->mem.max_balloon)
> - entry->def->mem.cur_balloon = entry->def->mem.max_balloon;
> + if (entry->def->mem.cur_balloon > memory)
> + entry->def->mem.cur_balloon = memory;
>
> + virDomainDefSetMemoryInitial(entry->def, memory);
> /* If this fails, should we try to undo our changes to the
> * in-memory representation of the config file. I say not!
> */
> @@ -636,7 +636,7 @@ xenXMDomainGetMaxMemory(virConnectPtr conn,
> if (!(entry = virHashLookup(priv->configCache, filename)))
> goto cleanup;
>
> - ret = entry->def->mem.max_balloon;
> + ret = virDomainDefGetMemoryCurrent(entry->def);
>
> cleanup:
> xenUnifiedUnlock(priv);
> diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
> index afb6d6c..b3dd852 100644
> --- a/src/xenapi/xenapi_driver.c
> +++ b/src/xenapi/xenapi_driver.c
> @@ -1490,7 +1490,7 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
> VIR_FREE(val);
> }
> memory = xenapiDomainGetMaxMemory(dom);
> - defPtr->mem.max_balloon = memory;
> + virDomainDefSetMemoryInitial(defPtr, memory);
> if (xen_vm_get_memory_dynamic_max(session, &dynamic_mem, vm)) {
> defPtr->mem.cur_balloon = (unsigned long) (dynamic_mem / 1024);
> } else {
> diff --git a/src/xenapi/xenapi_utils.c b/src/xenapi/xenapi_utils.c
> index 91bc649..35f0f04 100644
> --- a/src/xenapi/xenapi_utils.c
> +++ b/src/xenapi/xenapi_utils.c
> @@ -495,8 +495,8 @@ createVMRecordFromXml(virConnectPtr conn, virDomainDefPtr def,
>
> if (def->mem.cur_balloon)
> (*record)->memory_static_max = (int64_t) (def->mem.cur_balloon * 1024);
> - if (def->mem.max_balloon)
> - (*record)->memory_dynamic_max = (int64_t) (def->mem.max_balloon * 1024);
> + if (virDomainDefGetMemoryCurrent(def))
> + (*record)->memory_dynamic_max = (int64_t) (virDomainDefGetMemoryCurrent(def) * 1024);
> else
> (*record)->memory_dynamic_max = (*record)->memory_static_max;
>
> diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c
> index a2a1474..924f0d6 100644
> --- a/src/xenconfig/xen_common.c
> +++ b/src/xenconfig/xen_common.c
> @@ -305,16 +305,18 @@ xenConfigSetString(virConfPtr conf, const char *setting, const char *str)
> static int
> xenParseMem(virConfPtr conf, virDomainDefPtr def)
> {
> + unsigned long long memory;
> +
> if (xenConfigGetULongLong(conf, "memory", &def->mem.cur_balloon,
> MIN_XEN_GUEST_SIZE * 2) < 0)
> return -1;
>
> - if (xenConfigGetULongLong(conf, "maxmem", &def->mem.max_balloon,
> + if (xenConfigGetULongLong(conf, "maxmem", &memory,
> def->mem.cur_balloon) < 0)
> return -1;
>
> def->mem.cur_balloon *= 1024;
> - def->mem.max_balloon *= 1024;
> + virDomainDefSetMemoryInitial(def, memory * 1024);
>
> return 0;
> }
> @@ -1410,7 +1412,7 @@ static int
> xenFormatMem(virConfPtr conf, virDomainDefPtr def)
> {
> if (xenConfigSetInt(conf, "maxmem",
> - VIR_DIV_UP(def->mem.max_balloon, 1024)) < 0)
> + VIR_DIV_UP(virDomainDefGetMemoryCurrent(def), 1024)) < 0)
> return -1;
>
> if (xenConfigSetInt(conf, "memory",
> diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c
> index 3e18a7e..fbebf51 100644
> --- a/src/xenconfig/xen_sxpr.c
> +++ b/src/xenconfig/xen_sxpr.c
> @@ -1155,10 +1155,11 @@ xenParseSxpr(const struct sexpr *root,
> }
> }
>
> - def->mem.max_balloon = (sexpr_u64(root, "domain/maxmem") << 10);
> + virDomainDefSetMemoryInitial(def, (sexpr_u64(root, "domain/maxmem") << 10));
> def->mem.cur_balloon = (sexpr_u64(root, "domain/memory") << 10);
> - if (def->mem.cur_balloon > def->mem.max_balloon)
> - def->mem.cur_balloon = def->mem.max_balloon;
> +
> + if (def->mem.cur_balloon > virDomainDefGetMemoryCurrent(def))
> + def->mem.cur_balloon = virDomainDefGetMemoryCurrent(def);
>
> if (cpus != NULL) {
> if (virBitmapParse(cpus, 0, &def->cpumask,
> @@ -2213,7 +2214,7 @@ xenFormatSxpr(virConnectPtr conn,
> virBufferEscapeSexpr(&buf, "(name '%s')", def->name);
> virBufferAsprintf(&buf, "(memory %llu)(maxmem %llu)",
> VIR_DIV_UP(def->mem.cur_balloon, 1024),
> - VIR_DIV_UP(def->mem.max_balloon, 1024));
> + VIR_DIV_UP(virDomainDefGetMemoryCurrent(def), 1024));
> virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
> /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is
> either 32, or 64 on a platform where long is big enough. */
>
More information about the libvir-list
mailing list