aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/cgroup-defs.h
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2015-11-20 15:55:52 -0500
committerTejun Heo <tj@kernel.org>2015-11-20 15:55:52 -0500
commitb11cfb5807e30333b36c02701382b820b7dcf0d5 (patch)
treeaaa95e1c7d936e722fd3d9f9cbf72fe1b0890787 /include/linux/cgroup-defs.h
parent8005c49d9aea74d382f474ce11afbbc7d7130bec (diff)
cgroup: record ancestor IDs and reimplement cgroup_is_descendant() using it
cgroup_is_descendant() currently walks up the hierarchy and compares each ancestor to the cgroup in question. While enough for cgroup core usages, this can't be used in hot paths to test cgroup membership. This patch adds cgroup->ancestor_ids[] which records the IDs of all ancestors including self and cgroup->level for the nesting level. This allows testing whether a given cgroup is a descendant of another in three finite steps - testing whether the two belong to the same hierarchy, whether the descendant candidate is at the same or a higher level than the ancestor and comparing the recorded ancestor_id at the matching level. cgroup_is_descendant() is accordingly reimplmented and made inline. Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'include/linux/cgroup-defs.h')
-rw-r--r--include/linux/cgroup-defs.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h
index 60d44b26276d..504d8591b6d3 100644
--- a/include/linux/cgroup-defs.h
+++ b/include/linux/cgroup-defs.h
@@ -235,6 +235,14 @@ struct cgroup {
235 int id; 235 int id;
236 236
237 /* 237 /*
238 * The depth this cgroup is at. The root is at depth zero and each
239 * step down the hierarchy increments the level. This along with
240 * ancestor_ids[] can determine whether a given cgroup is a
241 * descendant of another without traversing the hierarchy.
242 */
243 int level;
244
245 /*
238 * Each non-empty css_set associated with this cgroup contributes 246 * Each non-empty css_set associated with this cgroup contributes
239 * one to populated_cnt. All children with non-zero popuplated_cnt 247 * one to populated_cnt. All children with non-zero popuplated_cnt
240 * of their own contribute one. The count is zero iff there's no 248 * of their own contribute one. The count is zero iff there's no
@@ -289,6 +297,9 @@ struct cgroup {
289 297
290 /* used to schedule release agent */ 298 /* used to schedule release agent */
291 struct work_struct release_agent_work; 299 struct work_struct release_agent_work;
300
301 /* ids of the ancestors at each level including self */
302 int ancestor_ids[];
292}; 303};
293 304
294/* 305/*
@@ -308,6 +319,9 @@ struct cgroup_root {
308 /* The root cgroup. Root is destroyed on its release. */ 319 /* The root cgroup. Root is destroyed on its release. */
309 struct cgroup cgrp; 320 struct cgroup cgrp;
310 321
322 /* for cgrp->ancestor_ids[0] */
323 int cgrp_ancestor_id_storage;
324
311 /* Number of cgroups in the hierarchy, used only for /proc/cgroups */ 325 /* Number of cgroups in the hierarchy, used only for /proc/cgroups */
312 atomic_t nr_cgrps; 326 atomic_t nr_cgrps;
313 327