On Mon, 23.09.13 14:30, Gao feng (gaof...@cn.fujitsu.com) wrote: > Some programs need to set the memory.use_hierarchy(such as libvirt), > Add this feature.
As mentioned already: this really shouldn't be configurable but simply the unconditional configuration that systemd requires. I have hence now commited a different patch that strictly enables this option at boot-time in the root memory hierarchy and does not turn this into yet another user config switch. THis is what Tejun suggested to do and is also what makes the most sense to me. cgroups after all are organized logically in a tree and it is simply contradictory ignore this all and pretend everything was flat... > --- > 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) Lennart -- Lennart Poettering - Red Hat, Inc. _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel