Add support to set the maximum memory of the domain. Also add support to change the memory of the current state of the domain, which translates to a running domain or the config of the domain. Based on the code from the qemu driver. --- src/libxl/libxl_driver.c | 101 +++++++++++++++++++++++++++++++++------------- 1 files changed, 73 insertions(+), 28 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 0a2401a..3491f40 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1493,22 +1493,19 @@ cleanup: } static int -libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory, +libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; libxlDomainObjPrivatePtr priv; virDomainObjPtr vm; - virDomainDefPtr def = NULL; + virDomainDefPtr persistentDef = NULL; + bool isActive; int ret = -1; virCheckFlags(VIR_DOMAIN_MEM_LIVE | - VIR_DOMAIN_MEM_CONFIG, -1); - - if ((flags & (VIR_DOMAIN_MEM_LIVE | VIR_DOMAIN_MEM_CONFIG)) == 0) { - libxlError(VIR_ERR_INVALID_ARG, - _("invalid flag combination: (0x%x)"), flags); - } + VIR_DOMAIN_MEM_CONFIG | + VIR_DOMAIN_MEM_MAXIMUM, -1); libxlDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -1519,13 +1516,22 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory, goto cleanup; } - if (memory > vm->def->mem.max_balloon) { - libxlError(VIR_ERR_INVALID_ARG, "%s", - _("cannot set memory higher than max memory")); - goto cleanup; + isActive = virDomainObjIsActive(vm); + + if (flags == VIR_DOMAIN_MEM_CURRENT) { + if (isActive) + flags = VIR_DOMAIN_MEM_LIVE; + else + flags = VIR_DOMAIN_MEM_CONFIG; + } + if (flags == VIR_DOMAIN_MEM_MAXIMUM) { + if (isActive) + flags = VIR_DOMAIN_MEM_LIVE | VIR_DOMAIN_MEM_MAXIMUM; + else + flags = VIR_DOMAIN_MEM_CONFIG | VIR_DOMAIN_MEM_MAXIMUM; } - if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_MEM_LIVE)) { + if (!isActive && (flags & VIR_DOMAIN_MEM_LIVE)) { libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("cannot set memory on an inactive domain")); goto cleanup; @@ -1537,31 +1543,63 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory, _("cannot change persistent config of a transient domain")); goto cleanup; } - if (!(def = virDomainObjGetPersistentDef(driver->caps, vm))) + if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm))) goto cleanup; } - if (flags & VIR_DOMAIN_MEM_LIVE) { - priv = vm->privateData; + if (flags & VIR_DOMAIN_MEM_MAXIMUM) { + /* resize the maximum memory */ - if (libxl_set_memory_target(&priv->ctx, dom->id, memory, 0, - /* force */ 1) < 0) { - libxlError(VIR_ERR_INTERNAL_ERROR, - _("Failed to set memory for domain '%d'" - " with libxenlight"), dom->id); + if (flags & VIR_DOMAIN_MEM_LIVE) { + priv = vm->privateData; + if (libxl_domain_setmaxmem(&priv->ctx, dom->id, newmem) < 0) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Failed to set maximum memory for domain '%d'" + " with libxenlight"), dom->id); + goto cleanup; + } + } + + if (flags & VIR_DOMAIN_MEM_CONFIG) { + /* Help clang 2.8 decipher the logic flow. */ + sa_assert(persistentDef); + persistentDef->mem.max_balloon = newmem; + if (persistentDef->mem.cur_balloon > newmem) + persistentDef->mem.cur_balloon = newmem; + ret = virDomainSaveConfig(driver->configDir, persistentDef); goto cleanup; } - } - ret = 0; + } else { + /* resize the current memory */ - if (flags & VIR_DOMAIN_MEM_CONFIG) { - /* clang 2.9 needs an extra hint. */ - sa_assert(def); - def->mem.cur_balloon = memory; - ret = virDomainSaveConfig(driver->configDir, def); + if (newmem > vm->def->mem.max_balloon) { + libxlError(VIR_ERR_INVALID_ARG, "%s", + _("cannot set memory higher than max memory")); + goto cleanup; + } + + if (flags & VIR_DOMAIN_MEM_LIVE) { + priv = vm->privateData; + if (libxl_set_memory_target(&priv->ctx, dom->id, newmem, 0, + /* force */ 1) < 0) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Failed to set memory for domain '%d'" + " with libxenlight"), dom->id); + goto cleanup; + } + } + + if (flags & VIR_DOMAIN_MEM_CONFIG) { + sa_assert(persistentDef); + persistentDef->mem.cur_balloon = newmem; + ret = virDomainSaveConfig(driver->configDir, persistentDef); + goto cleanup; + } } + ret = 0; + cleanup: if (vm) virDomainObjUnlock(vm); @@ -1575,6 +1613,12 @@ libxlDomainSetMemory(virDomainPtr dom, unsigned long memory) } static int +libxlDomainSetMaxMemory(virDomainPtr dom, unsigned long memory) +{ + return libxlDomainSetMemoryFlags(dom, memory, VIR_DOMAIN_MEM_MAXIMUM); +} + +static int libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -3552,6 +3596,7 @@ static virDriver libxlDriver = { .domainDestroy = libxlDomainDestroy, /* 0.9.0 */ .domainGetOSType = libxlDomainGetOSType, /* 0.9.0 */ .domainGetMaxMemory = libxlDomainGetMaxMemory, /* 0.9.0 */ + .domainSetMaxMemory = libxlDomainSetMaxMemory, /* 0.9.2 */ .domainSetMemory = libxlDomainSetMemory, /* 0.9.0 */ .domainSetMemoryFlags = libxlDomainSetMemoryFlags, /* 0.9.0 */ .domainGetInfo = libxlDomainGetInfo, /* 0.9.0 */ -- 1.7.5.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list