On 11/21/2012 01:11 PM, Ivana Hutarova Varekova wrote: > add a function: int cgroup_config_create_template_group(const char *pathname, > struct cgroup *cgroup, char *template_name, > int ignore_ownership); > > Physically create a new control group in kernel, based on given control > group template and configuration file. If given template is not set in > configuration file, then the procedure works create the control group > using cgroup_create_cgroup function > > input parameters are: > pathname .. name of template configuration file (/etc/cgconfig.conf by > default) > cgroup .. control group name and subsystems to which it should belong to > template_name .. name of the template we want to use > flags .. Bit flags to change the behavior > > return 0 on success > > Signed-off-by: Ivana Hutarova Varekova <varek...@redhat.com> > --- > > include/libcgroup/config.h | 20 ++++++++++++++ > include/libcgroup/tasks.h | 2 + > src/config.c | 65 > ++++++++++++++++++++++++++++++++++++++++++++ > src/libcgroup.map | 3 +- > 4 files changed, 89 insertions(+), 1 deletions(-) > > diff --git a/include/libcgroup/config.h b/include/libcgroup/config.h > index d18634e..43568e1 100644 > --- a/include/libcgroup/config.h > +++ b/include/libcgroup/config.h > @@ -84,6 +84,26 @@ int cgroup_init_templates_cache(char *pathname); > int cgroup_reload_cached_templates(char *pathname); > > /** > + * Physically create a new control group in kernel, based on given control > + * group template and configuration file. If given template is not set in > + * configuration file, then the procedure works create the control group > + * using cgroup_create_cgroup() function > + * > + * The flags can alter the behavior of this function: > + * CGFLAG_USE_TEMPLATE_CACHE: Use cached templates instead of > + * parsing the config file > + * > + * @param pathname Name of the configuration file with template definitions > + * @param cgroup Wanted control group - contains substitute name and wanted > + * controllers. > + * @param template_name Template name used for cgroup setting > + * @param flags Bit flags to change the behavior > + */ > +int cgroup_config_create_template_group( > + struct cgroup *cgroup, char *template_name, > + int flags); > + > +/** > * @} > * @} > */ > diff --git a/include/libcgroup/tasks.h b/include/libcgroup/tasks.h > index fb728f4..7e5089c 100644 > --- a/include/libcgroup/tasks.h > +++ b/include/libcgroup/tasks.h > @@ -18,6 +18,8 @@ __BEGIN_DECLS > enum cgflags { > /** Use cached rules, do not read rules from disk. */ > CGFLAG_USECACHE = 0x01, > + /** Use cached templates, do not read templates from disk. */ > + CGFLAG_USE_TEMPLATE_CACHE = 0x02, > }; > > /** Flags for cgroup_register_unchanged_process(). */ > diff --git a/src/config.c b/src/config.c > index 6a91239..c70972e 100644 > --- a/src/config.c > +++ b/src/config.c > @@ -1498,3 +1498,68 @@ int cgroup_init_templates_cache(char *pathname) > > > } > + > +/* > + * Create a given cgroup, based on template configuration if it is present > + * if the template is not present cgroup is creted using cgroup_create_cgroup > + */ > +int cgroup_config_create_template_group(struct cgroup *cgroup, > + char *template_name, int flags) > +{ > + int ret = 0; > + int i, j, k; > + struct cgroup *t_cgroup; > + > + /* > + * If the user did not ask for cached rules, we must parse the > + * configuration file and prepare template structures now. We > + * use CGCONFIG_CONF_FILE by default > + */ > + if (!(flags & CGFLAG_USE_TEMPLATE_CACHE)) { > + ret = cgroup_init_templates_cache(CGCONFIG_CONF_FILE); > + if (ret != 0) { > + cgroup_dbg("Failed initialize templates cache.\n"); > + return ret; > + } > + }
Shouldn't it call cgroup_init_templates_cache only once and then call reload? Otherwise there will be memory leak, cgroup_init_templates_cache allocates memory and nobody seem to free it. > + > + for (i = 0; cgroup->controller[i] != NULL; i++) { > +new_controller: > + for (j = 0; j < template_table_index; j++) { > + > + t_cgroup = &template_table[j]; > + if (strcmp(t_cgroup->name, template_name) != 0) { > + /* tempate name does not match skip template */ > + continue; > + } > + > + /* template name match */ > + for (k = 0; t_cgroup->controller[k] != NULL; k++) { > + if (strcmp((cgroup->controller[i])->name, > + (t_cgroup->controller[k])->name) != 0) { > + continue; > + } I am lost in these three loops. At first, the outermost loop should iterate through template_table, because it will be probably the most expensive and we don't want to loop through it several times. Then I don't know what the other loops do... Shouldn't it copy required controllers and parameter values into cgroup* and call cgroup_create_cgroup just once? The strncpy(t_cgroup->name, cgroup->name) trick is nice, but what if there is a controller in cgroup, which is not covered by any template? It should fall back to simple mkdir(), without setting any parameters. > + /* name and controller match template found */ > + > + /* variables substituted in template */ > + strncpy(t_cgroup->name, cgroup->name, > + FILENAME_MAX); You should restore t_cgroup->name after cgroup_create_cgroup, if you really want to use this trick. > + > + ret = cgroup_create_cgroup(t_cgroup, > + 0); > + if (ret) { > + cgroup_dbg("creating group %s, error > %d\n", > + cgroup->name, ret); > + goto end; > + } else { > + goto new_controller; > + } > + } > + } > + } > + > + /* the template does not exist */ > + cgroup_create_cgroup(cgroup, flags); > +end: > + return ret; > +} > diff --git a/src/libcgroup.map b/src/libcgroup.map > index e29f887..b550a58 100644 > --- a/src/libcgroup.map > +++ b/src/libcgroup.map > @@ -109,4 +109,5 @@ CGROUP_0.38 { > CGROUP_0.39 { > cgroup_reload_cached_templates; > cgroup_init_templates_cache; > -} CGROUP_0.38; > \ No newline at end of file > + cgroup_config_create_template_group; > +} CGROUP_0.38; > > > ------------------------------------------------------------------------------ > Monitor your physical, virtual and cloud infrastructure from a single > web console. Get in-depth insight into apps, servers, databases, vmware, > SAP, cloud infrastructure, etc. Download 30-day Free Trial. > Pricing starts from $795 for 25 servers or applications! > http://p.sf.net/sfu/zoho_dev2dev_nov > _______________________________________________ > Libcg-devel mailing list > Libcg-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libcg-devel > ------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel