summaryrefslogtreecommitdiffstats
path: root/kernel/cgroup/cgroup.c
diff options
context:
space:
mode:
authorRoman Gushchin <guro@fb.com>2017-08-02 12:55:29 -0400
committerTejun Heo <tj@kernel.org>2017-08-02 15:05:19 -0400
commit0679dee03c6d706d57145ea92c23d08fa10a1999 (patch)
treec820222fb59847005601bfbb087f6dfb693af5c4 /kernel/cgroup/cgroup.c
parentc705a00d77457b44ba3790fdf0627ecb8593a254 (diff)
cgroup: keep track of number of descent cgroups
Keep track of the number of online and dying descent cgroups. This data will be used later to add an ability to control cgroup hierarchy (limit the depth and the number of descent cgroups) and display hierarchy stats. Signed-off-by: Roman Gushchin <guro@fb.com> Suggested-by: Tejun Heo <tj@kernel.org> Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Zefan Li <lizefan@huawei.com> Cc: Waiman Long <longman@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: kernel-team@fb.com Cc: cgroups@vger.kernel.org Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org
Diffstat (limited to 'kernel/cgroup/cgroup.c')
-rw-r--r--kernel/cgroup/cgroup.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 85f6a112344b..cfdbb1e780de 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -4408,9 +4408,15 @@ static void css_release_work_fn(struct work_struct *work)
4408 if (ss->css_released) 4408 if (ss->css_released)
4409 ss->css_released(css); 4409 ss->css_released(css);
4410 } else { 4410 } else {
4411 struct cgroup *tcgrp;
4412
4411 /* cgroup release path */ 4413 /* cgroup release path */
4412 trace_cgroup_release(cgrp); 4414 trace_cgroup_release(cgrp);
4413 4415
4416 for (tcgrp = cgroup_parent(cgrp); tcgrp;
4417 tcgrp = cgroup_parent(tcgrp))
4418 tcgrp->nr_dying_descendants--;
4419
4414 cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id); 4420 cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id);
4415 cgrp->id = -1; 4421 cgrp->id = -1;
4416 4422
@@ -4609,9 +4615,13 @@ static struct cgroup *cgroup_create(struct cgroup *parent)
4609 cgrp->root = root; 4615 cgrp->root = root;
4610 cgrp->level = level; 4616 cgrp->level = level;
4611 4617
4612 for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp)) 4618 for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp)) {
4613 cgrp->ancestor_ids[tcgrp->level] = tcgrp->id; 4619 cgrp->ancestor_ids[tcgrp->level] = tcgrp->id;
4614 4620
4621 if (tcgrp != cgrp)
4622 tcgrp->nr_descendants++;
4623 }
4624
4615 if (notify_on_release(parent)) 4625 if (notify_on_release(parent))
4616 set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); 4626 set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);
4617 4627
@@ -4817,7 +4827,7 @@ static void kill_css(struct cgroup_subsys_state *css)
4817static int cgroup_destroy_locked(struct cgroup *cgrp) 4827static int cgroup_destroy_locked(struct cgroup *cgrp)
4818 __releases(&cgroup_mutex) __acquires(&cgroup_mutex) 4828 __releases(&cgroup_mutex) __acquires(&cgroup_mutex)
4819{ 4829{
4820 struct cgroup *parent = cgroup_parent(cgrp); 4830 struct cgroup *tcgrp, *parent = cgroup_parent(cgrp);
4821 struct cgroup_subsys_state *css; 4831 struct cgroup_subsys_state *css;
4822 struct cgrp_cset_link *link; 4832 struct cgrp_cset_link *link;
4823 int ssid; 4833 int ssid;
@@ -4865,6 +4875,11 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
4865 if (parent && cgroup_is_threaded(cgrp)) 4875 if (parent && cgroup_is_threaded(cgrp))
4866 parent->nr_threaded_children--; 4876 parent->nr_threaded_children--;
4867 4877
4878 for (tcgrp = cgroup_parent(cgrp); tcgrp; tcgrp = cgroup_parent(tcgrp)) {
4879 tcgrp->nr_descendants--;
4880 tcgrp->nr_dying_descendants++;
4881 }
4882
4868 cgroup1_check_for_release(cgroup_parent(cgrp)); 4883 cgroup1_check_for_release(cgroup_parent(cgrp));
4869 4884
4870 /* put the base reference */ 4885 /* put the base reference */