The commit is pushed to "branch-rh7-3.10.0-229.7.2.vz7.9.x-ovz" and will appear 
at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-229.7.2.vz7.9.5
------>
commit 60d2e26e61f30d30a9b181bc34e49ec81b1b3d90
Author: Cyrill Gorcunov <gorcu...@virtuozzo.com>
Date:   Thu Oct 29 16:48:05 2015 +0400

    ve/cgroups: Allow to attach a single threaded task only into a container
    
    In commit e4abbcde75125568a855058f965ad3aa191fe52a we've
    allowed to attach non-self into container. Still there
    were an assumption that we might need multithreaded
    kernel threads to be connected into container (sounds
    like a new term in kernel development :-).
    
    Thus lets simplify the test: we only require the
    "init" to be moved into a container. The rest of
    process tree is usually forked()/cloned() from it
    automatically obtaining same container's cgroup.
    
    I leave an old test for kernel thread here because
    not sure if lack of it cause any problem. Lets
    step safe first.
    
    Signed-off-by: Cyrill Gorcunov <gorcu...@odin.com>
    Reviewed-by: Vladimir Davydov <vdavy...@virtuozzo.com>
    
    CC: Nikita Spiridonov <nspirido...@odin.com>
    CC: Konstantin Khorenko <khore...@odin.com>
    CC: Pavel Emelyanov <xe...@odin.com>
    CC: Andrey Vagin <ava...@odin.com>
---
 kernel/ve/ve.c | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index d86efb9..e9219e6 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -704,7 +704,6 @@ static void ve_destroy(struct cgroup *cg)
 static int ve_can_attach(struct cgroup *cg, struct cgroup_taskset *tset)
 {
        struct ve_struct *ve = cgroup_ve(cg);
-       struct task_struct *task;
 
        if (!ve->veid)
                return -ENOENT;
@@ -713,25 +712,29 @@ static int ve_can_attach(struct cgroup *cg, struct 
cgroup_taskset *tset)
                return -EBUSY;
 
        /*
-        * We either moving the whole group of threads,
-        * either a single thread process.
+        * We allow only one single-threaded process to attach
+        * into a container, which usually stands for "init"
+        * process. The rest of processes should be forked
+        * from the "init".
         */
        if (cgroup_taskset_size(tset) == 1) {
-               task = cgroup_taskset_first(tset);
-               if (!thread_group_empty(task))
+               struct task_struct *task = cgroup_taskset_first(tset);
+
+               if (!thread_group_leader(task) ||
+                   !thread_group_empty(task))
                        return -EINVAL;
-       }
 
-       /*
-        * Forbid userspace tasks to enter during starting or stopping.
-        * Permit attaching kernel threads for this containers.
-        */
-       if (!ve->is_running && (ve->ve_ns || nr_threads_ve(ve))) {
-               cgroup_taskset_for_each(task, cg, tset) {
+               /*
+                * XXX Still permit attaching kernel threads
+                * for this container. Wonder if we really need it,
+                * looks like some legacy code chunk.
+                */
+               if (!ve->is_running && (ve->ve_ns || nr_threads_ve(ve))) {
                        if (!(task->flags & PF_KTHREAD))
                                return -EPIPE;
                }
-       }
+       } else
+               return -EINVAL;
 
        return 0;
 }
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to