The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at 
https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-123.1.2.vz7.5.1
------>
commit 7d10a4007de110332ffb866532fb5bd2ebe7a26a
Author: Vladimir Davydov <vdavy...@parallels.com>
Date:   Wed May 13 20:11:27 2015 +0400

    ub: drop host node
    
    The ub host node, i.e. memory/blkio cgroup /0, conflicts with systemd:
    the latter moves all processes out of it and even tries to delete it. To
    make it work as expected we should create /0 from the userspace via
    systemd.
    
    https://jira.sw.ru/browse/PSBM-33487
    
    Signed-off-by: Vladimir Davydov <vdavy...@parallels.com>
    Acked-by: Cyrill Gorcunov <gorcu...@openvz.org>
---
 kernel/bc/beancounter.c | 68 ++++++++++++++++++++++---------------------------
 1 file changed, 31 insertions(+), 37 deletions(-)

diff --git a/kernel/bc/beancounter.c b/kernel/bc/beancounter.c
index 28dfe43..cdbe846 100644
--- a/kernel/bc/beancounter.c
+++ b/kernel/bc/beancounter.c
@@ -100,6 +100,20 @@ static int resource_precharge_min = 0;
 static int resource_precharge_max = INT_MAX / NR_CPUS;
 static struct cgroup *mem_cgroup_root, *blkio_cgroup_root, *ub_cgroup_root;
 
+static struct cgroup *ub_cgroup_open(struct cgroup *root,
+                                    struct user_beancounter *ub)
+{
+       if (ub == get_ub0())
+               return root;
+       return cgroup_kernel_open(root, CGRP_CREAT, ub->ub_name);
+}
+
+static void ub_cgroup_close(struct cgroup *root, struct cgroup *cg)
+{
+       if (cg != root)
+               cgroup_kernel_close(cg);
+}
+
 extern int mem_cgroup_apply_beancounter(struct cgroup *cg,
                                        struct user_beancounter *ub);
 
@@ -109,18 +123,16 @@ static int ub_mem_cgroup_attach_task(struct 
user_beancounter *ub,
        struct cgroup *cg;
        int ret;
 
-       cg = cgroup_kernel_open(mem_cgroup_root, CGRP_CREAT, ub->ub_name);
+       cg = ub_cgroup_open(mem_cgroup_root, ub);
        if (IS_ERR(cg))
                return PTR_ERR(cg);
-
        if (ub != get_ub0())
                ret = mem_cgroup_apply_beancounter(cg, ub);
        else
                ret = 0;
        if (!ret)
                ret = cgroup_kernel_attach(cg, tsk);
-
-       cgroup_kernel_close(cg);
+       ub_cgroup_close(mem_cgroup_root, cg);
        return ret;
 }
 
@@ -132,14 +144,11 @@ static int ub_blkio_cgroup_attach_task(struct 
user_beancounter *ub,
 
        if (!ubc_ioprio)
                return 0;
-
-       cg = cgroup_kernel_open(blkio_cgroup_root, CGRP_CREAT, ub->ub_name);
+       cg = ub_cgroup_open(blkio_cgroup_root, ub);
        if (IS_ERR(cg))
                return PTR_ERR(cg);
-
        ret = cgroup_kernel_attach(cg, tsk);
-
-       cgroup_kernel_close(cg);
+       ub_cgroup_close(blkio_cgroup_root, cg);
        return ret;
 }
  
@@ -149,17 +158,11 @@ static int ub_cgroup_attach_task(struct user_beancounter 
*ub,
        struct cgroup *cg;
        int ret;
 
-       if (ub != get_ub0()) {
-               cg = cgroup_kernel_open(ub_cgroup_root, CGRP_CREAT, 
ub->ub_name);
-               if (IS_ERR(cg))
-                       return PTR_ERR(cg);
-       } else
-               cg = ub_cgroup_root;
-
+       cg = ub_cgroup_open(ub_cgroup_root, ub);
+       if (IS_ERR(cg))
+               return PTR_ERR(cg);
        ret = cgroup_kernel_attach(cg, tsk);
-
-       if (ub != get_ub0())
-               cgroup_kernel_close(cg);
+       ub_cgroup_close(ub_cgroup_root, cg);
        return ret;
 }
 
@@ -196,11 +199,11 @@ int ub_update_mem_cgroup_limits(struct user_beancounter 
*ub)
        if (ub == get_ub0())
                return -EPERM;
 
-       cg = cgroup_kernel_open(mem_cgroup_root, 0, ub->ub_name);
-       if (IS_ERR_OR_NULL(cg))
-               return PTR_ERR(cg) ?: -ENOENT;
+       cg = ub_cgroup_open(mem_cgroup_root, ub);
+       if (IS_ERR(cg))
+               return PTR_ERR(cg);
        ret = mem_cgroup_apply_beancounter(cg, ub);
-       cgroup_kernel_close(cg);
+       ub_cgroup_close(mem_cgroup_root, cg);
        return ret;
 }
 
@@ -217,10 +220,10 @@ void ub_get_mem_cgroup_parms(struct user_beancounter *ub,
 
        memset(parms, 0, sizeof(parms));
 
-       cg = cgroup_kernel_open(mem_cgroup_root, 0, ub->ub_name);
+       cg = ub_cgroup_open(mem_cgroup_root, ub);
        if (!IS_ERR_OR_NULL(cg)) {
                mem_cgroup_fill_ub_parms(cg, &parms[0], &parms[1], &parms[2]);
-               cgroup_kernel_close(cg);
+               ub_cgroup_close(mem_cgroup_root, cg);
        }
 
        if (physpages)
@@ -242,14 +245,14 @@ void ub_page_stat(struct user_beancounter *ub, const 
nodemask_t *nodemask,
 
        memset(pages, 0, sizeof(unsigned long) * NR_LRU_LISTS);
 
-       cg = cgroup_kernel_open(mem_cgroup_root, 0, ub->ub_name);
-       if (IS_ERR_OR_NULL(cg))
+       cg = ub_cgroup_open(mem_cgroup_root, ub);
+       if (IS_ERR(cg))
                return;
 
        for_each_node_mask(nid, *nodemask)
                mem_cgroup_get_nr_pages(cg, nid, pages);
 
-       cgroup_kernel_close(cg);
+       ub_cgroup_close(mem_cgroup_root, cg);
 }
 
 void init_beancounter_precharge(struct user_beancounter *ub, int resource)
@@ -1141,7 +1144,6 @@ void __init ub_init_late(void)
 
 int __init ub_init_cgroup(void)
 {
-       int err;
        struct vfsmount *blkio_mnt, *mem_mnt, *ub_mnt;
        struct cgroup_sb_opts blkio_opts = {
                .name           = vz_compat ? "beancounter" : NULL,
@@ -1175,14 +1177,6 @@ int __init ub_init_cgroup(void)
        }
        ub_cgroup_root = cgroup_get_root(ub_mnt);
 
-       err = ub_attach_task(&ub0, init_pid_ns.child_reaper);
-       if (err)
-               return err;
-
-       /* pin ub0's cgroups to prevent insidious systemd from deleting them */
-       cgroup_kernel_open(mem_cgroup_root, 0, ub0.ub_name);
-       cgroup_kernel_open(blkio_cgroup_root, 0, ub0.ub_name);
-
        return 0;
 }
 late_initcall(ub_init_cgroup);
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to