diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cgroup.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index dcb06e181ce4..d5af128ec1ec 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -157,14 +157,13 @@ static int cgroup_root_count; | |||
157 | static DEFINE_IDR(cgroup_hierarchy_idr); | 157 | static DEFINE_IDR(cgroup_hierarchy_idr); |
158 | 158 | ||
159 | /* | 159 | /* |
160 | * Assign a monotonically increasing serial number to cgroups. It | 160 | * Assign a monotonically increasing serial number to csses. It guarantees |
161 | * guarantees cgroups with bigger numbers are newer than those with smaller | 161 | * cgroups with bigger numbers are newer than those with smaller numbers. |
162 | * numbers. Also, as cgroups are always appended to the parent's | 162 | * Also, as csses are always appended to the parent's ->children list, it |
163 | * ->children list, it guarantees that sibling cgroups are always sorted in | 163 | * guarantees that sibling csses are always sorted in the ascending serial |
164 | * the ascending serial number order on the list. Protected by | 164 | * number order on the list. Protected by cgroup_mutex. |
165 | * cgroup_mutex. | ||
166 | */ | 165 | */ |
167 | static u64 cgroup_serial_nr_next = 1; | 166 | static u64 css_serial_nr_next = 1; |
168 | 167 | ||
169 | /* This flag indicates whether tasks in the fork and exit paths should | 168 | /* This flag indicates whether tasks in the fork and exit paths should |
170 | * check for fork/exit handlers to call. This avoids us having to do | 169 | * check for fork/exit handlers to call. This avoids us having to do |
@@ -3133,7 +3132,7 @@ css_next_child(struct cgroup_subsys_state *pos_css, | |||
3133 | next = list_entry_rcu(pos->self.sibling.next, struct cgroup, self.sibling); | 3132 | next = list_entry_rcu(pos->self.sibling.next, struct cgroup, self.sibling); |
3134 | } else { | 3133 | } else { |
3135 | list_for_each_entry_rcu(next, &cgrp->self.children, self.sibling) | 3134 | list_for_each_entry_rcu(next, &cgrp->self.children, self.sibling) |
3136 | if (next->serial_nr > pos->serial_nr) | 3135 | if (next->self.serial_nr > pos->self.serial_nr) |
3137 | break; | 3136 | break; |
3138 | } | 3137 | } |
3139 | 3138 | ||
@@ -4168,6 +4167,8 @@ static void css_release(struct percpu_ref *ref) | |||
4168 | static void init_and_link_css(struct cgroup_subsys_state *css, | 4167 | static void init_and_link_css(struct cgroup_subsys_state *css, |
4169 | struct cgroup_subsys *ss, struct cgroup *cgrp) | 4168 | struct cgroup_subsys *ss, struct cgroup *cgrp) |
4170 | { | 4169 | { |
4170 | lockdep_assert_held(&cgroup_mutex); | ||
4171 | |||
4171 | cgroup_get(cgrp); | 4172 | cgroup_get(cgrp); |
4172 | 4173 | ||
4173 | memset(css, 0, sizeof(*css)); | 4174 | memset(css, 0, sizeof(*css)); |
@@ -4175,6 +4176,7 @@ static void init_and_link_css(struct cgroup_subsys_state *css, | |||
4175 | css->ss = ss; | 4176 | css->ss = ss; |
4176 | INIT_LIST_HEAD(&css->sibling); | 4177 | INIT_LIST_HEAD(&css->sibling); |
4177 | INIT_LIST_HEAD(&css->children); | 4178 | INIT_LIST_HEAD(&css->children); |
4179 | css->serial_nr = css_serial_nr_next++; | ||
4178 | 4180 | ||
4179 | if (cgroup_parent(cgrp)) { | 4181 | if (cgroup_parent(cgrp)) { |
4180 | css->parent = cgroup_css(cgroup_parent(cgrp), ss); | 4182 | css->parent = cgroup_css(cgroup_parent(cgrp), ss); |
@@ -4348,7 +4350,7 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, | |||
4348 | */ | 4350 | */ |
4349 | kernfs_get(kn); | 4351 | kernfs_get(kn); |
4350 | 4352 | ||
4351 | cgrp->serial_nr = cgroup_serial_nr_next++; | 4353 | cgrp->self.serial_nr = css_serial_nr_next++; |
4352 | 4354 | ||
4353 | /* allocation complete, commit to creation */ | 4355 | /* allocation complete, commit to creation */ |
4354 | list_add_tail_rcu(&cgrp->self.sibling, &cgroup_parent(cgrp)->self.children); | 4356 | list_add_tail_rcu(&cgrp->self.sibling, &cgroup_parent(cgrp)->self.children); |