From: Chen Hanxiao <chenhanx...@cn.fujitsu.com> Enable systemd to set/show limit of memory+Swap usage.
Signed-off-by: Chen Hanxiao <chenhanx...@cn.fujitsu.com> --- src/core/cgroup.c | 11 +++++++++++ src/core/cgroup.h | 1 + src/core/dbus-cgroup.c | 18 ++++++++++++++++++ src/core/load-fragment-gperf.gperf.m4 | 1 + 4 files changed, 31 insertions(+) diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 1f41efc..d8bc318 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -34,6 +34,7 @@ void cgroup_context_init(CGroupContext *c) { c->cpu_shares = 1024; c->memory_limit = c->memory_soft_limit = (uint64_t) -1; + c->memsw_limit = (uint64_t) -1; c->blockio_weight = 1000; } @@ -266,6 +267,15 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha if (r < 0) log_error("Failed to set memory.limit_in_bytes on %s: %s", path, strerror(-r)); + if (c->memsw_limit != (uint64_t) -1) { + sprintf(buf, "%" PRIu64 "\n", c->memsw_limit); + r = cg_set_attribute("memory", path, "memory.memsw.limit_in_bytes", buf); + } else + r = cg_set_attribute("memory", path, "memory.memsw.limit_in_bytes", "-1"); + + if (r < 0) + log_error("Failed to set memory.memsw.limit_in_bytes on %s: %s", path, strerror(-r)); + if (c->memory_soft_limit != (uint64_t) -1) { sprintf(buf, "%" PRIu64 "\n", c->memory_soft_limit); r = cg_set_attribute("memory", path, "memory.soft_limit_in_bytes", buf); @@ -337,6 +347,7 @@ CGroupControllerMask cgroup_context_get_mask(CGroupContext *c) { if (c->memory_accounting || c->memory_limit != (uint64_t) -1 || + c->memsw_limit != (uint64_t) -1 || c->memory_soft_limit != (uint64_t) -1) mask |= CGROUP_MEMORY; diff --git a/src/core/cgroup.h b/src/core/cgroup.h index 786bd71..3519061 100644 --- a/src/core/cgroup.h +++ b/src/core/cgroup.h @@ -77,6 +77,7 @@ struct CGroupContext { LIST_HEAD(CGroupBlockIODeviceBandwidth, blockio_device_bandwidths); uint64_t memory_limit; + uint64_t memsw_limit; uint64_t memory_soft_limit; CGroupDevicePolicy device_policy; diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 1f2a396..8235da0 100644 --- a/src/core/dbus-cgroup.c +++ b/src/core/dbus-cgroup.c @@ -133,6 +133,7 @@ const BusProperty bus_cgroup_context_properties[] = { { "BlockIOWriteBandwidth", bus_cgroup_append_device_bandwidths, "a(st)", 0 }, { "MemoryAccounting", bus_property_append_bool, "b", offsetof(CGroupContext, memory_accounting) }, { "MemoryLimit", bus_property_append_uint64, "t", offsetof(CGroupContext, memory_limit) }, + { "MemorySWLimit", bus_property_append_uint64, "t", offsetof(CGroupContext, memsw_limit) }, { "MemorySoftLimit", bus_property_append_uint64, "t", offsetof(CGroupContext, memory_soft_limit) }, { "DevicePolicy", bus_cgroup_append_device_policy, "s", offsetof(CGroupContext, device_policy) }, { "DeviceAllow", bus_cgroup_append_device_allow, "a(ss)", 0 }, @@ -438,6 +439,23 @@ int bus_cgroup_set_property( return 1; + } else if (streq(name, "MemorySWLimit")) { + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_UINT64) + return -EINVAL; + + if (mode != UNIT_CHECK) { + uint64_t limit; + + dbus_message_iter_get_basic(i, &limit); + + c->memsw_limit = limit; + + unit_write_drop_in_private_format(u, mode, name, "%s=%" PRIu64, name, limit); + } + + return 1; + } else if (streq(name, "DevicePolicy")) { const char *policy; CGroupDevicePolicy p; diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4 index 33c6880..0471cae 100644 --- a/src/core/load-fragment-gperf.gperf.m4 +++ b/src/core/load-fragment-gperf.gperf.m4 @@ -89,6 +89,7 @@ $1.CPUAccounting, config_parse_bool, 0, $1.CPUShares, config_parse_cpu_shares, 0, offsetof($1, cgroup_context) $1.MemoryAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.memory_accounting) $1.MemoryLimit, config_parse_memory_limit, 0, offsetof($1, cgroup_context) +$1.MemorySWLimit, config_parse_memory_limit, 0, offsetof($1, cgroup_context) $1.MemorySoftLimit, config_parse_memory_limit, 0, offsetof($1, cgroup_context) $1.DeviceAllow, config_parse_device_allow, 0, offsetof($1, cgroup_context) $1.DevicePolicy, config_parse_device_policy, 0, offsetof($1, cgroup_context.device_policy) -- 1.8.2.1 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel