From: Nikunj A. Dadhania nik...@linux.vnet.ibm.com
Driver interface for setting memory hard_limit, soft_limit and swap
hard_limit.
v4:
+ prototype change: include unsigned int flags arg
v2:
+ Use #define string constants for hard_limit, etc.
+ fix typo: min_guarantee
Acked-by: Daniel P. Berrange berra...@redhat.com
Signed-off-by: Nikunj A. Dadhania nik...@linux.vnet.ibm.com
---
src/qemu/qemu_driver.c | 95 +++-
1 files changed, 94 insertions(+), 1 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index bf4373a..471db39 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -9365,6 +9365,99 @@ cleanup:
return ret;
}
+
+static int qemuDomainSetMemoryParameters(virDomainPtr dom,
+ virMemoryParameterPtr params,
+ int nparams,
+ unsigned int flags ATTRIBUTE_UNUSED)
+{
+struct qemud_driver *driver = dom-conn-privateData;
+int i;
+virCgroupPtr group = NULL;
+virDomainObjPtr vm = NULL;
+int ret = -1;
+
+qemuDriverLock(driver);
+if (!qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_MEMORY)) {
+qemuReportError(VIR_ERR_NO_SUPPORT,
+__FUNCTION__);
+goto cleanup;
+}
+
+vm = virDomainFindByUUID(driver-domains, dom-uuid);
+
+if (vm == NULL) {
+qemuReportError(VIR_ERR_INTERNAL_ERROR,
+_(No such domain %s), dom-uuid);
+goto cleanup;
+}
+
+if (virCgroupForDomain(driver-cgroup, vm-def-name, group, 0) != 0) {
+qemuReportError(VIR_ERR_INTERNAL_ERROR,
+_(cannot find cgroup for domain %s), vm-def-name);
+goto cleanup;
+}
+
+for (i = 0; i nparams; i++) {
+virMemoryParameterPtr param = params[i];
+
+if (STREQ(param-field, VIR_DOMAIN_MEMORY_HARD_LIMIT)) {
+int rc;
+if (param-type != VIR_DOMAIN_MEMORY_FIELD_ULLONG) {
+qemuReportError(VIR_ERR_INVALID_ARG, %s,
+_(invalid type for memory hard_limit tunable,
expected a 'ullong'));
+continue;
+}
+
+rc = virCgroupSetMemoryHardLimit(group, params[i].value.ul);
+if (rc != 0) {
+virReportSystemError(-rc, %s,
+ _(unable to set memory hard_limit
tunable));
+}
+} else if (STREQ(param-field, VIR_DOMAIN_MEMORY_SOFT_LIMIT)) {
+int rc;
+if (param-type != VIR_DOMAIN_MEMORY_FIELD_ULLONG) {
+qemuReportError(VIR_ERR_INVALID_ARG, %s,
+_(invalid type for memory soft_limit tunable,
expected a 'ullong'));
+continue;
+}
+
+rc = virCgroupSetMemorySoftLimit(group, params[i].value.ul);
+if (rc != 0) {
+virReportSystemError(-rc, %s,
+ _(unable to set memory soft_limit
tunable));
+}
+} else if (STREQ(param-field, VIR_DOMAIN_SWAP_HARD_LIMIT)) {
+int rc;
+if (param-type != VIR_DOMAIN_MEMORY_FIELD_ULLONG) {
+qemuReportError(VIR_ERR_INVALID_ARG, %s,
+_(invalid type for swap_hard_limit tunable,
expected a 'ullong'));
+continue;
+}
+
+rc = virCgroupSetSwapHardLimit(group, params[i].value.ul);
+if (rc != 0) {
+virReportSystemError(-rc, %s,
+ _(unable to set swap_hard_limit
tunable));
+}
+} else if (STREQ(param-field, VIR_DOMAIN_MEMORY_MIN_GUARANTEE)) {
+qemuReportError(VIR_ERR_INVALID_ARG,
+_(Memory tunable `%s' not implemented),
param-field);
+} else {
+qemuReportError(VIR_ERR_INVALID_ARG,
+_(Parameter `%s' not supported), param-field);
+}
+}
+ret = 0;
+
+cleanup:
+virCgroupFree(group);
+if (vm)
+virDomainObjUnlock(vm);
+qemuDriverUnlock(driver);
+return ret;
+}
+
static int qemuSetSchedulerParameters(virDomainPtr dom,
virSchedParameterPtr params,
int nparams)
@@ -12710,7 +12803,7 @@ static virDriver qemuDriver = {
qemuDomainRevertToSnapshot, /* domainRevertToSnapshot */
qemuDomainSnapshotDelete, /* domainSnapshotDelete */
qemuDomainMonitorCommand, /* qemuDomainMonitorCommand */
-NULL, /* domainSetMemoryParameters */
+qemuDomainSetMemoryParameters, /* domainSetMemoryParameters */
NULL, /* domainGetMemoryParameters */
};
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list