On 04/20/2011 03:41 PM, Ivana Hutarova Varekova wrote: > fix several problems in lssubsys output > * not consistent output with and without -i option > * without this option lssubsys ignore multiple hierarchies on one mount > point > * lssubsys -i without -a does not show the hierarchy number > > in configuration: > $ cat /proc/cgroups > #subsys_name hierarchy num_cgroups enabled > cpuset 609 1 1 > ns 0 1 1 > cpu 606 1 1 > cpuacct 606 1 1 > memory 0 1 1 > devices 0 1 1 > freezer 612 1 1 > net_cls 0 1 1 > blkio 0 1 1 > > Old output: > $ lssubsys > cpu,cpuacct > cpuset,freezer > $ ./lssubsys -i > cpu,cpuacct > cpuset,freezer > $ ./lssubsys -ia > ns > memory > devices > net_cls > blkio > cpuset 609 > cpu,cpuacct 606 > freezer 612 > > new one: > $lssubsys > cpuset > cpu,cpuacct > freezer > $ ./lssubsys -i > cpuset 609 > cpu,cpuacct 606 > freezer 612 > $ ./lssubsys -a > ns > memory > devices > net_cls > blkio > cpuset > cpu,cpuacct > freezer > > > Signed-off-by: Ivana Hutarova Varekova <varek...@redhat.com> Acked-By: Jan Safranek <jsafr...@redhat.com>
Please note that this patch breaks tests/tools/multimount tests as it does not support named hierarchies. IMHO it's still worth accepting, named hierarchies are still somewhat broken in libcgroup anyway. We're working on it. > --- > > src/tools/lssubsys.c | 249 > ++++++++++++-------------------------------------- > 1 files changed, 60 insertions(+), 189 deletions(-) > > diff --git a/src/tools/lssubsys.c b/src/tools/lssubsys.c > index ad85e65..c27169f 100644 > --- a/src/tools/lssubsys.c > +++ b/src/tools/lssubsys.c > @@ -57,160 +57,39 @@ static void usage(int status, const char *program_name) > } > } > > -static int print_controller_mount(const char *controller, const char *clist, > - const char *first_path, int flags) > +static int print_controller_mount(const char *controller, > + int flags, cont_name_t cont_names, int hierarchy) > { > int ret = 0; > void *handle; > char path[FILENAME_MAX]; > > - if (flags & FL_MOUNT_ALL) { > + if (!(flags & FL_MOUNT) && !(flags & FL_HIERARCHY)) { > + /* print only hierarchy name */ > + printf("%s\n", cont_names); > + } > + if (!(flags & FL_MOUNT) && (flags & FL_HIERARCHY)) { > + /* print only hierarchy name and number*/ > + printf("%s %d\n", cont_names, hierarchy); > + } > + if (flags & FL_MOUNT) { > + /* print hierarchy name and mount point(s) */ > ret = cgroup_get_subsys_mount_point_begin(controller, &handle, > path); > /* intentionally ignore error from above call */ > while (ret == 0) { > - printf("%s %s\n", clist, path); > + printf("%s %s\n", cont_names, path); > + if (!(flags & FL_MOUNT_ALL)) > + /* first mount record is enough */ > + goto stop; > ret = cgroup_get_subsys_mount_point_next(&handle, path); > } > if (ret == ECGEOF) > ret = 0; > +stop: > cgroup_get_subsys_mount_point_end(&handle); > - } else { > - printf("%s %s\n", clist, first_path); > - } > - return ret; > -} > - > -/* print data about input cont_name controller */ > -static int print_controller(cont_name_t cont_name, int flags) > -{ > - int ret = 0; > - char controller_list[FILENAME_MAX]; > - char path[FILENAME_MAX]; > - void *handle; > - struct cgroup_mount_point controller; > - int output = 0; > - char first_controller[FILENAME_MAX]; > - > - ret = cgroup_get_controller_begin(&handle, &controller); > - if (ret != 0) { > - fprintf(stderr, "cannot read controller data: %s\n", > - cgroup_strerror(ret)); > - return ret; > - } > - > - path[0] = '\0'; > - controller_list[0] = '\0'; > - > - /* go through the list of controllers */ > - while (ret == 0) { > - if (strcmp(path, controller.path) == 0) { > - /* if it is still the same mount point */ > - strncat(controller_list, "," , > - FILENAME_MAX-strlen(controller_list)-1); > - strncat(controller_list, controller.name, > - FILENAME_MAX-strlen(controller_list)-1); > - } else { > - /* > - * we got new mount point > - * print the old one if needed > - */ > - if (output) { > - if ((flags & FL_MOUNT) != 0) > - print_controller_mount(first_controller, > - controller_list, path, > - flags); > - else > - printf("%s\n", controller_list); > - if ((flags & FL_LIST) != 0) { > - /* we successfully finish printing */ > - output = 0; > - break; > - } > - } > - > - output = 0; > - strncpy(controller_list, controller.name, FILENAME_MAX); > - controller_list[FILENAME_MAX-1] = '\0'; > - strncpy(path, controller.path, FILENAME_MAX); > - path[FILENAME_MAX-1] = '\0'; > - strncpy(first_controller, controller.name, > - FILENAME_MAX); > - first_controller[FILENAME_MAX-1] = '\0'; > - } > - > - /* set output flag */ > - if ((!output) && (!(flags & FL_LIST) || > - (strcmp(controller.name, cont_name) == 0))) > - output = 1; > - > - /* the actual controller should not be printed */ > - ret = cgroup_get_controller_next(&handle, &controller); > - } > - > - if (output) { > - if ((flags & FL_MOUNT) != 0) > - print_controller_mount(first_controller, > - controller_list, path, flags); > - else > - printf("%s\n", controller_list); > - if ((flags & FL_LIST) != 0) > - ret = 0; > } > - > - cgroup_get_controller_end(&handle); > return ret; > - > -} > - > -/* list the controllers */ > -static int cgroup_list_controllers(const char *tname, > - cont_name_t cont_name[CG_CONTROLLER_MAX], int flags) > -{ > - int ret = 0; > - int final_ret = 0; > - int i = 0; > - > - /* initialize libcgroup */ > - ret = cgroup_init(); > - > - if (ret) { > - if (flags & FL_ALL) { > - return 0; > - } else { > - return ret; > - } > - } > - > - if ((flags & FL_LIST) == 0) { > - /* we have to print all controllers */ > - ret = print_controller(NULL, flags); > - if (ret == ECGEOF) > - final_ret = 0; > - else > - fprintf(stderr, "controllers can't be listed: %s\n", > - cgroup_strerror(ret)); > - } else > - /* we have he list of controllers which should be print */ > - while ((i < CG_CONTROLLER_MAX) && (cont_name[i][0] != '\0') > - && ((ret == ECGEOF) || (ret == 0))) { > - ret = print_controller(cont_name[i], flags); > - if (ret != 0) { > - if (ret == ECGEOF) > - /* controller was not found */ > - final_ret = ECGFAIL; > - else > - /* other problem */ > - final_ret = ret; > - fprintf(stderr, > - "%s: cannot find group %s: %s\n", > - tname, cont_name[i], > - cgroup_strerror(final_ret)); > - } > - i++; > - } > - > - return final_ret; > } > > /* display all controllers attached to the given hierarchy */ > @@ -221,6 +100,7 @@ static int print_all_controllers_in_hierarchy(const char > *tname, > void *handle; > struct controller_data info; > int first = 1; > + cont_name_t cont_names; > cont_name_t cont_name; > int init = 1; > > @@ -246,50 +126,29 @@ static int print_all_controllers_in_hierarchy(const > char *tname, > if (info.hierarchy != hierarchy) > goto next; > > - /* the first controller in the hierrachy*/ > if (first) { > - /* > - * if mounted flag is set then > - * test whether it is mounted > - */ > - if ((flags & FL_MOUNT) && (init == 1)) { > - memset(cont_name, 0, FILENAME_MAX); > - strncpy(cont_name, info.name, > - FILENAME_MAX-1); > - > - ret = print_controller(cont_name, > - flags + FL_LIST); > - /* > - * mount point was found, > - * output is done > - */ > - if (ret == 0) { > - cgroup_get_all_controller_end( > - &handle); > - return 0; > - } > - } > - printf("%s", info.name); > + /* the first controller in the hierarchy */ > + memset(cont_name, 0, FILENAME_MAX); > + strncpy(cont_name, info.name, FILENAME_MAX-1); > + memset(cont_names, 0, FILENAME_MAX); > + strncpy(cont_names, info.name, FILENAME_MAX-1); > first = 0; > - } else > - printf(",%s", info.name); > - > + } else { > + /* the next controller in the hierarchy */ > + strncat(cont_names, ",", FILENAME_MAX-1); > + strncat(cont_names, info.name, FILENAME_MAX-1); > + } > next: > ret = cgroup_get_all_controller_next(&handle, &info); > - if (ret && ret != ECGEOF) { > - fprintf(stderr, > - "%s: cgroup_get_controller_next failed (%s)\n", > - tname, cgroup_strerror(ret)); > - cgroup_get_all_controller_end(&handle); > - return ret; > - } > + if (ret && ret != ECGEOF) > + goto end; > } > > + ret = print_controller_mount(cont_name, > + flags, cont_names, hierarchy); > + > +end: > cgroup_get_all_controller_end(&handle); > - if (flags & FL_HIERARCHY) > - printf(" %d\n", hierarchy); > - else > - printf("\n"); > > if (ret == ECGEOF) > ret = 0; > @@ -297,9 +156,11 @@ next: > return ret; > } > > + > /* go through the list of all controllers gather them based on hierarchy > number > and print them */ > -static int cgroup_list_all_controllers(const char *tname, int flags) > +static int cgroup_list_all_controllers(const char *tname, > + cont_name_t cont_name[CG_CONTROLLER_MAX], int c_number, int flags) > { > int ret = 0; > void *handle; > @@ -308,15 +169,34 @@ static int cgroup_list_all_controllers(const char > *tname, int flags) > int h_list[CG_CONTROLLER_MAX]; /* list of hierarchies */ > int counter = 0; > int j; > + int is_on_list = 0; > > ret = cgroup_get_all_controller_begin(&handle, &info); > > while (ret != ECGEOF) { > if (info.hierarchy == 0) { > /* the controller is not attached to any hierrachy */ > - printf("%s\n", info.name); > - } else { > - /* the controller is attached to some hierarchy */ > + if (flags & FL_ALL) > + /* display only if -a flag is set */ > + printf("%s\n", info.name); > + } > + is_on_list = 0; > + j = 0; > + while ((is_on_list == 0) && (j < c_number)) { > + if (strcmp(info.name, cont_name[j]) == 0) { > + is_on_list = 1; > + break; > + } > + j++; > + } > + > + if ((info.hierarchy != 0) && > + ((flags & FL_ALL) || > + (!(flags & FL_LIST) || (is_on_list == 1)))) { > + /* the controller is attached to some hierarchy > + and either should be output all controllers, > + or the controller is on the output list */ > + > h_list[counter] = info.hierarchy; > counter++; > for (j = 0; j < counter-1; j++) { > @@ -400,10 +280,6 @@ int main(int argc, char *argv[]) > > /* read the list of controllers */ > while (optind < argc) { > - if (flags & FL_ALL) { > - fprintf(stderr, "Warning: too many parameters\n"); > - break; > - } > flags |= FL_LIST; > strncpy(cont_name[c_number], argv[optind], FILENAME_MAX); > cont_name[c_number][FILENAME_MAX-1] = '\0'; > @@ -415,12 +291,7 @@ int main(int argc, char *argv[]) > } > } > > - if (flags & FL_ALL) > - /* print the information about all controllers */ > - ret = cgroup_list_all_controllers(argv[0], flags); > - else > - /* print information about mounted controllers */ > - ret = cgroup_list_controllers(argv[0], cont_name, flags); > + ret = cgroup_list_all_controllers(argv[0], cont_name, c_number, flags); > > return ret; > } > > > ------------------------------------------------------------------------------ > Benefiting from Server Virtualization: Beyond Initial Workload > Consolidation -- Increasing the use of server virtualization is a top > priority.Virtualization can reduce costs, simplify management, and improve > application availability and disaster protection. Learn more about boosting > the value of server virtualization. http://p.sf.net/sfu/vmware-sfdev2dev > _______________________________________________ > Libcg-devel mailing list > Libcg-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libcg-devel > ------------------------------------------------------------------------------ Benefiting from Server Virtualization: Beyond Initial Workload Consolidation -- Increasing the use of server virtualization is a top priority.Virtualization can reduce costs, simplify management, and improve application availability and disaster protection. Learn more about boosting the value of server virtualization. http://p.sf.net/sfu/vmware-sfdev2dev _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel