[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 3/5] setmaxmem: implement the code to address the new API in the qemu driver



This patch implements the code to address the new API
(virDomainSetMaxMemoryFlags) and virDomainSetMaxMemory API
in the qemu driver.



Signed-off-by: Taku Izumi <izumi taku jp fujitsu com>
---
 src/qemu/qemu_driver.c |   63 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 61 insertions(+), 2 deletions(-)

Index: libvirt/src/qemu/qemu_driver.c
===================================================================
--- libvirt.orig/src/qemu/qemu_driver.c
+++ libvirt/src/qemu/qemu_driver.c
@@ -1569,6 +1569,65 @@ cleanup:
     return ret;
 }

+static int qemudDomainSetMaxMemoryFlags(virDomainPtr dom, unsigned long memory,
+                                        unsigned int flags) {
+
+    struct qemud_driver *driver = dom->conn->privateData;
+    virDomainObjPtr vm = NULL;
+    virDomainDefPtr persistentDef = NULL;
+    int ret = -1;
+
+    virCheckFlags(VIR_DOMAIN_MEM_LIVE |
+                  VIR_DOMAIN_MEM_CONFIG, -1);
+
+    if (flags & VIR_DOMAIN_MEM_LIVE) {
+	qemuReportError(VIR_ERR_OPERATION_INVALID,
+                        _("cannot resize the maximum memory on active domain"));
+        goto cleanup;
+    }
+
+    qemuDriverLock(driver);
+    vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+    qemuDriverUnlock(driver);
+    if (!vm) {
+	char uuidstr[VIR_UUID_STRING_BUFLEN];
+        virUUIDFormat(dom->uuid, uuidstr);
+        qemuReportError(VIR_ERR_NO_DOMAIN,
+                        _("no domain with matching uuid '%s'"), uuidstr);
+        goto cleanup;
+    }
+
+    if (qemuDomainObjBeginJob(vm) < 0)
+        goto cleanup;
+
+    if (flags & VIR_DOMAIN_MEM_CONFIG) {
+        persistentDef = virDomainObjGetPersistentDef(driver->caps, vm);
+        if (!persistentDef)
+            goto endjob;
+
+        persistentDef->mem.max_balloon = memory;
+        if (persistentDef->mem.cur_balloon > memory)
+            persistentDef->mem.cur_balloon = memory;
+
+        ret = virDomainSaveConfig(driver->configDir, persistentDef);
+        goto endjob;
+    }
+
+endjob:
+    if (qemuDomainObjEndJob(vm) == 0)
+        vm = NULL;
+
+cleanup:
+    if (vm)
+        virDomainObjUnlock(vm);
+    return ret;
+
+}
+
+static int qemudDomainSetMaxMemory(virDomainPtr dom, unsigned long memory) {
+	return qemudDomainSetMaxMemoryFlags(dom, memory, VIR_DOMAIN_MEM_LIVE);
+}
+
 static int qemudDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
                                      unsigned int flags) {
     struct qemud_driver *driver = dom->conn->privateData;
@@ -7044,8 +7103,8 @@ static virDriver qemuDriver = {
     qemudDomainDestroy, /* domainDestroy */
     qemudDomainGetOSType, /* domainGetOSType */
     qemudDomainGetMaxMemory, /* domainGetMaxMemory */
-    NULL, /* domainSetMaxMemory */
-    NULL, /* domainSetMaxMemoryFlags */
+    qemudDomainSetMaxMemory, /* domainSetMaxMemory */
+    qemudDomainSetMaxMemoryFlags, /* domainSetMaxMemoryFlags */
     qemudDomainSetMemory, /* domainSetMemory */
     qemudDomainSetMemoryFlags, /* domainSetMemoryFlags */
     qemuDomainSetMemoryParameters, /* domainSetMemoryParameters */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]