Message ID | 20230421090403.15515-2-zhoufeng.zf@bytedance.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Introduce a new kfunc of bpf_task_under_cgroup | expand |
On Fri, Apr 21, 2023 at 05:04:02PM +0800, Feng zhou wrote: > From: Feng Zhou <zhoufeng.zf@bytedance.com> > > Add a kfunc that's similar to the bpf_current_task_under_cgroup. > The difference is that it is a designated task. > > When hook sched related functions, sometimes it is necessary to > specify a task instead of the current task. > > Signed-off-by: Feng Zhou <zhoufeng.zf@bytedance.com> > --- > kernel/bpf/helpers.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > index 00e5fb0682ac..88e3247b5c44 100644 > --- a/kernel/bpf/helpers.c > +++ b/kernel/bpf/helpers.c > @@ -2142,6 +2142,24 @@ __bpf_kfunc struct cgroup *bpf_cgroup_from_id(u64 cgid) > return NULL; > return cgrp; > } > + > +/** > + * bpf_task_under_cgroup - Check whether the task is a given subset of the > + * cgroup2 hierarchy. The cgroup2 to test is assigned by cgrp. That doesn't read right. > + * @cgrp: assigned cgrp. > + * @task: assigned task. This is also wrong. Please copy paste from task_under_cgroup_hierarchy. > + */ > +__bpf_kfunc int bpf_task_under_cgroup(struct cgroup *cgrp, > + struct task_struct *task) return type needs to be 'long'. 'int' might have issues. Also the args should be task, cgrp to match task_under_cgroup_hierarchy. > +{ > + if (unlikely(!cgrp)) > + return -EAGAIN; > + > + if (unlikely(!task)) > + return -ENOENT; Please do if (unlikely(!cgrp || !task)) return -EINVAL; > + > + return task_under_cgroup_hierarchy(task, cgrp); > +} > #endif /* CONFIG_CGROUPS */ > > /** > @@ -2341,6 +2359,7 @@ BTF_ID_FLAGS(func, bpf_cgroup_acquire, KF_ACQUIRE | KF_RCU | KF_RET_NULL) > BTF_ID_FLAGS(func, bpf_cgroup_release, KF_RELEASE) > BTF_ID_FLAGS(func, bpf_cgroup_ancestor, KF_ACQUIRE | KF_RCU | KF_RET_NULL) > BTF_ID_FLAGS(func, bpf_cgroup_from_id, KF_ACQUIRE | KF_RET_NULL) > +BTF_ID_FLAGS(func, bpf_task_under_cgroup, KF_RCU) > #endif > BTF_ID_FLAGS(func, bpf_task_from_pid, KF_ACQUIRE | KF_RET_NULL) > BTF_SET8_END(generic_btf_ids) > -- > 2.20.1 >
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 00e5fb0682ac..88e3247b5c44 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -2142,6 +2142,24 @@ __bpf_kfunc struct cgroup *bpf_cgroup_from_id(u64 cgid) return NULL; return cgrp; } + +/** + * bpf_task_under_cgroup - Check whether the task is a given subset of the + * cgroup2 hierarchy. The cgroup2 to test is assigned by cgrp. + * @cgrp: assigned cgrp. + * @task: assigned task. + */ +__bpf_kfunc int bpf_task_under_cgroup(struct cgroup *cgrp, + struct task_struct *task) +{ + if (unlikely(!cgrp)) + return -EAGAIN; + + if (unlikely(!task)) + return -ENOENT; + + return task_under_cgroup_hierarchy(task, cgrp); +} #endif /* CONFIG_CGROUPS */ /** @@ -2341,6 +2359,7 @@ BTF_ID_FLAGS(func, bpf_cgroup_acquire, KF_ACQUIRE | KF_RCU | KF_RET_NULL) BTF_ID_FLAGS(func, bpf_cgroup_release, KF_RELEASE) BTF_ID_FLAGS(func, bpf_cgroup_ancestor, KF_ACQUIRE | KF_RCU | KF_RET_NULL) BTF_ID_FLAGS(func, bpf_cgroup_from_id, KF_ACQUIRE | KF_RET_NULL) +BTF_ID_FLAGS(func, bpf_task_under_cgroup, KF_RCU) #endif BTF_ID_FLAGS(func, bpf_task_from_pid, KF_ACQUIRE | KF_RET_NULL) BTF_SET8_END(generic_btf_ids)