From: "Serge E. Hallyn" <serge.hallyn@canonical.com>
To: linux-kernel@vger.kernel.org, containers@lists.linux-foundation.org
Cc: Daniel Lezcano <daniel.lezcano@free.fr>,
"Serge E. Hallyn" <serge.hallyn@canonical.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Paul Menage <menage@google.com>
Subject: [PATCH 1/3] cgroup : add clone_children control file
Date: Thu, 29 Jul 2010 14:56:29 -0500 [thread overview]
Message-ID: <20100729195629.GA13378@hallyn.com> (raw)
This patch is sent as an answer to a previous thread around the ns_cgroup.
https://lists.linux-foundation.org/pipermail/containers/2009-June/018627.html
It adds a control file 'clone_children' for a cgroup.
This control file is a boolean specifying if the child cgroup should
be a clone of the parent cgroup or not. The default value is 'false'.
This flag makes the child cgroup to call the post_clone callback of all
the subsystem, if it is available.
At present, the cpuset is the only one which had implemented the post_clone
callback.
The option can be set at mount time by specifying the 'clone_children' mount
option.
Signed-off-by: Daniel Lezcano <daniel.lezcano@free.fr>
Signed-off-by: Serge E. Hallyn <serge.hallyn@canonical.com>
Cc: Eric W. Biederman <ebiederm@xmission.com>
Cc: Paul Menage <menage@google.com>
---
Documentation/cgroups/cgroups.txt | 14 +++++++++++-
include/linux/cgroup.h | 4 +++
kernel/cgroup.c | 39 +++++++++++++++++++++++++++++++++++++
3 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/Documentation/cgroups/cgroups.txt b/Documentation/cgroups/cgroups.txt
index b34823f..190018b 100644
--- a/Documentation/cgroups/cgroups.txt
+++ b/Documentation/cgroups/cgroups.txt
@@ -18,7 +18,8 @@ CONTENTS:
1.2 Why are cgroups needed ?
1.3 How are cgroups implemented ?
1.4 What does notify_on_release do ?
- 1.5 How do I use cgroups ?
+ 1.5 What does clone_children do ?
+ 1.6 How do I use cgroups ?
2. Usage Examples and Syntax
2.1 Basic Usage
2.2 Attaching processes
@@ -293,7 +294,16 @@ notify_on_release in the root cgroup at system boot is disabled
value of their parents notify_on_release setting. The default value of
a cgroup hierarchy's release_agent path is empty.
-1.5 How do I use cgroups ?
+1.5 What does clone_children do ?
+---------------------------------
+
+If the clone_children flag is enabled (1) in a cgroup, then all
+cgroups created beneath will call the post_clone callbacks for each
+subsystem of the newly created cgroup. Usually when this callback is
+implemented for a subsystem, it copies the values of the parent
+subsystem, this is the case for the cpuset.
+
+1.6 How do I use cgroups ?
--------------------------
To start a new job that is to be contained within a cgroup, using
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index e3d00fd..f3cbd73 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -154,6 +154,10 @@ enum {
* A thread in rmdir() is wating for this cgroup.
*/
CGRP_WAIT_ON_RMDIR,
+ /*
+ * Clone cgroup values when creating a new child cgroup
+ */
+ CGRP_CLONE_CHILDREN,
};
/* which pidlist file are we talking about? */
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 3ac6f5b..dfbff78 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -229,6 +229,7 @@ inline int cgroup_is_removed(const struct cgroup *cgrp)
/* bits in struct cgroupfs_root flags field */
enum {
ROOT_NOPREFIX, /* mounted subsystems have no named prefix */
+ ROOT_CLONE_CHILDREN, /* mounted subsystems will inherit from parent */
};
static int cgroup_is_releasable(const struct cgroup *cgrp)
@@ -244,6 +245,11 @@ static int notify_on_release(const struct cgroup *cgrp)
return test_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);
}
+static int clone_children(const struct cgroup *cgrp)
+{
+ return test_bit(CGRP_CLONE_CHILDREN, &cgrp->flags);
+}
+
/*
* for_each_subsys() allows you to iterate on each subsystem attached to
* an active hierarchy
@@ -1038,6 +1044,8 @@ static int cgroup_show_options(struct seq_file *seq, struct vfsmount *vfs)
seq_printf(seq, ",%s", ss->name);
if (test_bit(ROOT_NOPREFIX, &root->flags))
seq_puts(seq, ",noprefix");
+ if (test_bit(ROOT_CLONE_CHILDREN, &root->flags))
+ seq_puts(seq, ",clone_children");
if (strlen(root->release_agent_path))
seq_printf(seq, ",release_agent=%s", root->release_agent_path);
if (strlen(root->name))
@@ -1097,6 +1105,8 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
opts->none = true;
} else if (!strcmp(token, "noprefix")) {
set_bit(ROOT_NOPREFIX, &opts->flags);
+ } else if (!strcmp(token, "clone_children")) {
+ set_bit(ROOT_CLONE_CHILDREN, &opts->flags);
} else if (!strncmp(token, "release_agent=", 14)) {
/* Specifying two release agents is forbidden */
if (opts->release_agent)
@@ -1357,6 +1367,8 @@ static struct cgroupfs_root *cgroup_root_from_opts(struct cgroup_sb_opts *opts)
strcpy(root->release_agent_path, opts->release_agent);
if (opts->name)
strcpy(root->name, opts->name);
+ if (test_bit(ROOT_CLONE_CHILDREN, &opts->flags))
+ set_bit(CGRP_CLONE_CHILDREN, &root->top_cgroup.flags);
return root;
}
@@ -3150,6 +3162,23 @@ fail:
return ret;
}
+static u64 cgroup_clone_children_read(struct cgroup *cgrp,
+ struct cftype *cft)
+{
+ return clone_children(cgrp);
+}
+
+static int cgroup_clone_children_write(struct cgroup *cgrp,
+ struct cftype *cft,
+ u64 val)
+{
+ if (val)
+ set_bit(CGRP_CLONE_CHILDREN, &cgrp->flags);
+ else
+ clear_bit(CGRP_CLONE_CHILDREN, &cgrp->flags);
+ return 0;
+}
+
/*
* for the common functions, 'private' gives the type of file
*/
@@ -3180,6 +3209,11 @@ static struct cftype files[] = {
.write_string = cgroup_write_event_control,
.mode = S_IWUGO,
},
+ {
+ .name = "cgroup.clone_children",
+ .read_u64 = cgroup_clone_children_read,
+ .write_u64 = cgroup_clone_children_write,
+ },
};
static struct cftype cft_release_agent = {
@@ -3309,6 +3343,9 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
if (notify_on_release(parent))
set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);
+ if (clone_children(parent))
+ set_bit(CGRP_CLONE_CHILDREN, &cgrp->flags);
+
for_each_subsys(root, ss) {
struct cgroup_subsys_state *css = ss->create(ss, cgrp);
@@ -3323,6 +3360,8 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
goto err_destroy;
}
/* At error, ->destroy() callback has to free assigned ID. */
+ if (clone_children(parent) && ss->post_clone)
+ ss->post_clone(ss, cgrp);
}
cgroup_lock_hierarchy(root);
--
1.7.0.4
next reply other threads:[~2010-07-29 19:56 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-29 19:56 Serge E. Hallyn [this message]
2010-07-29 19:57 ` [PATCH 2/3] cgroup : make the mount options parsing more accurate Serge E. Hallyn
[not found] ` <20100729195736.GA19015-A9i7LUbDfNHQT0dZR+AlfA@public.gmane.org>
2010-08-03 8:30 ` Li Zefan
2010-08-03 8:30 ` Li Zefan
2010-07-29 19:58 ` [PATCH 3/3] cgroup : remove the ns_cgroup Serge E. Hallyn
2010-07-29 21:40 ` Matt Helsley
[not found] ` <20100729214008.GA2785-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-07-29 22:39 ` Serge E. Hallyn
2010-07-29 22:39 ` Serge E. Hallyn
2010-07-29 23:00 ` Remaining work for userns (WAS Re: [PATCH 3/3] cgroup : remove the ns_cgroup) Matt Helsley
[not found] ` <20100729230052.GB2785-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-07-29 23:23 ` Serge E. Hallyn
2010-07-29 23:23 ` Serge E. Hallyn
2010-07-31 0:23 ` Remaining work for userns Eric W. Biederman
[not found] ` <20100729232352.GC13902-A9i7LUbDfNHQT0dZR+AlfA@public.gmane.org>
2010-07-31 0:23 ` Eric W. Biederman
[not found] ` <20100729223957.GA12387-A9i7LUbDfNHQT0dZR+AlfA@public.gmane.org>
2010-07-29 23:00 ` Remaining work for userns (WAS Re: [PATCH 3/3] cgroup : remove the ns_cgroup) Matt Helsley
2010-07-29 21:46 ` [PATCH 3/3] cgroup : remove the ns_cgroup Paul Menage
[not found] ` <20100729195812.GB19015-A9i7LUbDfNHQT0dZR+AlfA@public.gmane.org>
2010-07-29 21:40 ` Matt Helsley
2010-07-29 21:46 ` Paul Menage
2010-08-03 8:31 ` Li Zefan
2010-08-03 8:31 ` Li Zefan
[not found] ` <20100729195629.GA13378-A9i7LUbDfNHQT0dZR+AlfA@public.gmane.org>
2010-07-29 19:57 ` [PATCH 2/3] cgroup : make the mount options parsing more accurate Serge E. Hallyn
2010-07-29 19:58 ` [PATCH 3/3] cgroup : remove the ns_cgroup Serge E. Hallyn
2010-08-03 8:30 ` [PATCH 1/3] cgroup : add clone_children control file Li Zefan
2010-08-03 8:30 ` Li Zefan
-- strict thread matches above, loose matches on Subject: below --
2010-09-04 7:31 Daniel Lezcano
[not found] ` <1283585466-30265-1-git-send-email-daniel.lezcano-GANU6spQydw@public.gmane.org>
2010-09-07 19:34 ` Paul Menage
[not found] ` <AANLkTi=hM66-F-U2-ZoiDgksh51hq3MLb5aSLmwsShwi-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-09-07 20:23 ` Daniel Lezcano
[not found] ` <4C869F48.9050603-GANU6spQydw@public.gmane.org>
2010-09-07 20:26 ` Paul Menage
2010-09-07 21:13 ` Daniel Lezcano
[not found] ` <4C86AAE1.2030608-GANU6spQydw@public.gmane.org>
2010-09-07 21:22 ` Paul Menage
[not found] ` <AANLkTik+wrNXZtcD_0OcGQUtcZbu7SVNUUaTKHqTBf8m-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-09-07 23:35 ` Daniel Lezcano
2010-07-29 19:56 Serge E. Hallyn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100729195629.GA13378@hallyn.com \
--to=serge.hallyn@canonical.com \
--cc=containers@lists.linux-foundation.org \
--cc=daniel.lezcano@free.fr \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=menage@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.