diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 1785e150c73c791c1d96fd1d7fb1f6fcfe136cc4..ecc63ded2d4d0ddeee688a74d155b5289e37e276 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -607,6 +607,42 @@ lxcIdmapWalkCallback(const char *name, virConfValuePtr value, void *data) return 0; } +static int +lxcSetMemTune(virDomainDefPtr def, virConfPtr properties) +{ + virConfValuePtr value; + unsigned long long size = 0; + + if ((value = virConfGetValue(properties, + "lxc.cgroup.memory.limit_in_bytes")) && + value->str && STRNEQ(value->str, "-1")) { + if (lxcConvertSize(value->str, &size) < 0) + return -1; + size = size / 1024; + def->mem.max_balloon = size; + def->mem.hard_limit = size; + } + + if ((value = virConfGetValue(properties, + "lxc.cgroup.memory.soft_limit_in_bytes")) && + value->str && STRNEQ(value->str, "-1")) { + if (lxcConvertSize(value->str, &size) < 0) + return -1; + + def->mem.soft_limit = size / 1024; + } + + if ((value = virConfGetValue(properties, + "lxc.cgroup.memory.memsw.limit_in_bytes")) && + value->str && STRNEQ(value->str, "-1")) { + if (lxcConvertSize(value->str, &size) < 0) + return -1; + + def->mem.swap_hard_limit = size / 1024; + } + return 0; +} + virDomainDefPtr lxcParseConfigString(const char *config) { @@ -679,6 +715,10 @@ lxcParseConfigString(const char *config) if (virConfWalk(properties, lxcIdmapWalkCallback, vmdef) < 0) goto error; + /* lxc.cgroup.memory.* */ + if (lxcSetMemTune(vmdef, properties) < 0) + goto error; + goto cleanup; error: diff --git a/tests/lxcconf2xmldata/lxcconf2xml-memtune.config b/tests/lxcconf2xmldata/lxcconf2xml-memtune.config new file mode 100644 index 0000000000000000000000000000000000000000..ef07a5143d3fde66b65c99523d7dde65828b00ca --- /dev/null +++ b/tests/lxcconf2xmldata/lxcconf2xml-memtune.config @@ -0,0 +1,10 @@ +lxc.rootfs = /var/lib/lxc/migrate_test/rootfs +lxc.utsname = migrate_test +lxc.autodev=1 + +# 1GiB +lxc.cgroup.memory.limit_in_bytes = 1073741824 +# 128MiB +lxc.cgroup.memory.soft_limit_in_bytes = 134217728 +# 2GiB +lxc.cgroup.memory.memsw.limit_in_bytes = 2147483648 diff --git a/tests/lxcconf2xmldata/lxcconf2xml-memtune.xml b/tests/lxcconf2xmldata/lxcconf2xml-memtune.xml new file mode 100644 index 0000000000000000000000000000000000000000..026435674852cf147f5567e9c007c381a3c3b6f0 --- /dev/null +++ b/tests/lxcconf2xmldata/lxcconf2xml-memtune.xml @@ -0,0 +1,29 @@ + + migrate_test + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 1048576 + 0 + + 1048576 + 131072 + 2097152 + + 1 + + exe + /sbin/init + + + + + + destroy + restart + destroy + + + + + + + diff --git a/tests/lxcconf2xmltest.c b/tests/lxcconf2xmltest.c index 7042bdf11b7d9894bf36d689a710c76109edbbc4..3dd0a0bcf9388e59471bc67452a43d3dc2730f8c 100644 --- a/tests/lxcconf2xmltest.c +++ b/tests/lxcconf2xmltest.c @@ -109,6 +109,7 @@ mymain(void) DO_TEST("physnetwork", false); DO_TEST("macvlannetwork", false); DO_TEST("idmap", false); + DO_TEST("memtune", false); return ret; }