Quoting Christian Seiler (christ...@iwakd.de):
> This patch splits off ns legacy cgroup handling from main cgroup
> handling. It moves the creation of the cgroups before clone(), so that
> the child will easily know which cgroups it will later belong to. Since
> this is not possible for the renaming of the 'ns' cgroup, keep that
> part after clone.
> 
> Signed-off-by: Christian Seiler <christ...@iwakd.de>

Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com>

> ---
>  src/lxc/cgroup.c |   61 
> +++++++++++++++++++++++++++++++++++-------------------
>  src/lxc/cgroup.h |    3 ++-
>  src/lxc/start.c  |   15 ++++++++++++--
>  3 files changed, 55 insertions(+), 24 deletions(-)
> 
> diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
> index aaee546..ad95fc4 100644
> --- a/src/lxc/cgroup.c
> +++ b/src/lxc/cgroup.c
> @@ -604,7 +604,7 @@ static char *cgroup_rename_nsgroup(const char *mountpath, 
> const char *oldname, p
>  }
>  
>  /* create a new cgroup */
> -extern struct cgroup_process_info *lxc_cgroup_create(const char *name, const 
> char *path_pattern, struct cgroup_meta_data *meta_data, const char 
> *sub_pattern, pid_t pid)
> +extern struct cgroup_process_info *lxc_cgroup_create(const char *name, const 
> char *path_pattern, struct cgroup_meta_data *meta_data, const char 
> *sub_pattern)
>  {
>       char **cgroup_path_components = NULL;
>       char **p = NULL;
> @@ -826,27 +826,16 @@ extern struct cgroup_process_info 
> *lxc_cgroup_create(const char *name, const cha
>  
>       /* we're done, now update the paths */
>       for (i = 0, info_ptr = base_info; info_ptr; info_ptr = info_ptr->next, 
> i++) {
> -             /*
> -              * For any path which has ns cgroup mounted, handler->pid is 
> already
> -              * moved into a container called '%d % (handler->pid)'.  Rename 
> it to
> -              * the cgroup name and record that.
> +             /* ignore legacy 'ns' subsystem here, lxc_cgroup_create_legacy
> +              * will take care of it
> +              * Since we do a continue in above loop, new_cgroup_paths[i] is
> +              * unset anyway, as is new_cgroup_paths_sub[i]
>                */
> -             if (lxc_string_in_array("ns", (const char 
> **)info_ptr->hierarchy->subsystems)) {
> -                     char *tmp = cgroup_rename_nsgroup((const char 
> *)info_ptr->designated_mount_point->mount_point,
> -                                     info_ptr->cgroup_path, pid, name);
> -                     if (!tmp)
> -                             goto out_initial_error;
> -                     free(info_ptr->cgroup_path);
> -                     info_ptr->cgroup_path = tmp;
> -                     r = lxc_grow_array((void ***)&info_ptr->created_paths, 
> &info_ptr->created_paths_capacity, info_ptr->created_paths_count + 1, 8);
> -                     if (r < 0)
> -                             goto out_initial_error;
> -                     
> info_ptr->created_paths[info_ptr->created_paths_count++] = strdup(tmp);
> -             } else {
> -                     free(info_ptr->cgroup_path);
> -                     info_ptr->cgroup_path = new_cgroup_paths[i];
> -                     info_ptr->cgroup_path_sub = new_cgroup_paths_sub[i];
> -             }
> +             if (lxc_string_in_array("ns", (const char 
> **)info_ptr->hierarchy->subsystems))
> +                     continue;
> +             free(info_ptr->cgroup_path);
> +             info_ptr->cgroup_path = new_cgroup_paths[i];
> +             info_ptr->cgroup_path_sub = new_cgroup_paths_sub[i];
>       }
>       /* don't use lxc_free_array since we used the array members
>        * to store them in our result...
> @@ -868,6 +857,36 @@ out_initial_error:
>       return NULL;
>  }
>  
> +int lxc_cgroup_create_legacy(struct cgroup_process_info *base_info, const 
> char *name, pid_t pid)
> +{
> +     struct cgroup_process_info *info_ptr;
> +     int r;
> +
> +     for (info_ptr = base_info; info_ptr; info_ptr = info_ptr->next) {
> +             if (!lxc_string_in_array("ns", (const char 
> **)info_ptr->hierarchy->subsystems))
> +                     continue;
> +             /*
> +              * For any path which has ns cgroup mounted, handler->pid is 
> already
> +              * moved into a container called '%d % (handler->pid)'.  Rename 
> it to
> +              * the cgroup name and record that.
> +              */
> +             char *tmp = cgroup_rename_nsgroup((const char 
> *)info_ptr->designated_mount_point->mount_point,
> +                             info_ptr->cgroup_path, pid, name);
> +             if (!tmp)
> +                     return -1;
> +             free(info_ptr->cgroup_path);
> +             info_ptr->cgroup_path = tmp;
> +             r = lxc_grow_array((void ***)&info_ptr->created_paths, 
> &info_ptr->created_paths_capacity, info_ptr->created_paths_count + 1, 8);
> +             if (r < 0)
> +                     return -1;
> +             tmp = strdup(tmp);
> +             if (!tmp)
> +                     return -1;
> +             info_ptr->created_paths[info_ptr->created_paths_count++] = tmp;
> +     }
> +     return 0;
> +}
> +
>  /* get the cgroup membership of a given container */
>  struct cgroup_process_info *lxc_cgroup_get_container_info(const char *name, 
> const char *lxcpath, struct cgroup_meta_data *meta_data)
>  {
> diff --git a/src/lxc/cgroup.h b/src/lxc/cgroup.h
> index bd2da25..2555390 100644
> --- a/src/lxc/cgroup.h
> +++ b/src/lxc/cgroup.h
> @@ -113,7 +113,8 @@ extern struct cgroup_process_info 
> *lxc_cgroup_process_info_get_init(struct cgrou
>  extern struct cgroup_process_info *lxc_cgroup_process_info_get_self(struct 
> cgroup_meta_data *meta);
>  
>  /* create a new cgroup */
> -extern struct cgroup_process_info *lxc_cgroup_create(const char *name, const 
> char *path_pattern, struct cgroup_meta_data *meta_data, const char 
> *sub_pattern, int pid);
> +extern struct cgroup_process_info *lxc_cgroup_create(const char *name, const 
> char *path_pattern, struct cgroup_meta_data *meta_data, const char 
> *sub_pattern);
> +extern int lxc_cgroup_create_legacy(struct cgroup_process_info *base_info, 
> const char *name, pid_t pid);
>  
>  /* get the cgroup membership of a given container */
>  extern struct cgroup_process_info *lxc_cgroup_get_container_info(const char 
> *name, const char *lxcpath, struct cgroup_meta_data *meta_data);
> diff --git a/src/lxc/start.c b/src/lxc/start.c
> index 6e95ff1..56a2e6b 100644
> --- a/src/lxc/start.c
> +++ b/src/lxc/start.c
> @@ -663,6 +663,14 @@ int lxc_spawn(struct lxc_handler *handler)
>       if (!cgroup_pattern)
>               cgroup_pattern = "%n";
>  
> +     /* Create cgroup before doing clone(), so the child will know from
> +      * handler which cgroup it is going to be put in later.
> +      */
> +     if ((handler->cgroup = lxc_cgroup_create(name, cgroup_pattern, 
> cgroup_meta, NULL)) == NULL) {
> +             ERROR("failed to create cgroups for '%s'", name);
> +             goto out_delete_net;
> +     }
> +
>       /*
>        * if the rootfs is not a blockdev, prevent the container from
>        * marking it readonly.
> @@ -684,8 +692,11 @@ int lxc_spawn(struct lxc_handler *handler)
>       if (lxc_sync_wait_child(handler, LXC_SYNC_CONFIGURE))
>               failed_before_rename = 1;
>  
> -     if ((handler->cgroup = lxc_cgroup_create(name, cgroup_pattern, 
> cgroup_meta, NULL, handler->pid)) == NULL) {
> -             ERROR("failed to create cgroups for '%s'", name);
> +     /* In case there is still legacy ns cgroup support in the kernel.
> +      * Should be removed at some later point in time.
> +      */
> +     if (lxc_cgroup_create_legacy(handler->cgroup, name, handler->pid) < 0) {
> +             ERROR("failed to create legacy ns cgroups for '%s'", name);
>               goto out_delete_net;
>       }
>  
> -- 
> 1.7.10.4
> 
> 
> ------------------------------------------------------------------------------
> How ServiceNow helps IT people transform IT departments:
> 1. Consolidate legacy IT systems to a single system of record for IT
> 2. Standardize and globalize service processes across IT
> 3. Implement zero-touch automation to replace manual, redundant tasks
> http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to