From: Li Zefan <lizf@cn.fujitsu.com>
To: "akpm >> Andrew Morton" <akpm@linux-foundation.org>
Cc: Paul Menage <menage@google.com>,
Stephane Eranian <eranian@google.com>,
LKML <linux-kernel@vger.kernel.org>,
containers@lists.linux-foundation.org
Subject: [PATCH 3/7] cgroups: Allow to unbind subsystem from a cgroup hierarachy
Date: Fri, 22 Oct 2010 16:10:29 +0800 [thread overview]
Message-ID: <4CC146F5.9060006@cn.fujitsu.com> (raw)
In-Reply-To: <4CC146A4.9090505@cn.fujitsu.com>
This allows us to unbind a cgroup subsystem from a hierarchy
which has sub-cgroups in it.
Due to some complexity, for now subsytems that use css_get/put()
can't be unbound from such a hierarchy.
Usage:
# mount -t cgroup -o cpuset,cpuacct xxx /mnt
# mkdir /mnt/tmp
# echo $$ > /mnt/tmp/tasks
(remove it from the hierarchy)
# mount -o remount,cpuset xxx /mnt
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
kernel/cgroup.c | 76 ++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 61 insertions(+), 15 deletions(-)
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 46df5f8..9ce3fdb 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -1036,19 +1036,42 @@ static int hierarchy_attach_css(struct cgroup *cgrp, void *data)
return ret;
}
-static int hierarchy_update_css_sets(struct cgroup *cgrp, void *data)
+static int hierarchy_remove_css(struct cgroup *cgrp, void *data)
{
- unsigned long added_bits = (unsigned long)data;
+ unsigned long removed_bits = (unsigned long)data;
int i;
+
+ /*
+ * There might be some pointers to the cgroup_subsys_state
+ * that we are going to destroy.
+ */
+ synchronize_rcu();
+
+ for_each_set_bit(i, &removed_bits, CGROUP_SUBSYS_COUNT) {
+ subsys[i]->destroy(subsys[i], cgrp);
+ cgrp->subsys[i] = NULL;
+ }
+
+ return 0;
+}
+
+static void hierarchy_update_css_sets(struct cgroup *cgrp,
+ unsigned long bits, bool add)
+{
struct cg_cgroup_link *link;
+ int i;
write_lock(&css_set_lock);
list_for_each_entry(link, &cgrp->css_sets, cgrp_link_list) {
struct css_set *cg = link->cg;
struct hlist_head *hhead;
- for_each_set_bit(i, &added_bits, CGROUP_SUBSYS_COUNT)
- cg->subsys[i] = cgrp->subsys[i];
+ for_each_set_bit(i, &bits, CGROUP_SUBSYS_COUNT) {
+ if (add)
+ cg->subsys[i] = cgrp->subsys[i];
+ else
+ cg->subsys[i] = dummytop->subsys[i];
+ }
/* rehash */
hlist_del(&cg->hlist);
@@ -1056,7 +1079,21 @@ static int hierarchy_update_css_sets(struct cgroup *cgrp, void *data)
hlist_add_head(&cg->hlist, hhead);
}
write_unlock(&css_set_lock);
+}
+static int hierarchy_add_to_css_sets(struct cgroup *cgrp, void *data)
+{
+ unsigned long added_bits = (unsigned long)data;
+
+ hierarchy_update_css_sets(cgrp, added_bits, true);
+ return 0;
+}
+
+static int hierarchy_remove_from_css_sets(struct cgroup *cgrp, void *data)
+{
+ unsigned long removed_bits = (unsigned long)data;
+
+ hierarchy_update_css_sets(cgrp, removed_bits, false);
return 0;
}
@@ -1076,7 +1113,7 @@ static int hierarchy_populate_dir(struct cgroup *cgrp, void *data)
static int rebind_subsystems(struct cgroupfs_root *root,
unsigned long final_bits)
{
- unsigned long added_bits, removed_bits;
+ unsigned long added_bits, removed_bits, changed_bits;
struct cgroup *cgrp = &root->top_cgroup;
int i;
int err;
@@ -1085,6 +1122,7 @@ static int rebind_subsystems(struct cgroupfs_root *root,
removed_bits = root->actual_subsys_bits & ~final_bits;
added_bits = final_bits & ~root->actual_subsys_bits;
+ changed_bits = removed_bits | added_bits;
/* Check that any added subsystems are currently free */
for_each_set_bit(i, &added_bits, CGROUP_SUBSYS_COUNT) {
@@ -1100,14 +1138,11 @@ static int rebind_subsystems(struct cgroupfs_root *root,
}
}
- /* removing will be supported later */
- if (root->number_of_cgroups > 1 && removed_bits)
- return -EBUSY;
-
if (root->number_of_cgroups > 1) {
- for_each_set_bit(i, &added_bits, CGROUP_SUBSYS_COUNT)
+ for_each_set_bit(i, &changed_bits, CGROUP_SUBSYS_COUNT)
if (!subsys[i]->can_bind)
return -EBUSY;
+ }
for_each_set_bit(i, &added_bits, CGROUP_SUBSYS_COUNT) {
BUG_ON(cgrp->subsys[i]);
@@ -1123,7 +1158,7 @@ static int rebind_subsystems(struct cgroupfs_root *root,
if (err)
goto failed;
- cgroup_walk_hierarchy(hierarchy_update_css_sets,
+ cgroup_walk_hierarchy(hierarchy_add_to_css_sets,
(void *)added_bits, cgrp);
/* Process each subsystem */
@@ -1143,11 +1178,7 @@ static int rebind_subsystems(struct cgroupfs_root *root,
} else if (bit & removed_bits) {
/* We're removing this subsystem */
BUG_ON(ss == NULL);
- BUG_ON(cgrp->subsys[i] != dummytop->subsys[i]);
- BUG_ON(cgrp->subsys[i]->cgroup != cgrp);
mutex_lock(&ss->hierarchy_mutex);
- dummytop->subsys[i]->cgroup = dummytop;
- cgrp->subsys[i] = NULL;
if (ss->bind)
ss->bind(ss, dummytop);
subsys[i]->root = &rootnode;
@@ -1173,6 +1204,21 @@ static int rebind_subsystems(struct cgroupfs_root *root,
}
}
root->subsys_bits = root->actual_subsys_bits = final_bits;
+
+ for_each_set_bit(i, &removed_bits, CGROUP_SUBSYS_COUNT) {
+ BUG_ON(cgrp->subsys[i] != dummytop->subsys[i]);
+ BUG_ON(cgrp->subsys[i]->cgroup != cgrp);
+
+ dummytop->subsys[i]->cgroup = dummytop;
+ cgrp->subsys[i] = NULL;
+ }
+
+ cgroup_walk_hierarchy(hierarchy_remove_from_css_sets,
+ (void *)removed_bits, cgrp);
+
+ cgroup_walk_hierarchy(hierarchy_remove_css,
+ (void *)removed_bits, cgrp);
+
synchronize_rcu();
return 0;
--
1.7.0.1
next prev parent reply other threads:[~2010-10-22 8:09 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-22 8:09 [PATCH 0/7] cgroups: Allow to bind/unbind subsystems to/from non-trival hierarchy Li Zefan
2010-10-22 8:09 ` [PATCH 1/7] cgroups: Shrink struct cgroup_subsys Li Zefan
[not found] ` <4CC146BA.7080009-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-28 23:34 ` Paul Menage
2010-10-28 23:34 ` Paul Menage
[not found] ` <AANLkTikf-1kLStxqi5UjP=vn3pqVBHy0OA7ibeWTkJ5z-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-11-08 5:23 ` Li Zefan
2010-11-08 5:23 ` Li Zefan
2010-11-09 21:05 ` Paul Menage
2010-11-10 0:52 ` Li Zefan
2010-11-10 1:53 ` Paul Menage
[not found] ` <AANLkTinMr7VE4Os7rXWjiHWOVysv=oE0vHKduLWCN0bC-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-11-10 2:06 ` Li Zefan
2010-11-10 2:06 ` Li Zefan
[not found] ` <4CD9FE2D.2070108-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-11-10 2:15 ` Paul Menage
2010-11-10 2:15 ` Paul Menage
[not found] ` <4CD9ECD2.3030805-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-11-10 1:53 ` Paul Menage
[not found] ` <AANLkTim6d1fQLZbkmZST3PTN0RMSs3m=oossF81pYBn9-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-11-10 0:52 ` Li Zefan
[not found] ` <4CD78946.5060405-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-11-09 21:05 ` Paul Menage
[not found] ` <4CC146A4.9090505-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-22 8:09 ` Li Zefan
2010-10-22 8:09 ` [PATCH 2/7] cgroups: Allow to bind a subsystem to a cgroup hierarchy Li Zefan
2010-10-22 8:09 ` Li Zefan
2010-10-22 12:47 ` Peter Zijlstra
2010-10-25 0:59 ` Li Zefan
2010-10-25 0:59 ` Li Zefan
2010-10-22 21:38 ` Matt Helsley
[not found] ` <20101022213819.GK10119-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-10-25 1:23 ` Li Zefan
2010-10-25 1:23 ` Li Zefan
2010-10-28 23:57 ` Paul Menage
2010-10-28 23:57 ` Paul Menage
[not found] ` <4CC146D4.7030009-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-22 12:47 ` Peter Zijlstra
2010-10-22 21:38 ` Matt Helsley
2010-10-28 23:55 ` Paul Menage
2010-10-28 23:55 ` Paul Menage
2010-11-08 5:26 ` Li Zefan
[not found] ` <AANLkTimCD90s+y_6y=LyOL1QqEOOAaT+b2b4guDrzo_g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-11-08 5:26 ` Li Zefan
2010-10-22 8:10 ` [PATCH 3/7] cgroups: Allow to unbind subsystem from a cgroup hierarachy Li Zefan
2010-10-22 8:11 ` [PATCH 4/7] cgroups: Mark some subsystems bindable Li Zefan
2010-10-22 8:11 ` [PATCH 5/7] cgroups: Make freezer subsystem bindable Li Zefan
2010-10-22 8:12 ` [PATCH 6/7] cgroups: Warn if a bindable subsystem calls css_get() Li Zefan
2010-10-22 8:12 ` [PATCH 7/7] cgroups: Update documentation for bindable subsystems Li Zefan
2010-10-22 12:50 ` [PATCH 0/7] cgroups: Allow to bind/unbind subsystems to/from non-trival hierarchy Peter Zijlstra
2010-10-22 8:10 ` Li Zefan [this message]
[not found] ` <4CC146F5.9060006-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-29 0:02 ` [PATCH 3/7] cgroups: Allow to unbind subsystem from a cgroup hierarachy Paul Menage
2010-10-29 0:02 ` Paul Menage
2010-10-22 8:11 ` [PATCH 4/7] cgroups: Mark some subsystems bindable Li Zefan
2010-10-22 8:11 ` [PATCH 5/7] cgroups: Make freezer subsystem bindable Li Zefan
[not found] ` <4CC1473D.9070201-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-22 20:57 ` Matt Helsley
2010-10-22 20:57 ` Matt Helsley
2010-10-22 21:46 ` Matt Helsley
2010-10-29 0:06 ` Paul Menage
[not found] ` <20101022214650.GL10119-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-10-29 0:06 ` Paul Menage
2010-10-22 21:57 ` Matt Helsley
2010-10-25 1:15 ` Li Zefan
[not found] ` <20101022205755.GJ10119-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-10-22 21:46 ` Matt Helsley
2010-10-22 21:57 ` Matt Helsley
2010-10-25 1:15 ` Li Zefan
2010-10-22 8:12 ` [PATCH 6/7] cgroups: Warn if a bindable subsystem calls css_get() Li Zefan
2010-10-29 0:05 ` Paul Menage
[not found] ` <4CC14756.5010504-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-29 0:05 ` Paul Menage
2010-10-22 8:12 ` [PATCH 7/7] cgroups: Update documentation for bindable subsystems Li Zefan
[not found] ` <4CC14769.2000406-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-25 0:36 ` KAMEZAWA Hiroyuki
2010-10-29 0:13 ` Paul Menage
2010-10-25 0:36 ` KAMEZAWA Hiroyuki
[not found] ` <20101025093617.7de750c0.kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2010-10-25 0:52 ` Li Zefan
2010-10-25 0:52 ` Li Zefan
2010-10-25 0:56 ` Li Zefan
[not found] ` <4CC4D4B9.3020807-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-25 0:56 ` Li Zefan
2010-10-29 0:13 ` Paul Menage
2010-10-29 0:15 ` Paul Menage
[not found] ` <AANLkTinbtLkF=haFeDkzecEWv_FE9jG4TefiptSnZcPi-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-10-29 0:15 ` Paul Menage
2010-11-08 5:27 ` Li Zefan
2010-11-08 5:27 ` Li Zefan
2010-10-22 12:50 ` [PATCH 0/7] cgroups: Allow to bind/unbind subsystems to/from non-trival hierarchy Peter Zijlstra
2010-10-25 1:07 ` Li Zefan
2010-10-25 1:07 ` Li Zefan
2010-10-28 23:33 ` Paul Menage
[not found] ` <4CC4D84C.5000705-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
2010-10-28 23:33 ` Paul Menage
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=4CC146F5.9060006@cn.fujitsu.com \
--to=lizf@cn.fujitsu.com \
--cc=akpm@linux-foundation.org \
--cc=containers@lists.linux-foundation.org \
--cc=eranian@google.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.