[RFC PATCH 1/9] cgroup: introduce cgroupfs_root flag ROOT_NAMESPACE
Gao feng
gaofeng at cn.fujitsu.com
Mon Dec 17 06:43:27 UTC 2012
1. add a new flag bit ROOT_NAMESPACE for cgroupfs_root,
this bit is used for identifying whether this hierarchy
is mounted in container(pid namespace).
2. add a field pid_ns in cgroupfs_root,points to which
pidns this hierarchy belongs to.
Signed-off-by: Gao feng <gaofeng at cn.fujitsu.com>
---
kernel/cgroup.c | 17 +++++++++++++++--
1 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index f34c41b..7d095b7 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -129,6 +129,9 @@ struct cgroupfs_root {
/* Tracks how many cgroups are currently defined in hierarchy.*/
int number_of_cgroups;
+ /* The pid namespace this hierarchy belongs to */
+ struct pid_namespace *pid_ns;
+
/* A list running through the active hierarchies */
struct list_head root_list;
@@ -153,7 +156,9 @@ struct cgroupfs_root {
* subsystems that are otherwise unattached - it never has more than a
* single cgroup, and all tasks are part of that cgroup.
*/
-static struct cgroupfs_root rootnode;
+static struct cgroupfs_root rootnode = {
+ .pid_ns = &init_pid_ns,
+};
/*
* cgroupfs file entry, pointed to from leaf dentry->d_fsdata.
@@ -286,6 +291,7 @@ inline int cgroup_is_removed(const struct cgroup *cgrp)
enum {
ROOT_NOPREFIX, /* mounted subsystems have no named prefix */
ROOT_XATTR, /* supports extended attributes */
+ ROOT_NAMESPACE, /* mounted in container */
};
static int cgroup_is_releasable(const struct cgroup *cgrp)
@@ -1100,6 +1106,8 @@ static int cgroup_show_options(struct seq_file *seq, struct dentry *dentry)
seq_puts(seq, ",noprefix");
if (test_bit(ROOT_XATTR, &root->flags))
seq_puts(seq, ",xattr");
+ if (test_bit(ROOT_NAMESPACE, &root->flags))
+ seq_puts(seq, ",namespace");
if (strlen(root->release_agent_path))
seq_printf(seq, ",release_agent=%s", root->release_agent_path);
if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags))
@@ -1342,7 +1350,7 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data)
removed_mask = root->subsys_mask & ~opts.subsys_mask;
/* Don't allow flags or name to change at remount */
- if (opts.flags != root->flags ||
+ if (opts.flags != (root->flags & ~(1UL << ROOT_NAMESPACE)) ||
(opts.name && strcmp(opts.name, root->name))) {
ret = -EINVAL;
drop_parsed_module_refcounts(opts.subsys_mask);
@@ -1479,6 +1487,10 @@ static struct cgroupfs_root *cgroup_root_from_opts(struct cgroup_sb_opts *opts)
root->subsys_mask = opts->subsys_mask;
root->flags = opts->flags;
ida_init(&root->cgroup_ida);
+ root->pid_ns = get_pid_ns(task_active_pid_ns(current));
+ if (root->pid_ns != &init_pid_ns)
+ set_bit(ROOT_NAMESPACE, &root->flags);
+
if (opts->release_agent)
strcpy(root->release_agent_path, opts->release_agent);
if (opts->name)
@@ -1498,6 +1510,7 @@ static void cgroup_drop_root(struct cgroupfs_root *root)
ida_remove(&hierarchy_ida, root->hierarchy_id);
spin_unlock(&hierarchy_id_lock);
ida_destroy(&root->cgroup_ida);
+ put_pid_ns(root->pid_ns);
kfree(root);
}
--
1.7.7.6
More information about the Containers
mailing list