[Devel] [PATCH RHEL7 COMMIT] ve/proc/cpuset: do not show cpuset in CT

Konstantin Khorenko khorenko at virtuozzo.com
Mon May 23 05:13:26 PDT 2016


The commit is pushed to "branch-rh7-3.10.0-327.18.2.vz7.14.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.18.2.vz7.14.6
------>
commit 80829af44db1aa18b7076ffa2074bc9f948dae3a
Author: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
Date:   Mon May 23 16:13:26 2016 +0400

    ve/proc/cpuset: do not show cpuset in CT
    
    After commit da53619c5d49 ("ve/cpuset: revert changes allowing to
    attach to empty cpusets") one can not create non-empty cpuset
    cgroup in CT. And docker which tries to create cgroup for every
    visible controller creates cpuset cgroup for docker-ct and fails
    to add processes to it.
    
    Cgroup files cpuset.cpus are by design not valid to use
    in our CTs as they pin processes in cgroup to defined range of
    processors, but we don't want processes in container to be able
    to pin itself to cpus they want. We have other mechanism to restric
    CT's cpus usage - cpu.nr_cpus cgroup file, which allows balansing
    containers between cpus. So we faked cpuset.cpus in CT so one can
    not realy pin processes in CT. But that makes all cpuset cgroups
    non-initialized and we also can't attach processes to cgroups. Same
    is valid for cpuset.mems exept we do not have ~nr_mems.
    
    We can just hide cpuset cgroup from /proc/self/cgroup and /proc/cgroups
    to protect it from being used in CT(and also do not mount it in
    libvzctl, which seem to automaticly happen). Docker not seeing
    cpuset will almost silently skip it and work as usual.
    
    v2: add ve_hide_cgroups
    
    https://jira.sw.ru/browse/PSBM-47280
    
    Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
    Reviewed-by: Vladimir Davydov <vdavydov at virtuozzo.com>
---
 kernel/cgroup.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 5afeb59b..5c012f6 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -4912,6 +4912,13 @@ static int __init cgroup_wq_init(void)
 }
 core_initcall(cgroup_wq_init);
 
+static int ve_hide_cgroups(struct cgroupfs_root *root)
+{
+	/* Hide cpuset cgroup in CT for docker */
+	return !ve_is_super(get_exec_env())
+	       && (root->subsys_mask & (1UL << cpuset_subsys_id));
+}
+
 /*
  * proc_cgroup_show()
  *  - Print task's cgroup paths into seq_file, one line for each hierarchy
@@ -4953,6 +4960,8 @@ int proc_cgroup_show(struct seq_file *m, void *v)
 		struct cgroup *cgrp;
 		int count = 0;
 
+		if (ve_hide_cgroups(root))
+			continue;
 		seq_printf(m, "%d:", root->hierarchy_id);
 		for_each_subsys(root, ss)
 			seq_printf(m, "%s%s", count++ ? "," : "", ss->name);
@@ -4997,6 +5006,8 @@ static int proc_cgroupstats_show(struct seq_file *m, void *v)
 
 		if (ss == NULL)
 			continue;
+		if (ve_hide_cgroups(ss->root))
+			continue;
 		num = _cg_virtualized(ss->root->number_of_cgroups);
 		seq_printf(m, "%s\t%d\t%d\t%d\n",
 			   ss->name, ss->root->hierarchy_id,


More information about the Devel mailing list