On Mon, May 30, 2011 at 11:53:03AM +0200, Markus Groß wrote:
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 */
ACK, it's god to align the xen driver with qemu one here,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/