On Thu, May 4, 2023 at 11:08 PM Feng zhou <zhoufeng.zf@xxxxxxxxxxxxx> wrote: > <...> > --- > kernel/bpf/helpers.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > index bb6b4637ebf2..453cbd312366 100644 > --- a/kernel/bpf/helpers.c > +++ b/kernel/bpf/helpers.c > @@ -2149,6 +2149,25 @@ __bpf_kfunc struct cgroup *bpf_cgroup_from_id(u64 cgid) > return NULL; > return cgrp; > } > + > +/** > + * bpf_task_under_cgroup - wrap task_under_cgroup_hierarchy() as a kfunc, 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. > + */ > +__bpf_kfunc long bpf_task_under_cgroup(struct task_struct *task, > + struct cgroup *ancestor) > +{ > + if (unlikely(!ancestor || !task)) > + return -EINVAL; > + > + return task_under_cgroup_hierarchy(task, ancestor); > +} > #endif /* CONFIG_CGROUPS */ > I wonder in what situation a null 'task' or 'ancestor' can be passed. Please call out in the comment that the returned value can be a negative error, so that writing if(bpf_task_under_cgroup()) may cause surprising results. Hao