|
@@ -497,6 +497,23 @@ static inline bool cgroup_is_descendant(struct cgroup *cgrp,
|
|
|
return cgrp->ancestor_ids[ancestor->level] == ancestor->id;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * task_under_cgroup_hierarchy - test task's membership of cgroup ancestry
|
|
|
+ * @task: the task to be tested
|
|
|
+ * @ancestor: possible ancestor of @task's cgroup
|
|
|
+ *
|
|
|
+ * Tests whether @task's default cgroup hierarchy is a descendant of @ancestor.
|
|
|
+ * It follows all the same rules as cgroup_is_descendant, and only applies
|
|
|
+ * to the default hierarchy.
|
|
|
+ */
|
|
|
+static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
|
|
|
+ struct cgroup *ancestor)
|
|
|
+{
|
|
|
+ struct css_set *cset = task_css_set(task);
|
|
|
+
|
|
|
+ return cgroup_is_descendant(cset->dfl_cgrp, ancestor);
|
|
|
+}
|
|
|
+
|
|
|
/* no synchronization, the result can only be used as a hint */
|
|
|
static inline bool cgroup_is_populated(struct cgroup *cgrp)
|
|
|
{
|
|
@@ -557,6 +574,7 @@ static inline void pr_cont_cgroup_path(struct cgroup *cgrp)
|
|
|
#else /* !CONFIG_CGROUPS */
|
|
|
|
|
|
struct cgroup_subsys_state;
|
|
|
+struct cgroup;
|
|
|
|
|
|
static inline void css_put(struct cgroup_subsys_state *css) {}
|
|
|
static inline int cgroup_attach_task_all(struct task_struct *from,
|
|
@@ -574,6 +592,11 @@ static inline void cgroup_free(struct task_struct *p) {}
|
|
|
static inline int cgroup_init_early(void) { return 0; }
|
|
|
static inline int cgroup_init(void) { return 0; }
|
|
|
|
|
|
+static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
|
|
|
+ struct cgroup *ancestor)
|
|
|
+{
|
|
|
+ return true;
|
|
|
+}
|
|
|
#endif /* !CONFIG_CGROUPS */
|
|
|
|
|
|
/*
|