---
src/libxl/libxl_driver.c | 131 ++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 127 insertions(+), 4 deletions(-)
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 49fc90f..32bf12e 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -1166,6 +1166,109 @@ cleanup:
return ret;
}
+static unsigned long
+libxlDomainGetMaxMemory(virDomainPtr dom)
+{
+ libxlDriverPrivatePtr driver = dom->conn->privateData;
+ virDomainObjPtr vm;
+ unsigned long ret = 0;
+
+ libxlDriverLock(driver);
+ vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ libxlDriverUnlock(driver);
+
+ if (!vm) {
+ libxlError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching
uuid"));
+ goto cleanup;
+ }
+ ret = vm->def->mem.max_balloon;
+
+cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ return ret;
+}
+
+static int
+libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory,
+ unsigned int flags)
+{
+ libxlDriverPrivatePtr driver = dom->conn->privateData;
+ libxlDomainObjPrivatePtr priv;
+ virDomainObjPtr vm;
+ virDomainDefPtr def = NULL;
+ 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);
+ }
+
+ libxlDriverLock(driver);
+ vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ libxlDriverUnlock(driver);
+
+ if (!vm) {
+ libxlError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching
uuid"));
+ goto cleanup;
+ }
+
+ if (memory > vm->def->mem.max_balloon) {
+ libxlError(VIR_ERR_INVALID_ARG, "%s",
+ _("cannot set memory higher than max memory"));
+ goto cleanup;
+ }
+
+ if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_MEM_LIVE)) {
+ libxlError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("cannot set memory on an inactive domain"));
+ goto cleanup;
+ }
+
+ if (flags & VIR_DOMAIN_MEM_CONFIG) {
+ if (!vm->persistent) {
+ libxlError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("cannot change persistent config of a transient
domain"));
+ goto cleanup;
+ }
+ if (!(def = virDomainObjGetPersistentDef(driver->caps, vm)))
+ goto cleanup;
+ }
+
+ if (flags & VIR_DOMAIN_MEM_LIVE) {
+ priv = vm->privateData;
+
+ 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);
+ goto cleanup;
+ }
+ }
+
+ ret = 0;
+
+ if (flags & VIR_DOMAIN_MEM_CONFIG) {
+ def->mem.cur_balloon = memory;
+ ret = virDomainSaveConfig(driver->configDir, def);
+ }
+
+cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ return ret;
+}
+
+static int
+libxlDomainSetMemory(virDomainPtr dom, unsigned long memory)
+{
+ return libxlDomainSetMemoryFlags(dom, memory, VIR_DOMAIN_MEM_LIVE);
+}
+
static int
libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
{
@@ -1725,6 +1828,26 @@ libxlDomainEventDeregister(virConnectPtr conn,
return ret;
}
+static unsigned long long
+libxlNodeGetFreeMemory(virConnectPtr conn)
+{
+ libxl_physinfo phy_info;
+ const libxl_version_info* ver_info;
+ libxlDriverPrivatePtr driver = conn->privateData;
+
+ if (libxl_get_physinfo(&driver->ctx, &phy_info)) {
+ libxlError(VIR_ERR_INTERNAL_ERROR, _("libxl_get_physinfo_info
failed"));
+ return 0;
+ }
+
+ if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
+ libxlError(VIR_ERR_INTERNAL_ERROR, _("libxl_get_version_info
failed"));
+ return 0;
+ }
+
+ return phy_info.free_pages * ver_info->pagesize;
+}
+
static int
libxlDomainIsActive(virDomainPtr dom)
{
@@ -1834,10 +1957,10 @@ static virDriver libxlDriver = {
libxlDomainReboot, /* domainReboot */
libxlDomainDestroy, /* domainDestroy */
NULL, /* domainGetOSType */
- NULL, /* domainGetMaxMemory */
+ libxlDomainGetMaxMemory, /* domainGetMaxMemory */
NULL, /* domainSetMaxMemory */
- NULL, /* domainSetMemory */
- NULL, /* domainSetMemoryFlags */
+ libxlDomainSetMemory, /* domainSetMemory */
+ libxlDomainSetMemoryFlags, /* domainSetMemoryFlags */
NULL, /* domainSetMemoryParameters */
NULL, /* domainGetMemoryParameters */
NULL, /* domainSetBlkioParameters */
@@ -1883,7 +2006,7 @@ static virDriver libxlDriver = {
NULL, /* domainMemoryPeek */
NULL, /* domainGetBlockInfo */
NULL, /* nodeGetCellsFreeMemory */
- NULL, /* getFreeMemory */
+ libxlNodeGetFreeMemory, /* getFreeMemory */
libxlDomainEventRegister, /* domainEventRegister */
libxlDomainEventDeregister, /* domainEventDeregister */
NULL, /* domainMigratePrepare2 */
--
1.7.4.1