On Thu, Aug 18, 2022 at 04:27:25PM -0700, Stanislav Fomichev wrote: > +BPF_CALL_0(bpf_get_current_cgroup_id) > +{ > + struct cgroup *cgrp; > + u64 cgrp_id; > + > + rcu_read_lock(); > + cgrp = task_dfl_cgroup(current); > + cgrp_id = cgroup_id(cgrp); > + rcu_read_unlock(); > + > + return cgrp_id; > +} > + > +const struct bpf_func_proto bpf_get_current_cgroup_id_proto = { > + .func = bpf_get_current_cgroup_id, > + .gpl_only = false, > + .ret_type = RET_INTEGER, > +}; > + > +BPF_CALL_1(bpf_get_current_ancestor_cgroup_id, int, ancestor_level) > +{ > + struct cgroup *cgrp; > + struct cgroup *ancestor; > + u64 cgrp_id; > + > + rcu_read_lock(); > + cgrp = task_dfl_cgroup(current); > + ancestor = cgroup_ancestor(cgrp, ancestor_level); > + cgrp_id = ancestor ? cgroup_id(ancestor) : 0; > + rcu_read_unlock(); > + > + return cgrp_id; > +} > + > +const struct bpf_func_proto bpf_get_current_ancestor_cgroup_id_proto = { > + .func = bpf_get_current_ancestor_cgroup_id, > + .gpl_only = false, > + .ret_type = RET_INTEGER, > + .arg1_type = ARG_ANYTHING, > +}; The bpf_get_current_cgroup_id_proto and bpf_get_current_ancestor_cgroup_id_proto should stay at helpers.c. Otherwise, those non cgroup hooks will have issue (eg. bpf_trace.c) when CONFIG_CGROUP_BPF not set. May be in the future cgroup_current_func_proto() can be re-used for non cgroup hooks. > +#ifdef CONFIG_CGROUP_NET_CLASSID > +BPF_CALL_0(bpf_get_cgroup_classid_curr) > +{ > + return __task_get_classid(current); > +} > + > +const struct bpf_func_proto bpf_get_cgroup_classid_curr_proto = { > + .func = bpf_get_cgroup_classid_curr, > + .gpl_only = false, > + .ret_type = RET_INTEGER, > +}; > +#endif Same for this one. eg. sk_msg needs it. probably stay in filter.c as-is.