From: Weng Meiling <wengmeiling.w...@huawei.com> After setting memory.limit_in_bytes and memory.memsw.limit_in_bytes, use cgsnapshot -f to save the current cgroup configure, then use cgconfigparser to resume it according the configure file, but it failed.
The steps: $ cgsnapshot -s memory -f config $ cat config mount { memory = /cgroup/memory; } group test { memory { memory.memsw.failcnt="0"; memory.memsw.limit_in_bytes="2097152"; memory.memsw.max_usage_in_bytes="0"; memory.oom_control="oom_kill_disable 0 under_oom 0"; memory.move_charge_at_immigrate="0"; memory.swappiness="60"; memory.use_hierarchy="0"; memory.force_empty=""; memory.failcnt="0"; memory.soft_limit_in_bytes="18446744073709551615"; memory.limit_in_bytes="1048576"; memory.max_usage_in_bytes="0"; } } $ cgclear $ cgconfigparser -l config /usr/sbin/cgconfigparser; error loading config: Failed to remove a non-empty group cgconfigparser failed because the memory.memsw.limit_in_bytes is setted before memory.limit_in_bytes, when setting memory.memsw.limit_in_bytes, memory.limit_in_bytes is still the default value 18446744073709551615, so it failed. This patch fixes the problem. It makes cgconfigparser command set memory.limit_in_bytes before memory.memsw.limit_in_bytes. v2 --> v3 have the ordering hardcoded into the code. Signed-off-by: Weng Meiling <wengmeiling.w...@huawei.com> --- src/config.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index ac844a7..ffaea33 100644 --- a/src/config.c +++ b/src/config.c @@ -726,10 +726,49 @@ out_err: static int cgroup_config_create_groups(void) { int error = 0; - int i; + int i, j, k; for (i = 0; i < cgroup_table_index; i++) { struct cgroup *cgroup = &config_cgroup_table[i]; + /* + * ensure memory.memsw.limit_in_bytes will be set before + * memory.limit_in_bytes to avoid cgconfigparser fail. + */ + for (j = 0; j < cgroup->index; j++) { + if (!strcmp(cgroup->controller[j]->name, "memory")) { + int mem_idx = 0; + int memsw_idx = 0; + char name[FILENAME_MAX], value[CG_VALUE_MAX]; + + for (k = 0; k < cgroup->controller[j]->index; k++) + if (!strcmp(cgroup->controller[j]->values[k]->name, + "memory.limit_in_bytes")) + mem_idx = k; + else if (!strcmp(cgroup->controller[j]->values[k]->name, + "memory.memsw.limit_in_bytes")) + memsw_idx = k; + if (memsw_idx && (mem_idx > memsw_idx)) { + memset(name, 0, FILENAME_MAX); + memset(value, 0, CG_VALUE_MAX); + strncpy(name, + cgroup->controller[j]->values[mem_idx]->name, + FILENAME_MAX); + strncpy(value, + cgroup->controller[j]->values[mem_idx]->value, + CG_VALUE_MAX); + strncpy(cgroup->controller[j]->values[mem_idx]->name, + cgroup->controller[j]->values[memsw_idx]->name, + FILENAME_MAX); + strncpy(cgroup->controller[j]->values[mem_idx]->value, + cgroup->controller[j]->values[memsw_idx]->value, + CG_VALUE_MAX); + strncpy(cgroup->controller[j]->values[memsw_idx]->name, + name, FILENAME_MAX); + strncpy(cgroup->controller[j]->values[memsw_idx]->value, + value, CG_VALUE_MAX); + } + } + } error = cgroup_create_cgroup(cgroup, 0); cgroup_dbg("creating group %s, error %d\n", cgroup->name, error); -- 1.8.3 ------------------------------------------------------------------------------ October Webinars: Code for Performance Free Intel webinars can help you accelerate application performance. Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from the latest Intel processors and coprocessors. See abstracts and register > http://pubads.g.doubleclick.net/gampad/clk?id=60135031&iu=/4140/ostg.clktrk _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel