Reviewed-by: Weng Meiling <wengmeiling.w...@huawei.com> On 2014/7/3 16:55, Ivana Hutarova Varekova wrote: > 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. > v3 -> v4 > - make cgdelete -g cpuacct:test -g cpu:test -g cpuacct:test failed. > - add some comments > - fix the uninitialized warning > v4 -> v5 (Ivana Hutarova Varekova) > - make cgdelete -g cpuacct:test -g cpu:test -g cpu:test failed > - join extended cgroup list variables to one record, do the list dynamic > (static version can exceed the given limit and the safe static limit is quite > high) > > Signed-off-by: Weng Meiling <wengmeiling.w...@huawei.com> > Signed-off-by: Ivana Hutarova Varekova <varek...@redhat.com> > --- > src/tools/cgdelete.c | 125 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 125 insertions(+) > > diff --git a/src/tools/cgdelete.c b/src/tools/cgdelete.c > index 190310f..43cc47c 100644 > --- a/src/tools/cgdelete.c > +++ b/src/tools/cgdelete.c > @@ -33,6 +33,13 @@ static struct option const long_options[] = > {NULL, 0, NULL, 0} > }; > > +struct ext_cgroup_record { > + char name[FILENAME_MAX]; /* controller name */ > + char controller[FILENAME_MAX]; /* cgroup name */ > + int h_number; /* hierarchy number */ > +}; > + > + > static void usage(int status, const char *program_name) > { > if (status != 0) { > @@ -51,6 +58,69 @@ static void usage(int status, const char *program_name) > "all subgroups\n"); > } > > +/* > + * Skip adding controller which points to the same cgroup when delete > + * cgroup with specifying multi controllers. Just skip controller which > + * cgroup and hierarchy number is same > + */ > +static int skip_add_controller(int counter, int *skip, > + struct ext_cgroup_record *ecg_list) > +{ > + int k; > + struct controller_data info; > + void *handle; > + int ret = 0; > + > + /* find out hierarchy number of added cgroup */ > + ecg_list[counter].h_number = 0; > + ret = cgroup_get_all_controller_begin(&handle, &info); > + while (ret == 0) { > + if (!strcmp(info.name, ecg_list[counter].name)) { > + /* hierarchy number found out, set it */ > + ecg_list[counter].h_number = info.hierarchy; > + break; > + } > + ret = cgroup_get_all_controller_next(&handle, &info); > + } > + cgroup_get_all_controller_end(&handle); > + > + /* deal with cgroup_get_controller_begin/next ret values */ > + if (ret == ECGEOF) > + ret = 0; > + if (ret) { > + fprintf(stderr, "cgroup_get_controller_begin/next failed(%s)\n", > + cgroup_strerror(ret)); > + return ret; > + } > + > + /* found out whether the hierarchy should be skipped */ > + *skip = 0; > + for (k = 0; k < counter; k++) { > + if ((!strcmp(ecg_list[k].name, ecg_list[counter].name)) && > + (ecg_list[k].h_number == ecg_list[counter].h_number)) { > + /* we found a control group in the same hierarchy */ > + if (strcmp(ecg_list[k].controller, > + ecg_list[counter].controller)) { > + /* > + * it is a different controller -> > + * if there is not one cgroup for the same > + * controller, skip it > + */ > + *skip = 1; > + } else { > + /* > + * there is the identical group,controller pair > + * don't skip it > + */ > + *skip = 0; > + return ret; > + } > + } > + } > + > + return ret; > +} > + > > int main(int argc, char *argv[]) > { > @@ -60,6 +130,11 @@ int main(int argc, char *argv[]) > int flags = 0; > int final_ret = 0; > > + int counter = 0; > + int max = 0; > + struct ext_cgroup_record *ecg_list = NULL; > + int skip; > + > struct cgroup_group_spec **cgroup_list = NULL; > struct cgroup *cgroup; > struct cgroup_controller *cgc; > @@ -80,6 +155,13 @@ int main(int argc, char *argv[]) > goto err; > } > > + ecg_list = calloc(argc, sizeof(struct ext_cgroup_record *)); > + if (cgroup_list == NULL) { > + fprintf(stderr, "%s: out of memory\n", argv[0]); > + ret = -1; > + goto err; > + } > + > /* > * Parse arguments > */ > @@ -138,6 +220,44 @@ int main(int argc, char *argv[]) > /* add controllers to the cgroup */ > j = 0; > while (cgroup_list[i]->controllers[j]) { > + skip = 0; > + /* > + * save controller name, cg name and hierarchy number > + * to determine whether we should skip adding controller > + */ > + if (counter == max) { > + /* > + * there is not enough space to store them, > + * create it > + */ > + max = max + argc; > + ecg_list = (struct ext_cgroup_record *) > + realloc(ecg_list, > + max * sizeof(struct ext_cgroup_record)); > + if (!ecg_list) { > + fprintf(stderr, "%s: ", argv[0]); > + fprintf(stderr, "not enough memory\n"); > + final_ret = -1; > + goto err; > + } > + } > + > + strncpy(ecg_list[counter].controller, > + cgroup_list[i]->controllers[j], FILENAME_MAX); > + ecg_list[counter].controller[FILENAME_MAX - 1] = '\0'; > + strncpy(ecg_list[counter].name, > + cgroup_list[i]->path, FILENAME_MAX); > + ecg_list[counter].name[FILENAME_MAX - 1] = '\0'; > + > + ret = skip_add_controller(counter, &skip, ecg_list); > + if (ret) > + goto err; > + > + if (skip) { > + /* don't add the controller, goto next one */ > + goto next; > + } > + > cgc = cgroup_add_controller(cgroup, > cgroup_list[i]->controllers[j]); > if (!cgc) { > @@ -149,6 +269,8 @@ int main(int argc, char *argv[]) > cgroup_free(&cgroup); > goto err; > } > +next: > + counter++; > j++; > } > > @@ -167,6 +289,9 @@ int main(int argc, char *argv[]) > > ret = final_ret; > err: > + if (ecg_list) > + free(ecg_list); > + > if (cgroup_list) { > for (i = 0; i < argc; i++) { > if (cgroup_list[i]) > > > . >
------------------------------------------------------------------------------ Infragistics Professional Build stunning WinForms apps today! Reboot your WinForms applications with our WinForms controls. Build a bridge from your legacy apps to the future. http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel