/* Memory */
virCommandAddArg(cmd, "-m");
virCommandAddArgFormat(cmd, "%llu",
- VIR_DIV_UP(def->mem.max_balloon, 1024));
+ VIR_DIV_UP(virDomainDefGetMemoryInitial(def), 1024));
/* Options */
if (def->features[VIR_DOMAIN_FEATURE_ACPI] == VIR_TRISTATE_SWITCH_ON)
/* Memory (MB) */
virCommandAddArg(cmd, "-m");
virCommandAddArgFormat(cmd, "%llu",
- VIR_DIV_UP(def->mem.max_balloon, 1024));
+ VIR_DIV_UP(virDomainDefGetMemoryInitial(def), 1024));
/* Image path */
virCommandAddArg(cmd, "-d");
/* Memory in MB */
virCommandAddArg(cmd, "--memory");
virCommandAddArgFormat(cmd, "%llu",
- VIR_DIV_UP(def->mem.max_balloon, 1024));
+ VIR_DIV_UP(virDomainDefGetMemoryInitial(def), 1024));
if ((bhyveDriverGetGrubCaps(conn) & BHYVE_GRUB_CAP_CONSDEV) != 0 &&
def->nserials > 0) {
}
info->state = virDomainObjGetState(vm, NULL);
- info->maxMem = vm->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(vm->def);
info->nrVirtCpu = vm->def->vcpus;
ret = 0;
return -1;
}
- if (def->mem.cur_balloon > def->mem.max_balloon) {
+ if (def->mem.cur_balloon > virDomainDefGetMemoryActual(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(virDomainDefGetMemoryActual(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,
+ virDomainDefGetMemoryActual(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,
+ virDomainDefGetMemoryActual(def));
+ def->mem.cur_balloon = virDomainDefGetMemoryActual(def);
}
} else if (def->mem.cur_balloon == 0) {
- def->mem.cur_balloon = def->mem.max_balloon;
+ def->mem.cur_balloon = virDomainDefGetMemoryActual(def);
}
/*
}
+/**
+ * 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;
+}
+
+
+/**
+ * virDomainDefGetMemoryActual:
+ * @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
+virDomainDefGetMemoryActual(virDomainDefPtr def)
+{
+ return virDomainDefGetMemoryInitial(def);
+}
+
+
static int
virDomainControllerModelTypeFromString(const virDomainControllerDef *def,
const char *model)
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;
}
if (src->mem.cur_balloon != dst->mem.cur_balloon) {
virBufferAsprintf(buf, " dumpCore='%s'",
virTristateSwitchTypeToString(def->mem.dump_core));
virBufferAsprintf(buf, " unit='KiB'>%llu</memory>\n",
- def->mem.max_balloon);
+ virDomainDefGetMemoryActual(def));
virBufferAsprintf(buf, "<currentMemory unit='KiB'>%llu</currentMemory>\n",
def->mem.cur_balloon);
xmlNodePtr metadata;
};
+unsigned long long virDomainDefGetMemoryInitial(virDomainDefPtr def);
+void virDomainDefSetMemoryInitial(virDomainDefPtr def, unsigned long long size);
+unsigned long long virDomainDefGetMemoryActual(virDomainDefPtr def);
+
typedef enum {
VIR_DOMAIN_TAINT_CUSTOM_ARGV, /* Custom ARGV passthrough from XML */
VIR_DOMAIN_TAINT_CUSTOM_MONITOR, /* Custom monitor commands issued */
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;
virDomainDefFormatInternal;
virDomainDefFree;
virDomainDefGetDefaultEmulator;
+virDomainDefGetMemoryActual;
+virDomainDefGetMemoryInitial;
virDomainDefGetSecurityLabelDef;
virDomainDefHasDeviceAddress;
virDomainDefMaybeAddController;
virDomainDefParseNode;
virDomainDefParseString;
virDomainDefPostParse;
+virDomainDefSetMemoryInitial;
virDomainDeleteConfig;
virDomainDeviceAddressIsValid;
virDomainDeviceAddressTypeToString;
}
}
b_info->sched_params.weight = 1000;
- b_info->max_memkb = def->mem.max_balloon;
+ b_info->max_memkb = virDomainDefGetMemoryInitial(def);
b_info->target_memkb = def->mem.cur_balloon;
if (hvm) {
char bootorder[VIR_DOMAIN_BOOT_LAST + 1];
if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
- ret = vm->def->mem.max_balloon;
+ ret = virDomainDefGetMemoryActual(vm->def);
cleanup:
if (vm)
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);
} else {
/* resize the current memory */
- if (newmem > vm->def->mem.max_balloon) {
+ if (newmem > virDomainDefGetMemoryActual(vm->def)) {
virReportError(VIR_ERR_INVALID_ARG, "%s",
_("cannot set memory higher than max memory"));
goto endjob;
if (!virDomainObjIsActive(vm)) {
info->cpuTime = 0;
info->memory = vm->def->mem.cur_balloon;
- info->maxMem = vm->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(vm->def);
} else {
if (libxl_domain_info(priv->ctx, &d_info, vm->def->id) != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
{
int ret = -1;
- if (virCgroupSetMemory(cgroup, def->mem.max_balloon) < 0)
+ if (virCgroupSetMemory(cgroup, virDomainDefGetMemoryInitial(def)) < 0)
goto cleanup;
if (virMemoryLimitIsSet(def->mem.hard_limit))
}
}
- info->maxMem = vm->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(vm->def);
info->nrVirtCpu = vm->def->vcpus;
ret = 0;
if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
- ret = vm->def->mem.max_balloon;
+ ret = virDomainDefGetMemoryActual(vm->def);
cleanup:
if (vm)
}
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)
unsigned long oldmax = 0;
if (flags & VIR_DOMAIN_AFFECT_LIVE)
- oldmax = vm->def->mem.max_balloon;
+ oldmax = virDomainDefGetMemoryActual(vm->def);
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
- if (!oldmax || oldmax > persistentDef->mem.max_balloon)
- oldmax = persistentDef->mem.max_balloon;
+ if (!oldmax || oldmax > virDomainDefGetMemoryActual(persistentDef))
+ oldmax = virDomainDefGetMemoryActual(persistentDef);
}
if (newmem > oldmax) {
if (STREQ(line, "MemTotal") &&
(virMemoryLimitIsSet(def->mem.hard_limit) ||
- def->mem.max_balloon)) {
+ virDomainDefGetMemoryActual(def))) {
virBufferAsprintf(new_meminfo, "MemTotal: %8llu kB\n",
meminfo.memtotal);
} else if (STREQ(line, "MemFree") &&
(virMemoryLimitIsSet(def->mem.hard_limit) ||
- def->mem.max_balloon)) {
+ virDomainDefGetMemoryActual(def))) {
virBufferAsprintf(new_meminfo, "MemFree: %8llu kB\n",
(meminfo.memtotal - meminfo.memusage));
} else if (STREQ(line, "Buffers")) {
if (lxcConvertSize(value->str, &size) < 0)
return -1;
size = size / 1024;
- def->mem.max_balloon = size;
+ virDomainDefSetMemoryInitial(def, size);
def->mem.hard_limit = virMemoryLimitTruncate(size);
}
}
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;
}
}
- info->maxMem = vm->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(vm->def);
info->memory = vm->def->mem.cur_balloon;
info->nrVirtCpu = vm->def->vcpus;
ret = 0;
info->state = virDomainObjGetState(privdom, NULL);
info->memory = privdom->def->mem.cur_balloon;
- info->maxMem = privdom->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(privdom->def);
info->nrVirtCpu = privdom->def->vcpus;
info->cpuTime = 0;
ret = 0;
/* 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) < 0)
goto error;
return -1;
}
- if (def->mem.max_balloon != def->mem.cur_balloon) {
+ if (virDomainDefGetMemoryActual(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 (virDomainDefGetMemoryActual(def) % (1 << 10) != 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Memory size should be multiple of 1Mb."));
return -1;
prlsdkCheckRetGoto(pret, error);
}
- pret = PrlVmCfg_SetRamSize(sdkdom, def->mem.max_balloon >> 10);
+ pret = PrlVmCfg_SetRamSize(sdkdom, virDomainDefGetMemoryActual(def) >> 10);
prlsdkCheckRetGoto(pret, error);
pret = PrlVmCfg_SetCpuCount(sdkdom, def->vcpus);
LIBSSH2_SESSION *session = phyp_driver->session;
virDomainDef def;
char *managed_system = phyp_driver->managed_system;
+ unsigned long long memory;
/* Flags checked by virDomainDefFormat */
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."));
goto cleanup;
}
- if (!def->mem.max_balloon) {
+ if (!virDomainDefGetMemoryInitial(def)) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("Field <memory> on the domain XML file is missing or "
"has invalid value"));
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,
+ virDomainDefGetMemoryInitial(def),
(int) def->vcpus, virDomainDiskGetSource(def->disks[0]));
ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
* 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;
* space just to be safe (some finer tuning might be
* nice, though).
*/
- memKB = virMemoryLimitIsSet(def->mem.hard_limit) ?
- def->mem.hard_limit : def->mem.max_balloon + 1024 * 1024;
+ if (virMemoryLimitIsSet(def->mem.hard_limit))
+ memKB = def->mem.hard_limit;
+ else
+ memKB = virDomainDefGetMemoryActual(def) + 1024 * 1024;
+
virCommandSetMaxMemLock(cmd, memKB * 1024);
}
}
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;
_("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)
if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
- ret = vm->def->mem.max_balloon;
+ ret = virDomainDefGetMemoryActual(vm->def);
cleanup:
qemuDomObjEndAPI(&vm);
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);
unsigned long oldmax = 0;
if (flags & VIR_DOMAIN_AFFECT_LIVE)
- oldmax = vm->def->mem.max_balloon;
+ oldmax = virDomainDefGetMemoryActual(vm->def);
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
- if (!oldmax || oldmax > persistentDef->mem.max_balloon)
- oldmax = persistentDef->mem.max_balloon;
+ if (!oldmax || oldmax > virDomainDefGetMemoryActual(persistentDef))
+ oldmax = virDomainDefGetMemoryActual(persistentDef);
}
if (newmem > oldmax) {
}
}
- info->maxMem = vm->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(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 = virDomainDefGetMemoryActual(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)) {
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 = virDomainDefGetMemoryActual(vm->def);
} else {
info->memory = balloon;
}
if (dom->def->memballoon &&
dom->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE) {
- cur_balloon = dom->def->mem.max_balloon;
+ cur_balloon = virDomainDefGetMemoryActual(dom->def);
} else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BALLOON_EVENT)) {
cur_balloon = dom->def->mem.cur_balloon;
} else {
&record->nparams,
maxparams,
"balloon.maximum",
- dom->def->mem.max_balloon) < 0)
+ virDomainDefGetMemoryActual(dom->def)) < 0)
return -1;
return 0;
* Kibibytes, but virProcessSetMaxMemLock expects the value in
* bytes.
*/
- memKB = virMemoryLimitIsSet(vm->def->mem.hard_limit)
- ? vm->def->mem.hard_limit
- : vm->def->mem.max_balloon + (1024 * 1024);
+ if (virMemoryLimitIsSet(vm->def->mem.hard_limit))
+ memKB = vm->def->mem.hard_limit;
+ else
+ memKB = virDomainDefGetMemoryActual(vm->def) + (1024 * 1024);
+
virProcessSetMaxMemLock(vm->pid, memKB * 1024);
break;
*/
if (virDomainDefNeedsPlacementAdvice(vm->def)) {
nodeset = virNumaGetAutoPlacementAdvice(vm->def->vcpus,
- vm->def->mem.max_balloon);
+ virDomainDefGetMemoryActual(vm->def));
if (!nodeset)
goto cleanup;
info->state = virDomainObjGetState(privdom, NULL);
info->memory = privdom->def->mem.cur_balloon;
- info->maxMem = privdom->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(privdom->def);
info->nrVirtCpu = privdom->def->vcpus;
info->cpuTime = ((tv.tv_sec * 1000ll * 1000ll * 1000ll) + (tv.tv_usec * 1000ll));
ret = 0;
goto cleanup;
}
- ret = privdom->def->mem.max_balloon;
+ ret = virDomainDefGetMemoryActual(privdom->def);
cleanup:
if (privdom)
}
/* XXX validate not over host memory wrt to other domains */
- privdom->def->mem.max_balloon = memory;
+ virDomainDefSetMemoryInitial(privdom->def, memory);
ret = 0;
cleanup:
goto cleanup;
}
- if (memory > privdom->def->mem.max_balloon) {
+ if (memory > virDomainDefGetMemoryActual(privdom->def)) {
virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto cleanup;
}
if (virDomainGetMaxMemoryEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
- ret = vm->def->mem.max_balloon;
+ ret = virDomainDefGetMemoryActual(vm->def);
cleanup:
if (vm)
goto cleanup;
}
- vm->def->mem.max_balloon = newmax;
+ virDomainDefSetMemoryInitial(vm->def, newmax);
ret = 0;
cleanup:
goto cleanup;
}
- if (newmem > vm->def->mem.max_balloon) {
+ if (newmem > virDomainDefGetMemoryActual(vm->def)) {
virReportError(VIR_ERR_INVALID_ARG, "%s",
_("cannot set memory higher than max memory"));
goto cleanup;
}
}
- info->maxMem = vm->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(vm->def);
info->memory = vm->def->mem.cur_balloon;
info->nrVirtCpu = vm->def->vcpus;
ret = 0;
* 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;
* 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();
info->state = virDomainObjGetState(vm, NULL);
info->cpuTime = 0;
- info->maxMem = vm->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(vm->def);
info->memory = vm->def->mem.cur_balloon;
info->nrVirtCpu = vm->def->vcpus;
ret = 0;
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,
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 > virDomainDefGetMemoryActual(def))
+ def->mem.cur_balloon = virDomainDefGetMemoryActual(def);
/* vmx:sched.mem.minsize -> def:mem.min_guarantee */
if (virVMXGetConfigLong(conf, "sched.mem.minsize", &sched_mem_minsize, 0,
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 > virDomainDefGetMemoryActual(def))
+ def->mem.min_guarantee = virDomainDefGetMemoryActual(def);
/* vmx:numvcpus -> def:vcpus */
if (virVMXGetConfigLong(conf, "numvcpus", &numvcpus, 1, true) < 0)
/* 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(virDomainDefGetMemoryActual(def), 4096) * 4096;
virBufferAsprintf(&buffer, "memsize = \"%llu\"\n",
max_balloon / 1024); /* Scale from kilobytes to megabytes */
goto error;
memset(info, 0, sizeof(virDomainInfo));
- info->maxMem = entry->def->mem.max_balloon;
+ info->maxMem = virDomainDefGetMemoryActual(entry->def);
info->memory = entry->def->mem.cur_balloon;
info->nrVirtCpu = entry->def->vcpus;
info->state = VIR_DOMAIN_SHUTOFF;
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 > virDomainDefGetMemoryActual(entry->def))
+ entry->def->mem.cur_balloon = virDomainDefGetMemoryActual(entry->def);
/* If this fails, should we try to undo our changes to the
* in-memory representation of the config file. I say not!
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!
*/
if (!(entry = virHashLookup(priv->configCache, filename)))
goto cleanup;
- ret = entry->def->mem.max_balloon;
+ ret = virDomainDefGetMemoryActual(entry->def);
cleanup:
xenUnifiedUnlock(priv);
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 {
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 (virDomainDefGetMemoryActual(def))
+ (*record)->memory_dynamic_max = (int64_t) (virDomainDefGetMemoryActual(def) * 1024);
else
(*record)->memory_dynamic_max = (*record)->memory_static_max;
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;
}
xenFormatMem(virConfPtr conf, virDomainDefPtr def)
{
if (xenConfigSetInt(conf, "maxmem",
- VIR_DIV_UP(def->mem.max_balloon, 1024)) < 0)
+ VIR_DIV_UP(virDomainDefGetMemoryActual(def), 1024)) < 0)
return -1;
if (xenConfigSetInt(conf, "memory",
}
}
- 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 > virDomainDefGetMemoryActual(def))
+ def->mem.cur_balloon = virDomainDefGetMemoryActual(def);
if (cpus != NULL) {
if (virBitmapParse(cpus, 0, &def->cpumask,
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(virDomainDefGetMemoryActual(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. */