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 <[email protected]>
> ---
>
> 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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel