From: Weng Meiling <wengmeiling.w...@huawei.com> When multi subsystems mounted on one place like this:
$ lssubsys -m cpu,cpuacct /cgroup/cpu $ lscgroup cpu,cpuacct:/ cpu,cpuacct:/test if we delete the cgroup with the cgdelete -g, and specifying multi controllers like this: $ cgdelete -g cpu,cpuacct:test or $ cgdelete -g cpu:test -g cpuacct:test it will report error: cgdelete: cannot remove group 'test': No such file or directory this patch fix the problem. v1 -> v2 - make cgdelete -g cpu:/test -g cpu:test failed. v2 -> v3 - make cgdelete -g cpu:test -g cpu:test1 ok. Signed-off-by: Weng Meiling <wengmeiling.w...@huawei.com> --- src/tools/cgdelete.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/src/tools/cgdelete.c b/src/tools/cgdelete.c index 190310f..f7ac7a5 100644 --- a/src/tools/cgdelete.c +++ b/src/tools/cgdelete.c @@ -52,6 +52,41 @@ static void usage(int status, const char *program_name) } +static int skip_add_controller(int counter, int *skip, int *h_list, + char cg_name[][FILENAME_MAX], char cont_name[][FILENAME_MAX]) +{ + int k, ret = 0; + struct controller_data info; + void *handle; + + ret = cgroup_get_all_controller_begin(&handle, &info); + while (ret == 0) { + if (!strcmp(info.name, cont_name[counter])) { + h_list[counter] = info.hierarchy; + for (k = 0; k < counter; k++) + if (h_list[k] == info.hierarchy && + strcmp(cont_name[k], + cont_name[counter])) + if (!strcmp(cg_name[k], + cg_name[counter])) + *skip = 1; + break; + } + ret = cgroup_get_all_controller_next(&handle, &info); + } + cgroup_get_all_controller_end(&handle); + + if (ret == ECGEOF) + ret = 0; + if (ret) { + fprintf(stderr, + "cgroup_get_controller_begin/next failed(%s)\n", + cgroup_strerror(ret)); + } + return ret; +} + + int main(int argc, char *argv[]) { int ret = 0; @@ -59,6 +94,10 @@ int main(int argc, char *argv[]) int c; int flags = 0; int final_ret = 0; + int counter = 0, skip_add_cont; + int h_list[CG_CONTROLLER_MAX] = {-1}; + char cg_name[CG_CONTROLLER_MAX][FILENAME_MAX]; + char cont_name[CG_CONTROLLER_MAX][FILENAME_MAX]; struct cgroup_group_spec **cgroup_list = NULL; struct cgroup *cgroup; @@ -138,8 +177,21 @@ int main(int argc, char *argv[]) /* add controllers to the cgroup */ j = 0; while (cgroup_list[i]->controllers[j]) { - cgc = cgroup_add_controller(cgroup, - cgroup_list[i]->controllers[j]); + skip_add_cont = 0; + strncpy(cont_name[counter], + cgroup_list[i]->controllers[j], + FILENAME_MAX); + cont_name[counter][FILENAME_MAX - 1] = '\0'; + strncpy(cg_name[counter], cgroup_list[i]->path, + FILENAME_MAX); + cg_name[counter][FILENAME_MAX - 1] = '\0'; + ret = skip_add_controller(counter, &skip_add_cont, + h_list, cg_name, cont_name); + if (ret) + goto err; + if (!skip_add_cont) + cgc = cgroup_add_controller(cgroup, + cgroup_list[i]->controllers[j]); if (!cgc) { ret = ECGFAIL; fprintf(stderr, "%s: " @@ -149,6 +201,7 @@ int main(int argc, char *argv[]) cgroup_free(&cgroup); goto err; } + counter++; j++; } -- 1.8.3 ------------------------------------------------------------------------------ November Webinars for C, C++, Fortran Developers Accelerate application performance with scalable programming models. Explore techniques for threading, error checking, porting, and tuning. Get the most from the latest Intel processors and coprocessors. See abstracts and register http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel