[Devel,RHEL7,COMMIT] cgroup/ve: don't add cgroup files on ve_root twice.

Submitted by Konstantin Khorenko on Feb. 2, 2017, 4:45 p.m.


Message ID 201702021645.v12GjZP3019353@finist_cl7.x64_64.work.ct
State New
Series "cgroup/ve: don't add cgroup files on ve_root twice."
Headers show

Commit Message

Konstantin Khorenko Feb. 2, 2017, 4:45 p.m.
The commit is pushed to "branch-rh7-3.10.0-514.6.1.vz7.28.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-514.6.1.vz7.28.3
commit 1553c5a736cb00add6a53e8fe8fd18ce876c4010
Author: Andrey Ryabinin <aryabinin@virtuozzo.com>
Date:   Thu Feb 2 20:45:35 2017 +0400

    cgroup/ve: don't add cgroup files on ve_root twice.
    We have single pids cgroup hierarchy which is shared among all VEs.
    So when we start several VEs, cgroup_add_ve_root_files() will be called
    more than once for the single pids cgroup, leading to:
           "cgroup_add_ve_root_files: failed to add cgroup.subgroups_limit, err=-17"
    This may seem as harmless message at first, but it is not because cgroup_add_file()
    doesn't handle error properly:
    	cfe = kzalloc(sizeof(*cfe), GFP_KERNEL);
    	dentry->d_fsdata = cfe;
    	error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb);
    	if (!error) {
    		list_add_tail(&cfe->node, &parent->files);
    		cfe = NULL;
    	return error;
    As one can see above we leave freed cfe in dentry if cgroup_create_file() fails.
    So let's make sure that we call cgroup_add_ve_root_files() only once per
    cgroup to avoid that problem and message in dmesg as well.
    Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
 kernel/cgroup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 3e2de0b4..e8ec5f2 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -4271,8 +4271,8 @@  void cgroup_mark_ve_root(struct ve_struct *ve)
 	for_each_active_root(root) {
 		cgrp = task_cgroup_from_root(ve->init_task, root);
-		set_bit(CGRP_VE_ROOT, &cgrp->flags);
-		cgroup_add_ve_root_files(cgrp, NULL, files);
+		if (!test_and_set_bit(CGRP_VE_ROOT, &cgrp->flags))
+			cgroup_add_ve_root_files(cgrp, NULL, files);