aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cgroup.c
diff options
context:
space:
mode:
authorDaniel Wagner <daniel.wagner@bmw-carit.de>2012-09-13 03:50:55 -0400
committerTejun Heo <tj@kernel.org>2012-09-14 12:57:32 -0400
commitbe45c900fdc2c66baad5a7703fb8136991d88aeb (patch)
treed787ad6f2d2a762c6ec581123b7325ebd62857f1 /kernel/cgroup.c
parent51e4e7faba786d33e5e33f8776c5027a1c8d6fb7 (diff)
cgroup: Remove CGROUP_BUILTIN_SUBSYS_COUNT
CGROUP_BUILTIN_SUBSYS_COUNT is used as start index or stop index when looping over the subsys array looking either at the builtin or the module subsystems. Since all the builtin subsystems have an id which is lower then CGROUP_BUILTIN_SUBSYS_COUNT we know that any module will have an id larger than CGROUP_BUILTIN_SUBSYS_COUNT. In short the ids are sorted. We are about to change id assignment to happen only at compile time later in this series. That means we can't rely on the above trick since all ids will always be defined at compile time. Furthermore, ordering the builtin subsystems and the module subsystems is not really necessary. So we need a different way to know which subsystem is a builtin or a module one. We can use the subsys[]->module pointer for this. Any place where we need to know if a subsys is module we just check for the pointer. If it is NULL then the subsystem is a builtin one. With this we are able to drop the CGROUP_BUILTIN_SUBSYS_COUNT enum. Though we need to introduce a temporary placeholder so that we don't get a compilation error when only CONFIG_CGROUP is selected and no single controller. An empty enum definition is not valid. Later in this series we are able to remove the placeholder again. And with this change we get a fix for this: kernel/cgroup.c: In function ‘cgroup_load_subsys’: kernel/cgroup.c:4326:38: warning: array subscript is below array bounds [-Warray-bounds] when CONFIG_CGROUP=y and no built in controller was enabled. Signed-off-by: Daniel Wagner <daniel.wagner@bmw-carit.de> Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Cc: Gao feng <gaofeng@cn.fujitsu.com> Cc: Jamal Hadi Salim <jhs@mojatatu.com> Cc: John Fastabend <john.r.fastabend@intel.com> Cc: netdev@vger.kernel.org Cc: cgroups@vger.kernel.org
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r--kernel/cgroup.c68
1 files changed, 40 insertions, 28 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index ced292d720b9..1b18090269ad 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -88,7 +88,7 @@ static DEFINE_MUTEX(cgroup_root_mutex);
88 88
89/* 89/*
90 * Generate an array of cgroup subsystem pointers. At boot time, this is 90 * Generate an array of cgroup subsystem pointers. At boot time, this is
91 * populated up to CGROUP_BUILTIN_SUBSYS_COUNT, and modular subsystems are 91 * populated with the built in subsystems, and modular subsystems are
92 * registered after that. The mutable section of this array is protected by 92 * registered after that. The mutable section of this array is protected by
93 * cgroup_mutex. 93 * cgroup_mutex.
94 */ 94 */
@@ -1321,7 +1321,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
1321 * take duplicate reference counts on a subsystem that's already used, 1321 * take duplicate reference counts on a subsystem that's already used,
1322 * but rebind_subsystems handles this case. 1322 * but rebind_subsystems handles this case.
1323 */ 1323 */
1324 for (i = CGROUP_BUILTIN_SUBSYS_COUNT; i < CGROUP_SUBSYS_COUNT; i++) { 1324 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
1325 unsigned long bit = 1UL << i; 1325 unsigned long bit = 1UL << i;
1326 1326
1327 if (!(bit & opts->subsys_mask)) 1327 if (!(bit & opts->subsys_mask))
@@ -1337,7 +1337,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
1337 * raced with a module_delete call, and to the user this is 1337 * raced with a module_delete call, and to the user this is
1338 * essentially a "subsystem doesn't exist" case. 1338 * essentially a "subsystem doesn't exist" case.
1339 */ 1339 */
1340 for (i--; i >= CGROUP_BUILTIN_SUBSYS_COUNT; i--) { 1340 for (i--; i >= 0; i--) {
1341 /* drop refcounts only on the ones we took */ 1341 /* drop refcounts only on the ones we took */
1342 unsigned long bit = 1UL << i; 1342 unsigned long bit = 1UL << i;
1343 1343
@@ -1354,7 +1354,7 @@ static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts)
1354static void drop_parsed_module_refcounts(unsigned long subsys_mask) 1354static void drop_parsed_module_refcounts(unsigned long subsys_mask)
1355{ 1355{
1356 int i; 1356 int i;
1357 for (i = CGROUP_BUILTIN_SUBSYS_COUNT; i < CGROUP_SUBSYS_COUNT; i++) { 1357 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
1358 unsigned long bit = 1UL << i; 1358 unsigned long bit = 1UL << i;
1359 1359
1360 if (!(bit & subsys_mask)) 1360 if (!(bit & subsys_mask))
@@ -4442,8 +4442,7 @@ int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss)
4442 * since cgroup_init_subsys will have already taken care of it. 4442 * since cgroup_init_subsys will have already taken care of it.
4443 */ 4443 */
4444 if (ss->module == NULL) { 4444 if (ss->module == NULL) {
4445 /* a few sanity checks */ 4445 /* a sanity check */
4446 BUG_ON(ss->subsys_id >= CGROUP_BUILTIN_SUBSYS_COUNT);
4447 BUG_ON(subsys[ss->subsys_id] != ss); 4446 BUG_ON(subsys[ss->subsys_id] != ss);
4448 return 0; 4447 return 0;
4449 } 4448 }
@@ -4457,7 +4456,7 @@ int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss)
4457 */ 4456 */
4458 mutex_lock(&cgroup_mutex); 4457 mutex_lock(&cgroup_mutex);
4459 /* find the first empty slot in the array */ 4458 /* find the first empty slot in the array */
4460 for (i = CGROUP_BUILTIN_SUBSYS_COUNT; i < CGROUP_SUBSYS_COUNT; i++) { 4459 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
4461 if (subsys[i] == NULL) 4460 if (subsys[i] == NULL)
4462 break; 4461 break;
4463 } 4462 }
@@ -4560,7 +4559,6 @@ void cgroup_unload_subsys(struct cgroup_subsys *ss)
4560 4559
4561 mutex_lock(&cgroup_mutex); 4560 mutex_lock(&cgroup_mutex);
4562 /* deassign the subsys_id */ 4561 /* deassign the subsys_id */
4563 BUG_ON(ss->subsys_id < CGROUP_BUILTIN_SUBSYS_COUNT);
4564 subsys[ss->subsys_id] = NULL; 4562 subsys[ss->subsys_id] = NULL;
4565 4563
4566 /* remove subsystem from rootnode's list of subsystems */ 4564 /* remove subsystem from rootnode's list of subsystems */
@@ -4623,10 +4621,13 @@ int __init cgroup_init_early(void)
4623 for (i = 0; i < CSS_SET_TABLE_SIZE; i++) 4621 for (i = 0; i < CSS_SET_TABLE_SIZE; i++)
4624 INIT_HLIST_HEAD(&css_set_table[i]); 4622 INIT_HLIST_HEAD(&css_set_table[i]);
4625 4623
4626 /* at bootup time, we don't worry about modular subsystems */ 4624 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
4627 for (i = 0; i < CGROUP_BUILTIN_SUBSYS_COUNT; i++) {
4628 struct cgroup_subsys *ss = subsys[i]; 4625 struct cgroup_subsys *ss = subsys[i];
4629 4626
4627 /* at bootup time, we don't worry about modular subsystems */
4628 if (!ss || ss->module)
4629 continue;
4630
4630 BUG_ON(!ss->name); 4631 BUG_ON(!ss->name);
4631 BUG_ON(strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN); 4632 BUG_ON(strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN);
4632 BUG_ON(!ss->create); 4633 BUG_ON(!ss->create);
@@ -4659,9 +4660,12 @@ int __init cgroup_init(void)
4659 if (err) 4660 if (err)
4660 return err; 4661 return err;
4661 4662
4662 /* at bootup time, we don't worry about modular subsystems */ 4663 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
4663 for (i = 0; i < CGROUP_BUILTIN_SUBSYS_COUNT; i++) {
4664 struct cgroup_subsys *ss = subsys[i]; 4664 struct cgroup_subsys *ss = subsys[i];
4665
4666 /* at bootup time, we don't worry about modular subsystems */
4667 if (!ss || ss->module)
4668 continue;
4665 if (!ss->early_init) 4669 if (!ss->early_init)
4666 cgroup_init_subsys(ss); 4670 cgroup_init_subsys(ss);
4667 if (ss->use_id) 4671 if (ss->use_id)
@@ -4856,13 +4860,16 @@ void cgroup_fork_callbacks(struct task_struct *child)
4856{ 4860{
4857 if (need_forkexit_callback) { 4861 if (need_forkexit_callback) {
4858 int i; 4862 int i;
4859 /* 4863 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
4860 * forkexit callbacks are only supported for builtin
4861 * subsystems, and the builtin section of the subsys array is
4862 * immutable, so we don't need to lock the subsys array here.
4863 */
4864 for (i = 0; i < CGROUP_BUILTIN_SUBSYS_COUNT; i++) {
4865 struct cgroup_subsys *ss = subsys[i]; 4864 struct cgroup_subsys *ss = subsys[i];
4865
4866 /*
4867 * forkexit callbacks are only supported for
4868 * builtin subsystems.
4869 */
4870 if (!ss || ss->module)
4871 continue;
4872
4866 if (ss->fork) 4873 if (ss->fork)
4867 ss->fork(child); 4874 ss->fork(child);
4868 } 4875 }
@@ -4967,12 +4974,13 @@ void cgroup_exit(struct task_struct *tsk, int run_callbacks)
4967 tsk->cgroups = &init_css_set; 4974 tsk->cgroups = &init_css_set;
4968 4975
4969 if (run_callbacks && need_forkexit_callback) { 4976 if (run_callbacks && need_forkexit_callback) {
4970 /* 4977 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
4971 * modular subsystems can't use callbacks, so no need to lock
4972 * the subsys array
4973 */
4974 for (i = 0; i < CGROUP_BUILTIN_SUBSYS_COUNT; i++) {
4975 struct cgroup_subsys *ss = subsys[i]; 4978 struct cgroup_subsys *ss = subsys[i];
4979
4980 /* modular subsystems can't use callbacks */
4981 if (!ss || ss->module)
4982 continue;
4983
4976 if (ss->exit) { 4984 if (ss->exit) {
4977 struct cgroup *old_cgrp = 4985 struct cgroup *old_cgrp =
4978 rcu_dereference_raw(cg->subsys[i])->cgroup; 4986 rcu_dereference_raw(cg->subsys[i])->cgroup;
@@ -5158,13 +5166,17 @@ static int __init cgroup_disable(char *str)
5158 while ((token = strsep(&str, ",")) != NULL) { 5166 while ((token = strsep(&str, ",")) != NULL) {
5159 if (!*token) 5167 if (!*token)
5160 continue; 5168 continue;
5161 /* 5169 for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
5162 * cgroup_disable, being at boot time, can't know about module
5163 * subsystems, so we don't worry about them.
5164 */
5165 for (i = 0; i < CGROUP_BUILTIN_SUBSYS_COUNT; i++) {
5166 struct cgroup_subsys *ss = subsys[i]; 5170 struct cgroup_subsys *ss = subsys[i];
5167 5171
5172 /*
5173 * cgroup_disable, being at boot time, can't
5174 * know about module subsystems, so we don't
5175 * worry about them.
5176 */
5177 if (!ss || ss->module)
5178 continue;
5179
5168 if (!strcmp(token, ss->name)) { 5180 if (!strcmp(token, ss->name)) {
5169 ss->disabled = 1; 5181 ss->disabled = 1;
5170 printk(KERN_INFO "Disabling %s control group" 5182 printk(KERN_INFO "Disabling %s control group"