|
@@ -4593,11 +4593,17 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss, bool early)
|
|
|
/* We don't handle early failures gracefully */
|
|
|
BUG_ON(IS_ERR(css));
|
|
|
init_and_link_css(css, ss, &cgrp_dfl_root.cgrp);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Root csses are never destroyed and we can't initialize
|
|
|
+ * percpu_ref during early init. Disable refcnting.
|
|
|
+ */
|
|
|
+ css->flags |= CSS_NO_REF;
|
|
|
+
|
|
|
if (early) {
|
|
|
/* allocation can't be done safely during early init */
|
|
|
css->id = 1;
|
|
|
} else {
|
|
|
- BUG_ON(percpu_ref_init(&css->refcnt, css_release));
|
|
|
css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL);
|
|
|
BUG_ON(css->id < 0);
|
|
|
}
|
|
@@ -4636,6 +4642,8 @@ int __init cgroup_init_early(void)
|
|
|
int i;
|
|
|
|
|
|
init_cgroup_root(&cgrp_dfl_root, &opts);
|
|
|
+ cgrp_dfl_root.cgrp.self.flags |= CSS_NO_REF;
|
|
|
+
|
|
|
RCU_INIT_POINTER(init_task.cgroups, &init_css_set);
|
|
|
|
|
|
for_each_subsys(ss, i) {
|
|
@@ -4684,7 +4692,6 @@ int __init cgroup_init(void)
|
|
|
struct cgroup_subsys_state *css =
|
|
|
init_css_set.subsys[ss->id];
|
|
|
|
|
|
- BUG_ON(percpu_ref_init(&css->refcnt, css_release));
|
|
|
css->id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2,
|
|
|
GFP_KERNEL);
|
|
|
BUG_ON(css->id < 0);
|