Some programs need to set the memory.use_hierarchy(such as libvirt), Add this feature. --- src/core/cgroup.c | 6 ++++++ src/core/cgroup.h | 1 + src/core/dbus-cgroup.c | 16 ++++++++++++++++ src/core/load-fragment-gperf.gperf.m4 | 1 + 4 files changed, 24 insertions(+)
diff --git a/src/core/cgroup.c b/src/core/cgroup.c index d10f205..68615c3 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -32,6 +32,7 @@ void cgroup_context_init(CGroupContext *c) { /* Initialize everything to the kernel defaults, assuming the * structure is preinitialized to 0 */ + c->memory_hierarchy = true; c->cpu_shares = 1024; c->memory_limit = (uint64_t) -1; c->blockio_weight = 1000; @@ -263,6 +264,11 @@ 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)); + + r = cg_set_attribute("memory", path, "memory.use_hierarchy", c->memory_hierarchy ? "1" : "0"); + + if (r < 0) + log_error("Failed to set memory.use_hierarchy on %s: %s", path, strerror(-r)); } if (mask & CGROUP_DEVICE) { diff --git a/src/core/cgroup.h b/src/core/cgroup.h index 0a079e9..f87c16a 100644 --- a/src/core/cgroup.h +++ b/src/core/cgroup.h @@ -69,6 +69,7 @@ struct CGroupContext { bool cpu_accounting; bool blockio_accounting; bool memory_accounting; + bool memory_hierarchy; unsigned long cpu_shares; diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 9ebcad9..a8a5f81 100644 --- a/src/core/dbus-cgroup.c +++ b/src/core/dbus-cgroup.c @@ -132,6 +132,7 @@ const BusProperty bus_cgroup_context_properties[] = { { "BlockIOReadBandwidth", bus_cgroup_append_device_bandwidths, "a(st)", 0 }, { "BlockIOWriteBandwidth", bus_cgroup_append_device_bandwidths, "a(st)", 0 }, { "MemoryAccounting", bus_property_append_bool, "b", offsetof(CGroupContext, memory_accounting) }, + { "MemoryHierarchy", bus_property_append_bool, "b", offsetof(CGroupContext, memory_hierarchy) }, { "MemoryLimit", bus_property_append_uint64, "t", offsetof(CGroupContext, memory_limit) }, { "DevicePolicy", bus_cgroup_append_device_policy, "s", offsetof(CGroupContext, device_policy) }, { "DeviceAllow", bus_cgroup_append_device_allow, "a(ss)", 0 }, @@ -417,6 +418,21 @@ int bus_cgroup_set_property( return 1; + } else if (streq(name, "MemoryHierarchy")) { + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_BOOLEAN) + return -EINVAL; + + if (mode != UNIT_CHECK) { + dbus_bool_t b; + dbus_message_iter_get_basic(i, &b); + + c->memory_hierarchy = b; + unit_write_drop_in_private(u, mode, name, b ? "MemoryHierarchy=yes" : "MemoryHierarchy=no"); + } + + return 1; + } else if (streq(name, "MemoryLimit")) { if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_UINT64) diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4 index 25bd3aa..b43ca05 100644 --- a/src/core/load-fragment-gperf.gperf.m4 +++ b/src/core/load-fragment-gperf.gperf.m4 @@ -88,6 +88,7 @@ m4_define(`CGROUP_CONTEXT_CONFIG_ITEMS', $1.CPUAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.cpu_accounting) $1.CPUShares, config_parse_cpu_shares, 0, offsetof($1, cgroup_context) $1.MemoryAccounting, config_parse_bool, 0, offsetof($1, cgroup_context.memory_accounting) +$1.MemoryHierarchy, config_parse_bool, 0, offsetof($1, cgroup_context.memory_hierarchy) $1.MemoryLimit, 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.3.1 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel