|
@@ -1860,6 +1860,7 @@ static void init_cgroup_housekeeping(struct cgroup *cgrp)
|
|
cgrp->dom_cgrp = cgrp;
|
|
cgrp->dom_cgrp = cgrp;
|
|
cgrp->max_descendants = INT_MAX;
|
|
cgrp->max_descendants = INT_MAX;
|
|
cgrp->max_depth = INT_MAX;
|
|
cgrp->max_depth = INT_MAX;
|
|
|
|
+ INIT_LIST_HEAD(&cgrp->rstat_css_list);
|
|
prev_cputime_init(&cgrp->prev_cputime);
|
|
prev_cputime_init(&cgrp->prev_cputime);
|
|
|
|
|
|
for_each_subsys(ss, ssid)
|
|
for_each_subsys(ss, ssid)
|
|
@@ -4621,6 +4622,11 @@ static void css_release_work_fn(struct work_struct *work)
|
|
|
|
|
|
if (ss) {
|
|
if (ss) {
|
|
/* css release path */
|
|
/* css release path */
|
|
|
|
+ if (!list_empty(&css->rstat_css_node)) {
|
|
|
|
+ cgroup_rstat_flush(cgrp);
|
|
|
|
+ list_del_rcu(&css->rstat_css_node);
|
|
|
|
+ }
|
|
|
|
+
|
|
cgroup_idr_replace(&ss->css_idr, NULL, css->id);
|
|
cgroup_idr_replace(&ss->css_idr, NULL, css->id);
|
|
if (ss->css_released)
|
|
if (ss->css_released)
|
|
ss->css_released(css);
|
|
ss->css_released(css);
|
|
@@ -4682,6 +4688,7 @@ static void init_and_link_css(struct cgroup_subsys_state *css,
|
|
css->id = -1;
|
|
css->id = -1;
|
|
INIT_LIST_HEAD(&css->sibling);
|
|
INIT_LIST_HEAD(&css->sibling);
|
|
INIT_LIST_HEAD(&css->children);
|
|
INIT_LIST_HEAD(&css->children);
|
|
|
|
+ INIT_LIST_HEAD(&css->rstat_css_node);
|
|
css->serial_nr = css_serial_nr_next++;
|
|
css->serial_nr = css_serial_nr_next++;
|
|
atomic_set(&css->online_cnt, 0);
|
|
atomic_set(&css->online_cnt, 0);
|
|
|
|
|
|
@@ -4690,6 +4697,9 @@ static void init_and_link_css(struct cgroup_subsys_state *css,
|
|
css_get(css->parent);
|
|
css_get(css->parent);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (cgroup_on_dfl(cgrp) && ss->css_rstat_flush)
|
|
|
|
+ list_add_rcu(&css->rstat_css_node, &cgrp->rstat_css_list);
|
|
|
|
+
|
|
BUG_ON(cgroup_css(cgrp, ss));
|
|
BUG_ON(cgroup_css(cgrp, ss));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4791,6 +4801,7 @@ static struct cgroup_subsys_state *css_create(struct cgroup *cgrp,
|
|
err_list_del:
|
|
err_list_del:
|
|
list_del_rcu(&css->sibling);
|
|
list_del_rcu(&css->sibling);
|
|
err_free_css:
|
|
err_free_css:
|
|
|
|
+ list_del_rcu(&css->rstat_css_node);
|
|
INIT_RCU_WORK(&css->destroy_rwork, css_free_rwork_fn);
|
|
INIT_RCU_WORK(&css->destroy_rwork, css_free_rwork_fn);
|
|
queue_rcu_work(cgroup_destroy_wq, &css->destroy_rwork);
|
|
queue_rcu_work(cgroup_destroy_wq, &css->destroy_rwork);
|
|
return ERR_PTR(err);
|
|
return ERR_PTR(err);
|