On Tue, Sep 12, 2023 at 4:24 AM Tejun Heo <tj@xxxxxxxxxx> wrote: > > On Sun, Sep 10, 2023 at 11:17:48AM +0800, Yafang Shao wrote: > > To acquire the cgroup_id, we can resort to open coding, as exemplified below: > > > > task = bpf_get_current_task_btf(); > > cgroups = task->cgroups; > > cgroup = cgroups->subsys[cpu_cgrp_id]->cgroup; > > key = cgroup->kn->id; > > You can't hardcode it to a specific controller tree like that. You either > stick with fd based interface or need also add something to identify the > specifc cgroup1 tree. As pointed out by Alexei, I think we can introduce some cgroup_id-based kfuncs which can work for both cgroup1 and cgroup2. Something as follows (untested), __bpf_kfunc u64 bpf_current_cgroup_id_from_subsys(int subsys) { struct cgroup *cgroup; cgroup = task_cgroup(current, subsys); if (!cgroup) return 0; return cgroup_id(cgroup); } __bpf_kfunc struct cgroup *bpf_cgroup_from_subsys_id(u64 cgid, int subsys) { struct cgroup_subsys_state *css = init_css_set.subsys[subsys]; struct cgroup *subsys_root = css->cgroup; // We should introduce a new helper cgroup_get_from_subsys_id() // in the cgroup subsystem. return cgroup_get_from_subsys_id(subsys_root, cgid); } And change task_under_cgroup_hierarchy() as follows, 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); + struct cgroup *cgrp; + bool ret = false; + + if (ancestor->root == &cgrp_dfl_root) + return cgroup_is_descendant(cset->dfl_cgrp, ancestor); + + cgroup_lock(); + spin_lock_irq(&css_set_lock); + cgrp = task_cgroup_from_root(task, ancestor->root); + if (cgrp && cgroup_is_descendant(cgrp, ancestor)) + ret = true; + spin_unlock_irq(&css_set_lock); + cgroup_unlock(); + return ret; } With the above changes, I think it can meet most use cases with BPF on cgroup1. What do you think ? -- Regards Yafang