diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cgroup.c | 68 |
1 files changed, 30 insertions, 38 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index abf7248f501a..4c475ce4e222 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -384,6 +384,25 @@ static int allocate_cg_links(int count, struct list_head *tmp) | |||
384 | return 0; | 384 | return 0; |
385 | } | 385 | } |
386 | 386 | ||
387 | /** | ||
388 | * link_css_set - a helper function to link a css_set to a cgroup | ||
389 | * @tmp_cg_links: cg_cgroup_link objects allocated by allocate_cg_links() | ||
390 | * @cg: the css_set to be linked | ||
391 | * @cgrp: the destination cgroup | ||
392 | */ | ||
393 | static void link_css_set(struct list_head *tmp_cg_links, | ||
394 | struct css_set *cg, struct cgroup *cgrp) | ||
395 | { | ||
396 | struct cg_cgroup_link *link; | ||
397 | |||
398 | BUG_ON(list_empty(tmp_cg_links)); | ||
399 | link = list_first_entry(tmp_cg_links, struct cg_cgroup_link, | ||
400 | cgrp_link_list); | ||
401 | link->cg = cg; | ||
402 | list_move(&link->cgrp_link_list, &cgrp->css_sets); | ||
403 | list_add(&link->cg_link_list, &cg->cg_links); | ||
404 | } | ||
405 | |||
387 | /* | 406 | /* |
388 | * find_css_set() takes an existing cgroup group and a | 407 | * find_css_set() takes an existing cgroup group and a |
389 | * cgroup object, and returns a css_set object that's | 408 | * cgroup object, and returns a css_set object that's |
@@ -399,7 +418,6 @@ static struct css_set *find_css_set( | |||
399 | int i; | 418 | int i; |
400 | 419 | ||
401 | struct list_head tmp_cg_links; | 420 | struct list_head tmp_cg_links; |
402 | struct cg_cgroup_link *link; | ||
403 | 421 | ||
404 | struct hlist_head *hhead; | 422 | struct hlist_head *hhead; |
405 | 423 | ||
@@ -444,26 +462,11 @@ static struct css_set *find_css_set( | |||
444 | * only do it for the first subsystem in each | 462 | * only do it for the first subsystem in each |
445 | * hierarchy | 463 | * hierarchy |
446 | */ | 464 | */ |
447 | if (ss->root->subsys_list.next == &ss->sibling) { | 465 | if (ss->root->subsys_list.next == &ss->sibling) |
448 | BUG_ON(list_empty(&tmp_cg_links)); | 466 | link_css_set(&tmp_cg_links, res, cgrp); |
449 | link = list_entry(tmp_cg_links.next, | ||
450 | struct cg_cgroup_link, | ||
451 | cgrp_link_list); | ||
452 | list_del(&link->cgrp_link_list); | ||
453 | list_add(&link->cgrp_link_list, &cgrp->css_sets); | ||
454 | link->cg = res; | ||
455 | list_add(&link->cg_link_list, &res->cg_links); | ||
456 | } | ||
457 | } | ||
458 | if (list_empty(&rootnode.subsys_list)) { | ||
459 | link = list_entry(tmp_cg_links.next, | ||
460 | struct cg_cgroup_link, | ||
461 | cgrp_link_list); | ||
462 | list_del(&link->cgrp_link_list); | ||
463 | list_add(&link->cgrp_link_list, &dummytop->css_sets); | ||
464 | link->cg = res; | ||
465 | list_add(&link->cg_link_list, &res->cg_links); | ||
466 | } | 467 | } |
468 | if (list_empty(&rootnode.subsys_list)) | ||
469 | link_css_set(&tmp_cg_links, res, dummytop); | ||
467 | 470 | ||
468 | BUG_ON(!list_empty(&tmp_cg_links)); | 471 | BUG_ON(!list_empty(&tmp_cg_links)); |
469 | 472 | ||
@@ -988,7 +991,7 @@ static int cgroup_get_sb(struct file_system_type *fs_type, | |||
988 | root = NULL; | 991 | root = NULL; |
989 | } else { | 992 | } else { |
990 | /* New superblock */ | 993 | /* New superblock */ |
991 | struct cgroup *cgrp = &root->top_cgroup; | 994 | struct cgroup *root_cgrp = &root->top_cgroup; |
992 | struct inode *inode; | 995 | struct inode *inode; |
993 | int i; | 996 | int i; |
994 | 997 | ||
@@ -1029,7 +1032,7 @@ static int cgroup_get_sb(struct file_system_type *fs_type, | |||
1029 | list_add(&root->root_list, &roots); | 1032 | list_add(&root->root_list, &roots); |
1030 | root_count++; | 1033 | root_count++; |
1031 | 1034 | ||
1032 | sb->s_root->d_fsdata = &root->top_cgroup; | 1035 | sb->s_root->d_fsdata = root_cgrp; |
1033 | root->top_cgroup.dentry = sb->s_root; | 1036 | root->top_cgroup.dentry = sb->s_root; |
1034 | 1037 | ||
1035 | /* Link the top cgroup in this hierarchy into all | 1038 | /* Link the top cgroup in this hierarchy into all |
@@ -1040,29 +1043,18 @@ static int cgroup_get_sb(struct file_system_type *fs_type, | |||
1040 | struct hlist_node *node; | 1043 | struct hlist_node *node; |
1041 | struct css_set *cg; | 1044 | struct css_set *cg; |
1042 | 1045 | ||
1043 | hlist_for_each_entry(cg, node, hhead, hlist) { | 1046 | hlist_for_each_entry(cg, node, hhead, hlist) |
1044 | struct cg_cgroup_link *link; | 1047 | link_css_set(&tmp_cg_links, cg, root_cgrp); |
1045 | |||
1046 | BUG_ON(list_empty(&tmp_cg_links)); | ||
1047 | link = list_entry(tmp_cg_links.next, | ||
1048 | struct cg_cgroup_link, | ||
1049 | cgrp_link_list); | ||
1050 | list_del(&link->cgrp_link_list); | ||
1051 | link->cg = cg; | ||
1052 | list_add(&link->cgrp_link_list, | ||
1053 | &root->top_cgroup.css_sets); | ||
1054 | list_add(&link->cg_link_list, &cg->cg_links); | ||
1055 | } | ||
1056 | } | 1048 | } |
1057 | write_unlock(&css_set_lock); | 1049 | write_unlock(&css_set_lock); |
1058 | 1050 | ||
1059 | free_cg_links(&tmp_cg_links); | 1051 | free_cg_links(&tmp_cg_links); |
1060 | 1052 | ||
1061 | BUG_ON(!list_empty(&cgrp->sibling)); | 1053 | BUG_ON(!list_empty(&root_cgrp->sibling)); |
1062 | BUG_ON(!list_empty(&cgrp->children)); | 1054 | BUG_ON(!list_empty(&root_cgrp->children)); |
1063 | BUG_ON(root->number_of_cgroups != 1); | 1055 | BUG_ON(root->number_of_cgroups != 1); |
1064 | 1056 | ||
1065 | cgroup_populate_dir(cgrp); | 1057 | cgroup_populate_dir(root_cgrp); |
1066 | mutex_unlock(&inode->i_mutex); | 1058 | mutex_unlock(&inode->i_mutex); |
1067 | mutex_unlock(&cgroup_mutex); | 1059 | mutex_unlock(&cgroup_mutex); |
1068 | } | 1060 | } |