diff options
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r-- | kernel/cgroup.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index c01e8e8dfad0..0343d7ee6d62 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -4593,11 +4593,17 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss, bool early) | |||
4593 | /* We don't handle early failures gracefully */ | 4593 | /* We don't handle early failures gracefully */ |
4594 | BUG_ON(IS_ERR(css)); | 4594 | BUG_ON(IS_ERR(css)); |
4595 | init_and_link_css(css, ss, &cgrp_dfl_root.cgrp); | 4595 | init_and_link_css(css, ss, &cgrp_dfl_root.cgrp); |
4596 | |||
4597 | /* | ||
4598 | * Root csses are never destroyed and we can't initialize | ||
4599 | * percpu_ref during early init. Disable refcnting. | ||
4600 | */ | ||
4601 | css->flags |= CSS_NO_REF; | ||
4602 | |||
4596 | if (early) { | 4603 | if (early) { |
4597 | /* allocation can't be done safely during early init */ | 4604 | /* allocation can't be done safely during early init */ |
4598 | css->id = 1; | 4605 | css->id = 1; |
4599 | } else { | 4606 | } else { |
4600 | BUG_ON(percpu_ref_init(&css->refcnt, css_release)); | ||
4601 | css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL); | 4607 | css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL); |
4602 | BUG_ON(css->id < 0); | 4608 | BUG_ON(css->id < 0); |
4603 | } | 4609 | } |
@@ -4636,6 +4642,8 @@ int __init cgroup_init_early(void) | |||
4636 | int i; | 4642 | int i; |
4637 | 4643 | ||
4638 | init_cgroup_root(&cgrp_dfl_root, &opts); | 4644 | init_cgroup_root(&cgrp_dfl_root, &opts); |
4645 | cgrp_dfl_root.cgrp.self.flags |= CSS_NO_REF; | ||
4646 | |||
4639 | RCU_INIT_POINTER(init_task.cgroups, &init_css_set); | 4647 | RCU_INIT_POINTER(init_task.cgroups, &init_css_set); |
4640 | 4648 | ||
4641 | for_each_subsys(ss, i) { | 4649 | for_each_subsys(ss, i) { |
@@ -4684,7 +4692,6 @@ int __init cgroup_init(void) | |||
4684 | struct cgroup_subsys_state *css = | 4692 | struct cgroup_subsys_state *css = |
4685 | init_css_set.subsys[ss->id]; | 4693 | init_css_set.subsys[ss->id]; |
4686 | 4694 | ||
4687 | BUG_ON(percpu_ref_init(&css->refcnt, css_release)); | ||
4688 | css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, | 4695 | css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, |
4689 | GFP_KERNEL); | 4696 | GFP_KERNEL); |
4690 | BUG_ON(css->id < 0); | 4697 | BUG_ON(css->id < 0); |