On Sun, Sep 03, 2023 at 02:27:56PM +0000, Yafang Shao wrote: > Currently, the function task_under_cgroup_hierarchy() allows us to > determine if a task resides exclusively within a cgroup2 hierarchy. > Nevertheless, given the continued prevalence of cgroup1, it's useful that > we make a minor adjustment to extend its functionality to cgroup1 as well. > Once this modification is implemented, we will have the ability to > effortlessly verify a task's cgroup membership within BPF programs. For > instance, we can easily check if a task belongs to a cgroup1 directory, > such as /sys/fs/cgroup/cpu,cpuacct/kubepods/burstable/ or > /sys/fs/cgroup/cpu,cpuacct/kubepods/besteffort/. > > Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> > --- > include/linux/cgroup.h | 24 +++++++++++++++++++++--- > 1 file changed, 21 insertions(+), 3 deletions(-) > > diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h > index b307013..5414a2c 100644 > --- a/include/linux/cgroup.h > +++ b/include/linux/cgroup.h > @@ -543,15 +543,33 @@ static inline struct cgroup *cgroup_ancestor(struct cgroup *cgrp, > * @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. > + * It follows all the same rules as cgroup_is_descendant. > */ > static inline bool task_under_cgroup_hierarchy(struct task_struct *task, > struct cgroup *ancestor) > { > struct css_set *cset = task_css_set(task); > + struct cgroup *cgrp; > + bool ret = false; > + int ssid; > + > + if (ancestor->root == &cgrp_dfl_root) > + return cgroup_is_descendant(cset->dfl_cgrp, ancestor); > + > + for (ssid = 0; ssid < CGROUP_SUBSYS_COUNT; ssid++) { > + if (!ancestor->subsys[ssid]) > + continue; This looks wrong. I believe cgroup_mutex should be held to iterate. Tejun ? > > - return cgroup_is_descendant(cset->dfl_cgrp, ancestor); > + cgrp = task_css(task, ssid)->cgroup; > + if (!cgrp) > + continue; > + > + if (!cgroup_is_descendant(cgrp, ancestor)) > + return false; > + if (!ret) > + ret = true; > + } > + return ret; > } > > /* no synchronization, the result can only be used as a hint */ > -- > 1.8.3.1 >